1、php下載原理圖
2、檔案下載源碼:
<?php
$file_name="哈哈.jpg";//需要下載的檔案
$file_name=iconv("utf-8","gb2312","$file_name");
$fp=fopen($file_name,"r+");//下載檔案必須先要將檔案開啟,寫入記憶體
if(!file_exists($file_name)){//判斷檔案是否存在
echo "檔案不存在";
exit();
}
$file_size=filesize("a.jpg");//判斷檔案大小
//返回的檔案
Header("Content-type: application/octet-stream");
//按照位元組格式返回
Header("Accept-Ranges: bytes");
//返迴文件大小
Header("Accept-Length: ".$file_size);
//彈出用戶端對話方塊,對應的檔案名稱
Header("Content-Disposition: attachment; filename=".$file_name);
//防止伺服器瞬時壓力增大,分段讀取
$buffer=1024;
while(!feof($fp)){
$file_data=fread($fp,$buffer);
echo $file_data;
}
//關閉檔案
fclose($fp);
?>
3、檔案編碼問題解決方案:
如果檔案名稱是中文,php的函數不能識別中文檔案名稱,一般如果程式編碼為utf-8,php的函數比較古老,只能識別gb2312編碼的中文,所以把中文用iconv(“原編碼”,”要轉成的編碼”,”要轉碼的字串”)函數可以轉碼。
比如,把一個字串從utf-8轉碼為gb2312
$file_name=iconv(“utf-8”,”gb2312”,”$file_name”);
PHP下載遠程檔案原理
/**
* PHP下載遠程檔案到本地原理:通過PHP函數,先讀取遠程檔案,然後在本地建立一個新的空檔案,
* 然後將已讀取的遠程檔案的內容寫入到新建立的檔案當中,這樣就可以達到遠程檔案下載功能
* @author JackyLi
*
*/
class DownloadFile {
/**
* @param string $file 遠程需要下載的檔案
*/
public static function get_img_file($file) {
$targetDir = sys_get_temp_dir () . DIRECTORY_SEPARATOR . "plupload" . DIRECTORY_SEPARATOR;
if (! file_exists ( $targetDir )) { //檢測臨時下載目錄是否存在,不存在,則建立一個
@mkdir ( $targetDir );
}
if (! $file) {
return false;
}
$ext = strrchr ( $file, "." ); //取副檔名
$filename = $targetDir . '/' . basename ( $file, $ext ) . date ( "YmdHis" ) . $ext; //需要儲存的檔案名稱(帶完整路徑)
ob_start (); //開啟output buffering
readfile ( $file ); //將檔案讀取buffering中
$img = ob_get_contents (); //將buffering中的資料儲存到變數當中,方便後續操作
ob_end_clean (); //關閉output buffering
$fp2 = @fopen ( $filename, "a" ); //開啟目標檔案(馬上被寫入資料的檔案)
fwrite ( $fp2, $img ); //寫入資料到檔案當中
fclose ( $fp2 ); //關閉檔案控制代碼
//上面讀取檔案內容,可以直接用下面兩行代替
// $file = file_get_contents($file);
// file_put_contents($filename,$file);
return true;
}
}
$download = new DownloadFile ();
$download->get_img_file ( 'http://news.sina.com.cn/c/2011-09-16/021323162600.shtml' );