Загрузка файла php-файла по коду

Это касается загрузки файлов с помощью PHP

Моя версия php – 5.3.5, а apache – 2.2.17

Я пытаюсь загрузить файлы (pdf, jpg, tiff), которые я загрузил на свой сервер, и они загружаются с тем же размером и типом, но я не вижу их. Я предполагаю, что они не скопированы правильно. Но когда я открываю оригинальные загруженные, они работают отлично. Я видел почти все вопросы, которые появились, как было предложено, и никто из них не ответил на этот вопрос, но похоже, что это так , но все же не отвечает на мой вопрос.

скачать Я использую этот код

header("Content-type: application/force-download"); header('Content-Disposition: inline; filename="' . $dir . '"'); header("Content-Transfer-Encoding: Binary"); header("Cache-Control: no-store, no-cache, must-revalidate"); header("Cache-Control: post-check=0, pre-check=0", false); header("Pragma: no-cache"); header("Content-length: ".filesize($dir)); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename="' . $file . '"'); readfile("$dir"); 

где $dir="62756d616769636e63/646973736572746174/ehddggh/1.JPG" и $file="1.JPG"

может ли кто-нибудь дать мне подсказку о том, что я делаю неправильно, или дать мне лучшее решение для загрузки файлов?

Это пахнет тем, что вы получаете дополнительный (ложный) контент в ваших загруженных файлах.

Удостоверьтесь, что у вас нет заголовков, пробелов или чего-либо еще перед вашими открытыми тегами PHP в ваших файлах; также, что у вас нет конечных пробелов или любых других данных после закрытия PHP-тегов (если вы закрываете свои теги PHP).

Кроме того, немного очистите свой код: почему несколько заголовков Content-Type ? Почему несколько заголовков Content-Disposition ?

 readfile($dir); // without the quotes? 

Кроме того, убедитесь, что $ dir фактически существует

is_file($dir) или file_exists($dir)

Спасибо всем за ответы. Я вызывал загрузку как функцию в файле с другими функциями, поэтому в конце концов мне пришлось писать сценарий отдельно, помимо других файлов. Моя проблема заключалась в том, что мне было нужно, чтобы она была безопасной и только загружала файл, если он принадлежал пользователю, и пользователь вошел в систему, поэтому я отправляю все нужные мне данные, зашифрованные и внутри скрипта. Я использую ряд вещей для посмотрите, действительно ли владелец является зарегистрированным пользователем. Поэтому, если кто-то хочет знать, что это код, который я использовал и работает отлично.

 <?php session_start(); $a=$_GET['a']; $parts=explode("-",$a); $tres=$parts[0]; $nombre=$partes[1]; $dbcodletra=substr($tres,2); if($dbcod!=$_SESSION["username"])$boolt=0; if($ext==1) $extl=".jpg"; if($ext==2) $extl=".jpeg"; if($ext==3) $extl=".tif"; if($ext==4) $extl=".tiff"; if($ext==5) $extl=".pdf"; if($ext==6) $extl=".doc"; if($ext==7) $extl=".docx"; if($tipoproy==1) $dir="rute/".$dbcodletra."/".$nombre.$extl; if($tipoproy==2) $dir="rute/".$dbcodletra."/".$nombre.$extl; if($tipoproy==3) $dir="rute/".$dbcodletra."/".$nombre.$extl; if($tipoproy==4) $dir="rute/".$dbcodletra."/".$nombre.$extl; if (file_exists($dir) && $boolt) { header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename='.basename($dir)); 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($dir)); ob_clean(); flush(); readfile($dir); exit; }else echo "<meta http-equiv=\"Refresh\" content=\"0;url=misdocumentos.php\">"; ?> 

Оплачивая это на двухлетний вопрос …

У меня была аналогичная проблема с коррумпированными загрузками, которые невозможно было открыть (когда щелкнуть правой кнопкой мыши и сохранить – как работает отлично). Прочитав ответ Джона , я подумал, что он что-то придумал. Если вы посмотрите на документы для readfile (см. Ниже), вы увидите ob_clean (), flush () и выход в их примере. Все они минимизируют утечку лишних символов в ответе. Я просто скопировал их пример №1, и моя проблема была решена.

http://php.net/readfile

Ваши заголовки выглядят беспорядочными, попробуйте сделать это:

 header('Pragma: public'); header('Cache-Control: public, no-cache'); header('Content-Type: application/octet-stream'); header('Content-Length: ' . filesize($dir)); header('Content-Disposition: attachment; filename="' . basename($dir) . '"'); header('Content-Transfer-Encoding: binary'); readfile($dir);