readfile バイナリ (画像) ファイル ヘッダーには追加のビット (0x0A) が含まれます。
皆さん、こんにちは。私たちのプロジェクトはかなり厄介な問題に遭遇しました。 readfile を使用して画像ファイルをダウンロードする場合、ファイルの先頭に以前より 1 桁 (0x0A) が追加されます。UEdit を使用してファイルの先頭の 16 進数を削除すると、ファイルを正しく読み取ることができます。
ソースコードは次のとおりです:
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --> <?php $file = 'test_img.bmp'; if (file_exists($file)) { header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename='.basename($file)); header('Content-Transfer-Encoding: binary'); header('Expires: 0'); header('Cache-Control: must-revalidate'); header('Pragma: public'); header('Content-Length: ' . filesize($file)); ob_clean(); flush(); readfile($file); exit; } ?>
//段落を与えます //$mime、ファイルタイプ //$filename、言うまでもなく //$data は出力したいファイルデータです。file_get_contents を使用して取得してください。 if (strpos($_SERVER['HTTP_USER_AGENT'], "MSIE") !== FALSE) { header('Content-Type: "'.$mime.'"'); header('Content-Disposition:attachment; filename="'.$filename.'"'); header('有効期限: 0'); header('キャッシュ制御: 必須再検証、事後チェック = 0、事前チェック = 0'); header("コンテンツ転送エンコーディング: バイナリ"); header('プラグマ: public'); header("Content-Length: ".strlen($data)); } それ以外 { header('Content-Type: "'.$mime.'"'); header('Content-Disposition:attachment; filename="'.$filename.'"'); header("コンテンツ転送エンコーディング: バイナリ"); header('有効期限: 0'); header('プラグマ: キャッシュなし'); header("Content-Length: ".strlen($data)); } 終了($data); <br><font color="#e78608">------解決策------------------</font><br> コードをテストしたところ、指摘された問題は発生しませんでした。 <br><br> ob_clean();<br> flash();<br><br>これら 2 つの文を削除して見てください。 <br><font color="#e78608">------解決策------------------</font><br> このコード行の前に、文字が出力されているかどうかを確認してください。 ? <br><font color="#e78608">------解決策------------------</font><br> 余分な改行文字を追加してください、、、投稿されたコードは本番環境のコードではありませんよね? <br><font color="#e78608">------解決策------------------</font><br> ソース コードは次のとおりです。 <br><br>[code=PHP]<br><br><?php<br>$file = 'test_img.bmp';<br><br>明らかに、< ?php の前に空行があります<br>さらに悪いことに、BOM ヘッダーさえ避けていないことです<div class="clear"></div>