Я пытаюсь сделать скрипт PHP для загрузки AVI-файла. Файл находится на моем сервере, и я хочу отправить его пользователю. Я выполнил следующий скрипт, но когда я запустил его, я получу только большой файл AVI размером 0 КБ.
Может ли кто-нибудь сказать мне, что я делаю неправильно?
$file_path = "downloads/test.avi"; // Get filename $filename = explode("/", $file_path); $filename = $filename[count($filename)-1]; if(file_exists($file_path)) { $file_extension = strtolower(substr(strrchr($file_path, "."), 1)); // This will set the Content-Type to the appropriate setting for the file switch($file_extension) { case "pdf": $ctype = "application/pdf"; break; case "exe": $ctype = "application/octet-stream"; break; case "zip": $ctype = "application/zip"; break; case "doc": $ctype = "application/msword"; break; case "xls": $ctype = "application/vnd.ms-excel"; break; case "ppt": $ctype = "application/vnd.ms-powerpoint"; break; case "gif": $ctype = "image/gif"; break; case "png": $ctype = "image/png"; break; case "jpeg": $ctype = "image/jpg"; break; case "jpg": $ctype = "image/jpg"; break; case "mp3": $ctype = "audio/mpeg"; break; case "wav": $ctype = "audio/x-wav"; break; case "mpeg": $ctype = "video/mpeg"; break; case "mpg": $ctype = "video/mpeg"; break; case "mpe": $ctype = "video/mpeg"; break; case "mov": $ctype = "video/quicktime"; break; case "avi": $ctype = "video/x-msvideo"; break; case "src": $ctype = "plain/text"; break; default: $ctype = "application/force-download"; } $filesize = filesize($file_path); // Set content type header("Content-type: " . $ctype); // Download file header("Content-Disposition: attachment; filename=\"" . $filename . "\""); // Set size of file header("Content-Length: " . $filesize); readfile($file_path);
Это то, что я получаю от LiveHTTPHeaders в Firefox (почему-то Content-Length
равно нулю):
HTTP/1.1 200 OK Date: Sun, 17 Jul 2011 14:34:24 GMT Server: Apache/2.2.6 mod_auth_kerb/5.3 PHP/5.2.17 mod_fcgid/2.3.5 X-Powered-By: PHP/5.2.17 Expires: Thu, 19 Nov 1981 08:52:00 GMT Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Pragma: no-cache Content-Disposition: attachment; filename="test.avi" Content-Length: 0 Connection: close Content-Type: video/x-msvideo
Вы можете захотеть попробовать сайт самостоятельно по адресу http://snuzzer.dk/nas/client.php
Добавьте эту строку перед readfile()
:
header("Content-Length: " . filesize($file_path));
Испытайте это, я думаю, что это сработает!
header ( "Pragma: public" ); header ( "Expires: 0" ); header ( "Cache-Control: must-revalidate, post-check=0, pre-check=0" ); header ( "Content-Type: application/force-download" ); header ( "Content-Type: application/octet-stream" ); header ( "Content-Type: application/download" ); header ( "Content-Disposition: attachment; filename=\"" . $file_path . "\";" ); header ( "Content-Transfer-Encoding: binary " ); header ( "Content-type: " . $ctype); $chunksize = 1 * (1024 * 1024); // how many bytes per chunk if ($size > $chunksize) { $handle = fopen($file_path, 'rb'); $buffer = ''; while (!feof($handle)) { $buffer = fread($handle, $chunksize); echo $buffer; ob_flush(); flush(); } fclose($handle); exit();