Windows Server 2012 で PHP と IIS 8 を使用しています。サーバーで UTF-8 でエンコードされたファイルを作成し、次のコードを使用してクライアントにプッシュします。
// Start upload to client
$fullPath = $full_name;
$fsize = filesize($fullPath);
$path_parts = pathinfo($fullPath);
$ext = strtolower($path_parts["extension"]);
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"".$file_name."\"");
header("Content-length: $fsize");
header("Cache-control: private");
readfile($full_name);
クライアントがファイルを受け取ると、開始 BOM が含まれており、(驚いたことに) ファイルの最後に 3 文字がありません。サーバー上のファイルを確認したところ、そこに正しく保存されています (BOM が保存されておらず、欠落している 3 文字がそこにあります)。
ファイルを作成してアップロードする PHP スクリプトには、ヘッダーがあります。
header('Content-Type:text/html; charset=UTF-8');
不足している 3 つの文字を取得するために、ファイルの最後に 3 回の「改行」を追加することにしました。変数 $fsize に +3 を追加することもできますが、そのようなチートを行うのは気が進まない (反撃する可能性があります)。これからもっとエレガントな方法があるはずだと思います。
不思議なことに、IIS 7.5 を搭載した Win7 マシンで同じコードを使用していますが、UTF-8 BOM の追加に問題はありません。PHP ディレクトリは、php.ini ファイルを含む Win7 マシン上のディレクトリのコピーです。
誰かが私が欠けているものを見ることができますか?
よろしくお願いします。