Это касается загрузки файлов с помощью 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, и моя проблема была решена.
Ваши заголовки выглядят беспорядочными, попробуйте сделать это:
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);