經過簡單測試,下載大文件(>50M)時會出現,斷節問題,還有對中文名字的文件支持不好,甚至返回404,下載的文件打不開也許是因為沒有判斷是否讀取完,因為 fread不壹定能壹次性將壹個文件讀入內存,這樣服務器有壓力,服務器為了穩定可能對該內存區進行了優化,下面貼上我修改的代碼,寫的不好望指正,***同進步:
function?download($file_url,$new_name=''){$file_url=iconv('utf-8','gb2312',$file_url);?
//將編碼轉為支持中英文的gb2312編碼
if(!isset($file_url)||trim($file_url)==''){
return?'500';
}
if(!file_exists($file_url)){?//檢查文件是否存在
return?'404';
}
$file_name=basename($file_url);
$file_type=explode('.',$file_url);
$file_type=$file_type[count($file_type)-1];
$file_name=trim($new_name=='')?$file_name:urlencode($new_name).'.'.$file_type;
//輸入文件標簽
header("Content-type:?application/octet-stream");
header("Accept-Ranges:?bytes");
header("Accept-Length:?".filesize($file_url));
header("Content-Disposition:?attachment;?filename=".$file_name);
$file_type=fopen($file_url,'r');?//打開文件
//輸出文件內容
$file_size=filesize($file_url);//獲取文件大小
?$buffer=1024;//定義1KB的緩存空間
$file_count=0;?//計數器,計算發送了多少數據 while(!feof($file_type)?&&?($file_size>$file_count)){? //如果文件還沒讀到結尾,且還有數據沒有發送? $senddata=fread($file_type,$buffer); //讀取文件內容到緩存區 $file_count+=$senddata; echo?$senddata; }//echo?fread($file_type,filesize($file_url));
fclose($file_type);
}
//最主要的原因找到了,保存PHP源碼時要用UTF-8 無ROM格式編碼保存,否則每個文件頭部都會有? EF? BB? 這兩個字節