Загрузка файла PHP дает мусор для всего, НО файлы .pdf - PullRequest
0 голосов
/ 04 июня 2011

У меня проблема с тем, что единственный тип файла, который можно правильно загрузить с сервера, - это ".pdf". Другие файлы других типов находятся в том же месте, отлично загружаются, имеют правильные права доступа и прекрасно загружаются, когда я выкидываю их на свой локальный компьютер. Я не могу показать весь задействованный код, поскольку это платное программное обеспечение, но, честно говоря, похоже, что проблема не должна заключаться даже в самом коде ...

Я попытался переписать первую функцию, описанную ниже, с чем-то похожим на это: http://www.finalwebsites.com/forums/topic/php-file-download и затем просто задал правильные значения, чтобы он выбирал конкретные файлы с сервера. Файлы загружаются одинаково в любом случае. Они будут отображаться как правильный тип файла с правильным именем и даже правильным размером, но они не будут открываться как что-либо, кроме значений мусора (кроме PDF). Это сервер Apache, работающий с FreeBSD 8.2-RELEASE.

В любом случае, это часть класса, включенного в код, следующий за ним:

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 ]

1 голос
/ 04 июня 2011

Какие типы других файлов?Предполагается, что они обслуживаются как потоки октетов, как вы делаете?точно, этот ответ) не может быть гарантировано.

0 голосов
/ 22 октября 2011

Убедитесь, что в вашем загружаемом файле нет пустых строк или чего-либо, кроме PHP, так как по умолчанию для mimetype будет задано значение Content-type: text/html и добавлены дополнительные данные для мусора в загружаемый файл.

0 голосов
/ 04 июня 2011

Возможно, другие файлы не относятся к типу application / octet-stream?

Убедитесь, что вы отправили правильный заголовок mime-type.

...