【问题标题】:Getting a file to download instead of opening the browser获取文件下载而不是打开浏览器
【发布时间】:2013-05-15 06:18:06
【问题描述】:

我有一个用 php 构建的站点,我希望用户在单击链接时能够下载 .kml 文件,但它当前在浏览器中打开(类似 xml 的)文件。我尝试过调整 .htaccess 文件,但没有成功。

如何下​​载文件而不是在浏览器中打开?

【问题讨论】:

  • 你唯一能做的就是向浏览器“建议”响应内容是一个“文件”并且应该被这样对待。 (请记住,HTTP 没有“文件”的概念,只有标头和内容。)这是通过在响应中设置 content-disposition 标头来完成的:en.wikipedia.org/wiki/List_of_HTTP_header_fields
  • 如果您使用 php 强制下载目录中的文件,您可以将 php 从图片中删除,然后转到 .htaccess stackoverflow.com/questions/3977159/…

标签: php .htaccess download


【解决方案1】:

您可以尝试将这行代码添加到您的 .htaccess 文件中

<FilesMatch "\.(mp3|MP3)">
ForceType application/octet-stream
Header set Content-Disposition attachment
</FilesMatch>

对我来说很好用

【讨论】:

    【解决方案2】:

    为了强制浏览器下载文件,您必须将 HTTP 的 Content-Disposition 标头设置为 attachment。有一种简单的方法可以配置您的 HTTP 服务器以将此标头添加到所有 .kml 文件和一种仅限 PHP 的方法。

    1。配置 Apache 以添加 Content-Disposition 标头

    将以下内容放在您的 Apache 配置中或包含您的 .kml 文件的目录内的 .htaccess 文件中:

    <Files "*.kml">
        Header set Content-Disposition attachment
    </Files>
    

    您需要启用mod_headers 才能使其工作。

    2。使用 PHP 脚本作为代理将文件发送到浏览器

    Purpletoucan 提出的纯 PHP 解决方案是不让浏览器直接访问文件,而是使用 PHP 脚本通过线路发送文件。这样,您可以使用脚本控制 HTTP 标头:

    <?php
    header('Content-Disposition: attachment; filename="' . basename($path) . '"');
    readfile($path);
    ?>
    

    因此,我假设$path 是您服务器上文件的路径。如果您根据 URL 中给出的查询参数确定路径,则应始终检查是否给出了现有文件、是否允许用户下载它以及它是否位于正确的目录中。请注意,即使您为请求中指定的字符串加上目录前缀,它也可能包含 ../ 以访问其他目录中的文件。

    【讨论】:

    • 这是一个很棒的答案,而且效果很好。字面意思是 1 分钟修复。
    【解决方案3】:

    根据您的情况,有两种不同的方法。

    如果您的 KML 文件是静态的并且您在不使用 PHP 的情况下直接为它们提供服务,那么您应该考虑适当地配置 .htaccess 文件并确保您的网络服务器配置为观察 .htaccess 文件。

    如果您的 KML 文件是动态的或由 PHP 脚本代理,那么您需要提供正确的标头以强制下载。鼓励下载的标头是Content-Disposition:

    header("Content-Disposition: attachment; filename=\"$filename\"");
    

    在 PHP 中,任何 header 指令都应在任何其他内容(包括任何空格)之前提供。

    如果您发现您的服务器未配置为观察.htaccess 文件并且您无法对其进行适当配置,那么像这样的简单代理脚本将起作用:-

    <?php
    header("Content-Disposition: attachment; filename=\"myData.kml\"");
    include 'myData.kml';
    ?>
    

    ...替换相关文件名。您可以使用变量将其扩展为适用于多个 KML 文件,但为了安全起见,请确保您的脚本检查所有请求的文件是否有效,而不是盲目地“包含”任何请求的文件。

    【讨论】:

    • 这行代码去哪里了?我是否还需要 .htaccess 中的指令?
    • 嗨,Marty,我已经更详细地充实了我的回复,希望对您有所帮助...
    猜你喜欢
    • 2016-12-14
    • 2011-11-08
    • 2013-04-13
    • 1970-01-01
    • 2019-03-08
    • 1970-01-01
    • 2013-10-25
    • 2011-06-19
    • 1970-01-01
    相关资源
    最近更新 更多