Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache 如何提供下载文件?试图为用户提供文件以供查看/下载,但服务器响应的内容类型错误_Apache_Http_Browser_Http Headers_Webserver - Fatal编程技术网

Apache 如何提供下载文件?试图为用户提供文件以供查看/下载,但服务器响应的内容类型错误

Apache 如何提供下载文件?试图为用户提供文件以供查看/下载,但服务器响应的内容类型错误,apache,http,browser,http-headers,webserver,Apache,Http,Browser,Http Headers,Webserver,我在一个网站上有一个功能,用户登录后会显示可供下载的文件列表。当他点击该文件时,它应该显示一个下载对话框,如果为该文件类型安装了打开应用程序的选项(例如,如果安装了Acrobat Reader),或者如果没有安装,则提示下载。目前,我正在使用PHP创建列表,只是回显每个文件的路径。然后,当用户单击链接时,浏览器直接请求该文件。我的第一个问题是ppsx或pptx文件在浏览器中显示为纯文本文件,导致屏幕上出现垃圾。然后,我在要提供服务的文件所在的目录中添加了一个.htaccess文件,其中包含以下内

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

Options All -Indexes

Header set Content-Disposition attachment
使用该.htaccess文件时,会出现浏览器对话框,但是,例如,在Firefox中,它有一个选项“使用:记事本打开”,而不是该文件的正确应用程序,或者如果没有为该文件类型安装应用程序,则没有。我可以看到响应头的内容类型是“text/plain”,这是错误的,但是如何使服务器检测到正确的内容类型呢


非常感谢。

对于特定的文件类型,您需要使用正确的选项从浏览器获得相应的响应

Powerpoint是:

application/vnd.ms-powerpoint

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

好的,我放弃并重写了它的工作方式。在我的视图中,我打印控制器方法的路径,并使用文件id向其传递参数。控制器使用会话检查用户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;
}

它成功地使浏览器弹出一个下载对话框,如果安装了相关应用程序,还可以选择打开该对话框。

非常感谢您的回答。听起来像是这样,但问题是我不知道他们想要上传什么文件类型。它可以是PPSX、PDF、DOCX、TXT、ZIP等。我对Apache不是100%熟悉,但当给定一个通用MIME类型(如应用程序/八位字节流)时,浏览器将使用该文件类型,但您也可以为您将遇到的常见文件类型配置服务器。