2011-12-10 6 views
0

私はユーザーにファイルをダウンロードさせるPHPスクリプトを書いています。 1つの例外を除いてすべてうまくいく、ファイルが完全にダウンロードされていない 10 MBのmp3ファイルがダウンロードされているとしますが、5 MB後に停止し、ダウンロードが完了したと表示します。PHPで強制ダウンロードに関する問題

私のサイトのホストがgodaddy.com
され、コードが

<?php 
if(ini_get('zlib.output_compression')) { 
    ini_set('zlib.output_compression', 'Off'); 
} 

if (isset ($_REQUEST['file_name'])) { 
    $filename = basename($_REQUEST['file_name']); 
    $filesize = filesize("mp3gallery/".$_REQUEST['file_name']); 

    header("Pragma: public"); 
    header("Expires: 0"); 
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
    header("Cache-Control: private",false); 
    header("Content-length: $filesize"); 
    header("Content-Transfer-Encoding: binary"); 
    header('Content-type: audio/mpeg, audio/x-mpeg, audio/x-mpeg-3, audio/mpeg3'); 
    header('Content-Disposition: attachment; filename="'.$filename.'"'); 

    $read_file = "mp3gallery/".$_REQUEST['file_name']; 




    function readfile_chunked($filename,$retbytes=true) { 
     $chunksize = 1*(1024*1024); // how many bytes per chunk 
     $buffer = ''; 
     $cnt =0; 
     // $handle = fopen($filename, 'rb'); 
     $handle = fopen($filename, 'rb'); 
     if ($handle === false) { 
      return false; 
     } 
     while (!feof($handle)) { 
      $buffer = fread($handle, $chunksize); 
      echo $buffer; 
      ob_flush(); 
      flush(); 
      if ($retbytes) { 
       $cnt += strlen($buffer); 
      } 
     } 
      $status = fclose($handle); 
     if ($retbytes && $status) { 
      return $cnt; // return num. bytes delivered like readfile() does. 
     } 
     return $status; 

    } 
    readfile_chunked($read_file,true); 
} 
?> 

を下回っている問題は、スクリプトがタイムアウトすることはおそらくです.........

答えて

1

を助けてください。

あなたは何をすることができますか?

  • 変更の時間制限(おそらくない可能性、あなたのホスティング事業者があなたをさせませんので)
  • 後者に関して

スピードアップするものは:あなたがいない具体的な理由がありますちょうどfpassthruを使用しますか?私はそれがより良いパフォーマンスを期待しています。

0

これを試してみてください:

function download($data , $fName) { 
     header(sprintf('Expires: %s' , strftime('%a, %d %b %Y %H:%M:%S GMT' , strtotime('+1 year' , time())))); 
     header('Cache-Control: no-cache, must-revalidate'); 
     header('Pragma: public, no-cache'); 
     header(sprintf('Content-Disposition: attachment; filename="%s"' , $fName)); 
     header(sprintf('Content-Description: %s' , uniqid())); 
     if (is_file($data)) { 
       $filePath = sprintf('%s/%s' , $_SERVER[ 'DOCUMENT_ROOT' ] , $data); 
       if (file_exists($data)) { 
         if (version_compare(PHP_VERSION , '5.3.0' , '<')) 
           header(sprintf('Content-Type: %s' , mime_content_type($filePath))); 
         else 
           header(sprintf('Content-Type: %s' , finfo_file(finfo_open(FILEINFO_MIME_TYPE) , $filePath))); 
         header(sprintf('Content-Length: %d' , filesize($filePath))); 
         readfile($data); 
       } 
     } else { 
       echo $data; 
     } 
    } 
+1

あなたはOPはこれを試してみてください、私たちを追加したい場合があります。あなたのコードは何をより良くしますか? – middus

関連する問題