2011-07-17 3 views
0

AVI 파일을 다운로드하는 PHP 스크립트를 만들려고합니다. 파일이 내 서버에 있으며 사용자에게 보내고 싶습니다. 다음 스크립트를 만들었지 만 실행할 때 0KB의 큰 AVI 파일 만 가져옵니다.PHP 헤더 첨부 AVI 파일

누구든지 내가 뭘 잘못하고 있다고 말할 수 있습니까? 나는 파이어 폭스에서 LiveHTTPHeaders에서 무엇을 얻을

$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); 

은 (어떤 이유로 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

참고 : 키가 파일 확장명이고 값이 mime 유형 인 배열을 사용하십시오. 코드를 줄이고 편집하기가 더 쉽습니다 – hakre

+0

readfile()은 읽은 바이트 수를 반환합니다. 실제로 파일을 읽었는지 확인할 수 있습니까? 사용 권한 문제 일 수 있습니다. – sanmai

답변

2

에서 자신을 밖으로 사이트를 시도 할 수 있습니다 전에 readfile() :

header("Content-Length: " . filesize($file_path)); 
+0

방금 ​​@alex에 쓴 것처럼, 결과는 정확히'Content-Length'의 유무와 동일합니다. – simonbs

+0

방금 ​​Firefox에서 LiveHTTPHeaders를 사용하려했는데 어떤 이유로 인해'readfile()'을 사용할 때 Firefox가 페이지를 열지 않습니다. 그것과 LiveHTTPHeaders는'Content-Length'가 0이라고 말합니다. 원래 게시물을 확인하십시오. – simonbs

0

T est 그것, 나는 이것이 작동 할 것이라고 생각한다!

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