2011-03-12 49 views
2

當我在表單中包含文件輸入時,表單元素的輸入編碼出現了問題。我正在使用jquery和一個servlet後端(和ajax調用),但我不知道這應該與它有什麼關係。 HTML頁面編碼設置爲UTF-8,並且我還指定了使用utf8的servlet請求的字符編碼。當我從表單中刪除文件輸入時,編碼是好的。當包含文件輸入在表單中時,編碼會被搞亂

當我探討我看到螢火蟲以下有效載荷的請求頭:

... 
------WebKitFormBoundaryMxjJWBwBmPLxN623 
Content-Disposition: form-data; name="createActivityTitleInputId" 

æøåæøåæøåæøå 
... 

輸入應æøåæøåæøå的內容,我不知道webkitformboundary的東西是什麼...?

如果有人能幫我解決這個問題,我將非常感激。

謝謝:)

-----編輯------

所以我做了一個小測試項目,儘量縮小問題的範圍。當我不使用ajax發佈表單時,一切正常。如果我使用jQuery表單插件提交表單,那麼編碼失敗...

form.ajaxSubmit({ 
     dataType: 'json', 
     data: data, 
     type: 'POST', 
     success: function(response) { 
      successfunction(response); 
     } 
    }); 

任何人都有使用此插件的經驗嗎?

+0

可能是一個愚蠢的問題,但是你的''enctype'設置爲? – 2011-03-12 23:31:20

+0

沒關係,我在這裏看到'form-data'。 – 2011-03-12 23:33:04

+1

你用什麼來解析'multipart/form-data'請求? Apache Commons FileUpload,我猜?這邊界的東西只是RFC2388的一部分,對我來說看起來很好。提交的輸入明顯錯誤地編碼爲ISO-8859-1而不是UTF-8。但是不清楚它是否是錯誤地使用它的客戶端(嘗試不同的瀏覽器),或者只是你自己將提取的UTF-8字符打印到某些錯誤地使用ISO-8859-1的輸出中。 – BalusC 2011-03-12 23:52:58

回答

3

當我研究了HEA ders請求我在bugzilla中看到以下有效負載:

你的意思是Firebug?你在看Firebug的Net日誌中的'post'選項卡嗎?

因爲如果是這樣,它會查看整個表單提交上傳,並嘗試將其解碼(包括任何上傳文件的字節內容)爲UTF-8。如果失敗,它將回退到區域默認編碼,通常是Windows代碼頁1252(類似於ISO-8859-1),以顯示錶單提交內容。

這並不改變表單實際提交的方式!這只是Firebug對此的可視化。 Firebug實際上並不知道用什麼字符編碼來編碼表單內容,這只是猜測。通常情況下,表單提交不會傳送任何信息讓服務器(或Firebug)知道正在使用哪種編碼。

因此,如果您提交的表單沒有文件上傳,或者文件上傳的文件內容本身是有效的UTF-8序列(包括任何僅有ASCII的文件),Firebug將顯示整個表單提交爲UTF -8,並將顯示的內容顯示爲您所期望的字符。另一方面,如果文件的字節順序不是有效的UTF-8序列(對於任何二進制文件(例如圖像)的確很可能),Firebug會嘗試將字節解碼爲UTF-8,失敗,並回落到cp1252。

這將給你顯示「Ã|øÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃ」,即使實際的服務器將讀取作爲UTF- 8並獲得「æøåæøåæøå」。 Firebug不知道文本表單提交值(它是字符)與文件上傳提交內容(它們是字節;它們也可能代表字符)之間的區別,但如果是這樣,則不能保證上傳的文件將使用相同的編碼作爲形式)。

我不知道什麼webkitformboundary的東西是...?

在MIME multipart/結構中,有一個邊界字符串將每個子部分分開。在multipart/form-data每個子部分是一個表單字段。邊界字符串總是以換行符開始,然後是--,但是隨後有一個任意字符串被選爲邊界,通常涉及字符的隨機序列,不太可能出現在子部分本身的數據中。

邊界字符串可以是任何東西,並在Content-Type: multipart/form-data;boundary=參數中指定。 WebKit瀏覽器始終使用從----WebKitFormBoundary開始的邊界字符串。

+0

意味着螢火蟲關閉:)當窗體中的文件輸入被移除時,螢火蟲中的顯示工作正常。另外,我不需要上傳任何用於編碼的文件就可以搞砸了。當文件輸入的內容發生變化時,文件上傳是通過ajax來完成的。 – 2011-03-13 11:24:50

+0

此外,後端的servlet將接收到編碼錯誤的內容(獲取Ã|øåÃ|øåÃ|ø Ã¥Ã|øå) – 2011-03-13 11:27:29

+0

噢,你正在使用「ajaxSubmit」?通常,使用直接AJAX提交文件上傳字段是不可能的。查看ajaxSubmit的代碼,它只是提交給iframe目標,而不是用AJAX做任何事情。這是一個完全不同的代碼路徑,當存在一個文件上傳字段時會被採用。 (它看起來像是一個錯誤的代碼路徑,但這是一個無關的問題。) – bobince 2011-03-13 12:48:57

0

好的...所以我做了一個解決方法。我沒有用ajaxsubmit發佈表單,而是使用jquery ajax功能,並手動將每個表單元素值添加到ajax請求的數據部分。這似乎解決了這個問題。

$.ajax({ 
     type: 'POST', 
     url: action, 
     data: params, 
     dataType: 'json', 
     success: function(response, textStatus, XMLHttpRequest) { 
      successfunction(response); 
     } 
    }); 
相關問題