2010-11-23 118 views
1

我在用户登录的网站上显示功能,然后显示可供下载的文件列表。当他点击该文件时,如果为该文件类型安装了一个文件类型(例如安装了Acrobat Reader的文件类型),则应该显示一个下载对话框,其中包含与该应用程序一起打开的选项,如果没有,则提示下载。目前,我使用PHP构建列表,只是回显每个文件的路径。然后,当用户点击该链接时,浏览器直接请求该文件。我的第一个问题是,ppsx或pptx文件在浏览器中显示为纯文本文件,导致屏幕上出现垃圾信息。然后我说在哪里要服务的文件目录中的.htaccess文件,与此内容:如何提供文件下载?试图提供文件供用户查看/下载,但服务器响应错误内容类型

Options All -Indexes 

Header set Content-Disposition attachment 

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

非常感谢。

回答

0

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

简报是:

application/vnd.ms-powerpoint 

可以修改你的.htaccess文件更新的MIME类型上this site,如图所示。

+0

非常感谢您的回答。听起来像它靠近这种方式,但事情是我不知道他们想上传什么文件类型。它可以是PPSX,PDF,DOCX,TXT,ZIP等。 – 2010-11-23 21:46:12

0

好吧,我放弃了它,并重新编写它的工作原理。在我的看法中,我打印了一个控制器方法的路径,并用文件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; 
} 

它successfuly使浏览器弹出一个下载对话框还赠送与打开它的选项如果安装了相关的应用程序。