У меня возникла проблема с загрузкой файлов .jpg и .avi с сервера с использованием PHP. У меня есть следующий код:
$fileName = "Koala.jpg"; $filePath = "./Koala.jpg"; if (!file_exists($filePath)){ echo "No file"; return; } $fp = fopen($filePath, "r"); $fileSize = filesize($filePath); header("Content-type: application/octet-stream"); header("Accept-Ranges: bytes"); header("Content-Length: $fileSize"); header("Content-Disposition: attachment;filename=".$fileName); $buffer = 1024; while(!feof($fp)){ $data = fread($fp, $fileSize); echo $data; } fclose($fp);
Код загружает файл .txt успешно, и загруженный файл можно прочитать. Однако, когда дело доходит до .jpg, загруженный файл .jpg не может быть прочитан. Может ли кто-нибудь помочь? благодаря
Просто попробовал другой метод, и он отлично работает
$file = 'Koala.jpg'; if (file_exists($file)) { header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename='.basename($file)); header('Content-Transfer-Encoding: binary'); header('Expires: 0'); header('Cache-Control: must-revalidate'); header('Pragma: public'); header('Content-Length: ' . filesize($file)); ob_clean(); flush(); readfile($file); exit; }
Но просто задайтесь вопросом, почему причина приводит к отказу первого метода, хотя вместо этого используется fopen («xxx», «rb»). спасибо
Попробуйте заменить приложение / октет-поток для изображения / jpeg.
С уважением
Я не эксперт по php (к сожалению), но я помню, что у меня была аналогичная проблема при использовании php на сервере Windows. Это было связано с открытием файла без бинарного флага (должно быть fopen($filePath, "rb");
в вашем примере). Если вы не установите этот флаг, ваши данные могут быть изменены, если вы прочитаете его из потока, который может сломать ваши файлы (и вы не заметите его на текстовых файлах).
См. http://www.php.net/manual/en/function.fopen.php для получения дополнительной информации о различных доступных режимах.
Попробуйте использовать это –
<?php $filename = "MyImage.jpg"; $handle = fopen($filename, "rb"); $contents = fread($handle, filesize($filename)); fclose($handle); ?>
Вместо следующего кода, который вы используете,
$buffer = 1024; while(!feof($fp)){ $data = fread($fp, $fileSize); echo $data; }
в$buffer = 1024; while(!feof($fp)){ $data = fread($fp, $fileSize); echo $data; }
Просто используйте метод readfile
readfile($filePath);