ホームページ  >  記事  >  バックエンド開発  >  readfile バイナリ (画像) ファイル ヘッダーには 1 つの余分なビット (0x0A) が含まれます。

readfile バイナリ (画像) ファイル ヘッダーには 1 つの余分なビット (0x0A) が含まれます。

WBOY
WBOYオリジナル
2016-06-13 13:46:56950ブラウズ

readfile バイナリ (画像) ファイル ヘッダーには追加のビット (0x0A) が含まれます。
皆さん、こんにちは。私たちのプロジェクトはかなり厄介な問題に遭遇しました。 readfile を使用して画像ファイルをダウンロードする場合、ファイルの先頭に以前より 1 桁 (0x0A) が追加されます。UEdit を使用してファイルの先頭の 16 進数を削除すると、ファイルを正しく読み取ることができます。

ソースコードは次のとおりです:

PHP コード
<!--

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;
}
?>






ダウンロードしたファイルは次のように元のファイルと比較されます:


以前のサーバーではコードの実行に問題はありませんでしたが、プロジェクトのオペレーティング サポート環境が変更されたとき (オペレーティング システム/Apache/php のバージョンが異なる場合があります)、すべてのコードをチェックしました。ドキュメントはオンラインにありません。この問題の解決を手伝ってください。よろしくお願いします。

有効な解決策があれば、さらに 200 ポイントが与えられます。



-----解決策---------
PHP コード

//段落を与えます

//$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>
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。