php中强制下载的问题

Posted

技术标签:

【中文标题】php中强制下载的问题【英文标题】:Issues with force download in php 【发布时间】:2011-12-10 17:30:18 【问题描述】:

我编写了一个 php 脚本来强制将文件下载给用户。一切都很好,除了一个例外,文件没有完全下载假设有一个 10 MB 的 mp3 文件下载,但它在 5 MB 后停止并显示下载完成。

我的网站主机是 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 是否有特定原因?我希望它有更好的性能。

【讨论】:

【参考方案2】:

试试这个:

  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;
         
  

【讨论】:

您可能想添加我们的 OP 应该试试这个。你的代码在哪些方面做得更好?

以上是关于php中强制下载的问题的主要内容,如果未能解决你的问题,请参考以下文章

PHP强制文件下载[重复]

PHP:为啥强制 mime 下载会添加 2 个额外的空行?

在智能手机和平板电脑中使用 header() 强制使用 php 下载图像

PHP强制下载.xlsx文件损坏

PHP强制下载.xlsx文件损坏

如何使用 PHP 在移动设备上强制下载音频 mp3