У меня есть код, который хорошо работает на многих серверах. Он используется для загрузки файла через функцию php readfile.
Но на одном конкретном сервере он не работает для файлов размером более 25 МБ.
Вот код:
$sysfile = '/var/www/html/myfile'; if(file_exists($sysfile)) { header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename="mytitle"'); 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($sysfile)); ob_clean(); flush(); readfile($sysfile); exit();
Когда я пытаюсь загрузить файл ниже 25mb, нет проблем, когда файл больше, загруженный файл составляет 0 байт.
Я попытался с функцией read () и file_get_contents, но проблема все еще присутствует.
Моя версия php – 5.5.3, ограничение памяти – 80 МБ. Сообщение об ошибках включено, но в файле журнала отсутствует ошибка.
У меня такая же проблема в последнее время. Я экспериментировал с разными заголовками и другими. Решение, которое работает для меня.
header("Content-Disposition: attachment; filename=export.zip"); header("Content-Length: " . filesize($file)); ob_clean(); ob_end_flush(); readfile($file);
Поэтому попробуйте изменить flush на ob_end_flush .
Вот полное решение благодаря ответу witzawitz:
Мне нужно было использовать ob_end_flush () и fread ();
<?php $sysfile = '/var/www/html/myfile'; if(file_exists($sysfile)) { header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename="mytitle"'); 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($sysfile)); ob_clean(); ob_end_flush(); $handle = fopen($sysfile, "rb"); while (!feof($handle)) { echo fread($handle, 1000); } } ?>