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