私はラボのインストラクターとして働いており、ファイルをWebルートの上に保持し、(大学のLDAPを介して認証された)ログインを強制することで、学生がスターターファイルを早期にダウンロードできないようにし、リリースが過ぎていることを確認しました。次に、readfileを使用してファイルを送信します。残念ながら、私が送信するファイルはすべて破損してしまいます。
私のコードは次のとおりです。
if (file_exists($path)) {
//header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($path));
//header('Content-Transfer-Encoding: binary');
header('Expires:' . date('r', 0));
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
//header('Pragma: public');
header('Content-Length: ' . filesize($path));
//ob_clean();
//flush();
readfile($path);
exit(0);
}
プレーンテキストだけを送信しようとしましたが、これも正しく転送されず、最終的にはぎこちないものになりました。
編集:
申し訳ありませんが、私はすでに試したことを指定することを怠りました。簡単なテキストファイルを送信してみました(メモ帳でPDFを調べて、PHPの警告を探すのは少し大変です)。
内容だけを含むファイルを送信したThis is plain text
ところ、結果は純粋にぎこちないものでした。ほとんどの場合、印刷できない文字。 1f 8b 08 00 00 00 00 00 00 03 0b c9 c8 2c 56 00 a2 82 9c 00
アップデート:
サーバーの1つでgzipを無効にしましたが、ファイルはまだ破損しています。を削除するob_clean(); flush()
と、テキストファイルがきれいに表示され始めました(インターネットで読んだものがすべて信じられません:/)。
Zipファイルはまだ破損していますが、PDFは読み取り可能になりました。もう少し調べてみたところ、ファイルの先頭に改行が追加されているようです。テキストファイルを振り返ると、先頭に余分な改行があり、最後の文字が欠落しています。予想どおり+1
、Content-Lengthヘッダーに追加すると、最後の文字が通過し、先頭に追加された改行がどこから来ているかを探します。また、コメントアウトするreadfile
と、CRLF(0d0a
)のみが含まれるファイルが表示されます。
フレームワークは通常、コントローラーからのコンテンツをビューとレイアウトで「ラップ」しますが、両方とも空白のファイルに設定され、ヘッドコントローラーはそれらが空白であることを確認し、生成されたHTMLをエコーするために行をスキップします。それでもexit(0)
、転送後にデストラクタのみが呼び出されるようにする必要があります。レイアウトとビューにechoステートメントを配置し、それに応じてコンテンツサイズを大きくすることでこれを確認しました。ダウンロードしたファイルにテキストが含まれていないため、改行がそこから来ていないことは比較的確実です。