php文件下載原理

ccpp 9年前發布 | 19K 次閱讀 PHP PHP開發


    $filename="1.jpg";
/ 如果文件名是中文加上這一句,否則找不到文件 $filename = iconv("utf-8","gb2312",$filename); /
header("Content-type:image/jpg"); //告訴瀏覽器要接受的數據類型
//header("Content-type:application/octet-stream"); 二進制傳送
header('Content-Disposition:attachment:filename="down.jpg'); //彈出下載框時標明的下載的文件的名稱
header("Content-Length:".filename($filename)); //告訴瀏覽器接受的文件大小

$fp=fopen($filenmae,"r");  

while(!feof($fp)){  
    echo fread($fp,1024); //此時輸出的數據不會輸出到瀏覽器頁面,而會直接保存到內存  
}  
fclose($fp);  

// readfile($filename); 快捷讀取文件  </pre><br />

現在的瀏覽器能顯示的文件格式很多,比如圖片,網頁文件,文本,還有很多,如果是瀏覽器能夠識別的類型,那么瀏覽器默認輸出顯示到頁面,如果

是瀏覽器不認識的類型,那么默認會彈出下載框提示下載,如果你希望你的數據需要保存而不是直接在瀏覽器上顯示,那么你就要特別聲明,

怎么聲明了呢?

這屬于http協議的內容,利用php的header函數改變默認的http協議,直接在headr函數里寫http協議字符串即可,

為什么header函數要寫在任何html內容的最前面?這也是http協議的相關內容,簡單解釋一下

HTTP協議包含消息頭和消息體(傳送的內容),既然要使用http協議那么我們就必須滿足http協議的規則,消息頭必須需在消息體之前,這樣瀏覽器才能夠正確

解析,這也就是header函數之前不能有任何的輸出的與原因,


消息頭中是規則,消息體是內容,上面代碼中的幾條header函數就是告訴這次傳送的規則,

剛開始我在懷疑下面這行代碼可不可以不要,(當時不知道HTTP協議的規則)

    header("Content-Length:".filename($filename));  

如果你使用抓包工具試一下就會看到每一次接受的服務器的響應中都會有接受文件的大小,默認都有的,其實瀏覽器并不是我們想的那么智能,

他并不知道接受的數據有多大,需要告訴它應該接受多少,否則會出現數據丟失或多出垃圾信息,這不是本篇文章的主要內容,了解相關內容可通過谷歌搜索

 本文由用戶 ccpp 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!