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中强制下载的问题的主要内容,如果未能解决你的问题,请参考以下文章