php教程下載jpg文件為空解決方法
jpg格式的文件,點擊在浏覽器中打開顯示為紅叉
代碼如下:
$filetype = "image/pjpeg";
header("content-type: {$filetype}");
header("expires: 0");
header("cache-control: must-revalidate, post-check=0,pre-check=0");
header("pragma: public");
$file_content = file_get_contents($filepath);
echo $file_content;
exit;
首先排查初始文件是否有問題
1、echo $filepath;
2、根據輸出的文件完整路徑,打開文件,沒有問題
排除原始文件的嫌疑
然後排查在文件讀取過程中是否存在問題
1、$filetype = "application/jpeg";
header("content-disposition: attachment; filename="{$headername}";");
將文件強制下載
下載下來發現文件大小與原始文件一致,但是打開後還是為空,可以確定在文件輸出的時候出現了問題
使用file_put_contents("d:aaa.jpg",file_get_contents($filepath)),將文件保存到服務器,保存的文件可以打開
這時我懷疑在文件輸出到客戶端的時候編碼出了問題
經過一段時間的折騰,終於把問題解決,代碼如下:
header("content-type: {$filetype}");
header("expires: 0");
header("cache-control: must-revalidate, post-check=0,pre-check=0");
header("pragma: public");
//此處增加編碼設定
header('content-transfer-encoding: binary');
//此處最重要,目的是要清空輸出的字節
ob_clean();
//此處等於下面被注射的兩行,可節省代碼
readfile($filepath);
//$file_content = file_get_contents($filepath);
//echo $file_content;
exit;
此處附ob_clean()的解釋:
clean (erase) the output buffer
我理解ob_clean()等於.net中的response.clear();