我在用户登录的网站上有一个功能,然后显示可供下载的文件列表。当他点击该文件时,它应显示一个下载对话框,其中包含为应用程序打开的选项(如果已为文件类型安装了一个(例如,如果安装了Acrobat Reader),或者如果不安装则提示下载。目前,我正在使用PHP构建列表,只是回显每个文件的路径。然后,当用户点击链接时,浏览器直接请求该文件。我的第一个问题是ppsx或pptx文件在浏览器中显示为纯文本文件,导致屏幕上出现垃圾。然后我在要提供的文件所在的目录中添加了一个.htaccess文件,其中包含以下内容:
Options All -Indexes
Header set Content-Disposition attachment
使用该.htaccess文件,会出现浏览器对话框,但是,例如,在Firefox中,它有“打开方式:记事本”选项,而不是正确的文件应用程序,如果没有安装应用程序则没有对于文件类型。我可以看到响应标题Content-Type是“text / plain”,这是错误的,但是如何让服务器检测到正确的Content-Type?
非常感谢。
答案 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;
}
它成功地使浏览器弹出一个下载对话框,同时提供了相关应用程序打开它的选项(如果已安装)。