PHP заголовок прикрепить AVI-файл - PullRequest
0 голосов
/ 17 июля 2011

Я пытаюсь сделать 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

Ответы [ 2 ]

2 голосов
/ 17 июля 2011

Добавьте эту строку перед readfile():

 header("Content-Length: " . filesize($file_path));
0 голосов
/ 17 июля 2011

Проверьте это, я думаю, это будет работать!

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();
...