如何提供下载文件?尝试为用户提供查看/下载文件,但服务器响应错误的Content-Type

时间:2010-11-23 21:34:03

标签: apache http browser http-headers webserver

我在用户登录的网站上有一个功能,然后显示可供下载的文件列表。当他点击该文件时,它应显示一个下载对话框,其中包含为应用程序打开的选项(如果已为文件类型安装了一个(例如,如果安装了Acrobat Reader),或者如果不安装则提示下载。目前,我正在使用PHP构建列表,只是回显每个文件的路径。然后,当用户点击链接时,浏览器直接请求该文件。我的第一个问题是ppsx或pptx文件在浏览器中显示为纯文本文件,导致屏幕上出现垃圾。然后我在要提供的文件所在的目录中添加了一个.htaccess文件,其中包含以下内容:

Options All -Indexes

Header set Content-Disposition attachment

使用该.htaccess文件,会出现浏览器对话框,但是,例如,在Firefox中,它有“打开方式:记事本”选项,而不是正确的文件应用程序,如果没有安装应用程序则没有对于文件类型。我可以看到响应标题Content-Type是“text / plain”,这是错误的,但是如何让服务器检测到正确的Content-Type?

非常感谢。

2 个答案:

答案 0 :(得分:0)

您需要使用正确的MIME Content-Type从浏览器获取特定文件类型的相应响应。

Powerpoint是:

application/vnd.ms-powerpoint

您可以修改.htaccess文件以获取更新的MIME类型,如this site所示。

答案 1 :(得分:0)

好的,我放弃了并重新改写了它是如何工作的。在我的视图中,我打印到控制器方法的路径,并使用文件ID将参数传递给它。控制器使用会话检查用户标识,在数据库中查找文件,然后是以下代码:

if (file_exists($file['path'])) {
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename='.$file['name']);
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file['path']));
    ob_clean();
    flush();
    readfile($file['path']);
    exit;
}

它成功地使浏览器弹出一个下载对话框,同时提供了相关应用程序打开它的选项(如果已安装)。