Я пытаюсь получить ссылку для загрузки файлов без перенаправления или использования другого файла для загрузки больших ZIP-файлов.Загрузка php не удалась на больших файлах
Он отлично работает для файлов под ~ 100mb, но что-то большее и отправляется на страницу с ошибкой в хроме, которая гласит: Error code: ERR_INVALID_RESPONSE
.
$ file и $ path помещаются в форму с jQuery, а затем вызывается $('form').submit();
.
function downloadFile($file, $path){
set_time_limit(0);
$fullPath = $path . $file;
if ($fd = fopen ($fullPath, "r")) {
$fsize = filesize($fullPath);
$path_parts = pathinfo($fullPath);
$ext = strtolower($path_parts["extension"]);
switch ($ext) {
case "pdf":
header("Content-type: application/pdf"); // add here more headers for diff. extensions
header("Content-Disposition: attachment; filename=\"".$path_parts["basename"]."\""); // use 'attachment' to force a download
break;
default;
header("Content-type: application/octet-stream");
header("Content-Disposition: filename=\"".$path_parts["basename"]."\"");
}
header("Content-length: $fsize");
header("Cache-control: private"); //use this to open files directly
while(!feof($fd)) {
$buffer = fread($fd, 2048);
echo $buffer;
}
}
fclose ($fd);
exit;
}
Любые идеи, почему это не удается в больших файлах?
Update: Когда я использую следующий код, он загружает файл, но готовый файл не открывается, как он поврежден по какой-то причине:
set_time_limit(0);
ini_set('memory_limit', '1024M');
// http headers for downloads
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: public");
header("Content-Description: File Transfer");
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"".$filename."\"");
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".$file_size);
ob_end_flush();
@readfile($fileinfo['path']);
Когда я использую этот код, он только загружает первый 49.7kb то говорит, что это закончено, я даже пытался ob_flush()
и flush()
вместе:
// http headers for downloads
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: public");
header("Content-Description: File Transfer");
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"".$filename."\"");
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".filesize($fileinfo['path']));
if ($fd = fopen ($fileinfo['path'], "r")) {
set_time_limit(0);
ini_set('memory_limit', '1024M');
while(!feof($fd)) {
echo fread($fd, 4096);
flush();
}
}
Проверьте, что максимальное ограничение по размеру загрузки находится в вашем файле 'php.ini'. –
Не уверен, что это проблема, пожалуйста, посмотрите мои обновления. – David