我在Windows Server 2012上使用PHP和IIS 8.我在服務器上創建一個UTF-8編碼文件,然後使用以下代碼將它推送到客戶端:添加到已下載文件中的UTF-8 BOM
// 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和(OH驚奇)3個字符以文件的末尾丟失文件。我已經檢查了服務器上的文件,並將其保存在那裏(沒有保存BOM並且有三個缺失字符)。
創建並上傳文件的PHP腳本有頭
header('Content-Type:text/html; charset=UTF-8');
我已經使出了在文件的最後添加3次「換行」獲得三個丟失字符。我也可以在變量$ fsize中加上+3,但是我做這種欺騙(它可能會反彈)並不舒服。我認爲應該有更優雅的方式。
奇怪的是我使用相同的代碼一個Win7的機器上使用IIS 7.5,有一個與UTF-8 BOM除了沒有問題存在。 PHP目錄是Win7機器上目錄的副本,包括php.ini文件。
能someonen看到我失去了什麼?
在此先感謝您的幫助。
不要發送文本爲'應用程序/八位字節stream'。以文本形式發送。 – 2013-05-13 14:11:23
最後3個字符被剝離,因爲您發送了正確的Content-Length標題(沒有bom),並且瀏覽器在到達它後切割了所有內容。 – pozs 2013-05-13 14:12:28
謝謝馬特,這是合理的,因爲我只是發送文本。我只是更改了我的代碼,但BOM仍在添加。 – Manuel 2013-05-13 14:14:52