2013-05-13 42 views
0

我在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看到我失去了什麼?

在此先感謝您的幫助。

+0

不要發送文本爲'應用程序/八位字節stream'。以文本形式發送。 – 2013-05-13 14:11:23

+0

最後3個字符被剝離,因爲您發送了正確的Content-Length標題(沒有bom),並且瀏覽器在到達它後切割了所有內容。 – pozs 2013-05-13 14:12:28

+0

謝謝馬特,這是合理的,因爲我只是發送文本。我只是更改了我的代碼,但BOM仍在添加。 – Manuel 2013-05-13 14:14:52

回答

0

您應該檢查在腳本文件中的BOM了。通常情況下,如果您的IDE使用BOM保存UTF-8文件,那麼它在打開<?php標記之前,因此php將視爲輸出。

+0

恐怕這也不是原因,我正在使用TextPad。我迫使它不寫一個UTF-8文件的BOM。我也檢查了一個。 – Manuel 2013-05-13 14:21:46

+0

請注意,BOM中也可能包含在包含的文件中。您是否完成了BOM搜索? http://stackoverflow.com/questions/204765/elegant-way-to-search-for-utf-8-files-with-bom – pozs 2013-05-13 14:32:57

+0

感謝pozs。這是問題。我必須使用記事本修改包含的文件以更改密碼,並向其添加BOM。 – Manuel 2013-05-13 14:52:05