PHP文件下载为任何BUT .pdf文件提供垃圾

时间:2011-06-03 20:22:37

标签: php apache freebsd

我遇到的问题是,能够从服务器正确下载的唯一文件类型是“.pdf”。其他文件类型的其他文件存在于同一位置,上传完全正常,具有正确的权限,并且当我将它们连接到我的本地计算机时加载就好了。我无法显示所涉及的全部代码,因为这是付费软件,但老实说似乎问题甚至不应该在代码本身......

我尝试使用与此类似的东西重新编写下面的第一个函数:http://www.finalwebsites.com/forums/topic/php-file-download然后只需输入正确的值,以便从服务器中选择特定的文件。文件以相同的方式下载。它们将显示为具有正确名称甚至正确大小的正确文件类型,但它们不会像垃圾值一样打开(除非是PDF)。它是一个运行freeBSD 8.2-RELEASE的apache服务器。

无论哪种方式,这都是其后面的代码所包含的类的一部分:

1600     function download_file($fileDir,$fileName,$instance_name)
1601     {
1602         $fileString=$fileDir.'/'.$fileName; // combine the path and file
1603         // translate file name properly for Internet Explorer.
1604     if (strstr($_SERVER['HTTP_USER_AGENT'], "MSIE"))
1605     {
1606           $instance_name = preg_replace('/\./', '%2e', $instance_name,  substr_count($instance_name, '.') - 1);
1607     }
1608     // make sure the file exists before sending headers
1609 
1610     if(!$fdl=@fopen($fileString,'r'))
1611         {
1612            die("Cannot Open File!");
1613         }
1614     else
1615         {
1616           header("Cache-Control: ");// leave blank to avoid IE errors
1617           header("Pragma: ");// leave blank to avoid IE errors
1618           header("Content-type: application/octet-stream");
1619           header("Content-Disposition: attachment; filename=\"".$instance_name."\"");
1620           header("Content-length:".(string)(filesize($fileString)));
1621           sleep(1);
1622           fpassthru($fdl);
1623         }
1624     }

现在使用它的代码:

63         function download_att($supp_obj,$a_predefined) 64         {
65 
66             $get_vars=$a_predefined['get'];
67             $att_id=$get_vars['att_id'];
68             $article_attachment=$supp_obj->prefix_table("article_attachment");
69             $sql="select * from $article_attachment where att_id=$att_id";
70             $a_attach=$supp_obj->get_a_line($sql);
71 
72             $instance_name=$a_attach['attachment_name'];
73             $att_name_arr=split("\.",$instance_name);
74
75             list($n,$ext)=split("\.", $instance_name);
76
77
78             $fileName="kb_".$a_attach['article_id']."_".$att_id.".".$ext;
79             $fileDir="plugins/knowledgebase/attachments";
80             $supp_obj->download_file($fileDir,$fileName,$instance_name);
81         }
82 //----------------------------------------------------------------------------------------------------------------------
83 
84     if($a_predefined['get']['act']=="artattach")
85     {
86         download_att($supp_obj,$a_predefined);
87         exit;
88     }

3 个答案:

答案 0 :(得分:1)

其他文件是什么类型的?它们应该像你一样被用作八位字节流吗?:

header("Content-type: application/octet-stream");

例如,如果您使用该标题提供文本文件,则可能无法保证浏览器如何解释该文件(或更准确地说,该响应)。

答案 1 :(得分:0)

其他文件可能不是application / octet-stream类型的吗?

确保发送正确的mime-type标头。

答案 2 :(得分:0)

确保下载文件中没有空白行或除了PHP之外的任何内容,因为这会将mimetype默认为Content-type: text/html并将额外的垃圾数据添加到您下载的文件中。