2011-06-25 84 views
0

您好我有標準服務器端Servlet的GWT客戶端。Java:上傳文件並取回文件的字符串(內容)

  • 我可以從GWT客戶端上傳文件並讀取它在服務器端內容
  • 我可以將其發送回客戶端作爲字符串

我有帶動作的GWT FormPanel(myModule +「導入」)。 FormPanel從servlet調用POST。然後瀏覽器將我重定向到myurl/import,這樣我就可以看到上傳文件的內容。

這是不是我想要的。我只想回到我的字符串。我向我的FormPanel添加了 submitCompleteHandler,但它不記錄任何結果。

我注意到,有servlet的方法,例如setContentType所以我想爲text/html,text/plain的...我不知道什麼應該在那裏...

爲了說這一句話,我想從servlet發回字符串給客戶端,而無需瀏覽器將其重定向到其他地方。可能嗎?

回答

3

由於您要提交表單,因此您可以使用瀏覽器更改導航。爲了使它以你想要的方式工作,你必須用ajax發送文件。對於GWT,您可以使用GWTUpload庫。

+1

完美運作,令我印象深刻。謝謝! – Xorty

2

如果瀏覽器重定向你,這是因爲你給了FormPanel「目標」。默認情況下,它在隱藏的iframe中提交(a.k.a「ajax upload」)。

如您所說的in the javadoc,如果您想onSubmitComplete被可靠調用,您必須在您的servlet中使用setContentType("text/html")

onSubmitComplete結果是返回的HTML的bodyinnerHTML所以你有<或在他們&發回值時要非常小心。獲取它們的唯一可靠方法是在服務器端對轉義,並在客戶端對其進行撤消。您可以使用自己的轉義機制,也可以使用&lt;&amp;。在後一種情況下,未逸出的客戶端,你要麼使用字符串#替換,或創建一個HTML元素,設置它的innerHTML與你回來的字符串,然後得到其的innerText:

public String htmlUnescape(String htmlEscaped) { 
    Element tmp = Document.get().createDivElement(); 
    tmp.setInnerHTML(htmlEscaped); 
    return tmp.getInnerText(); 
} 

在服務器端,你會使用:

escaped = content.replace("&", "&amp;").replace("<", "&lt;") 

(爲了在此重要的,如果你不想< s到成爲&amp;lt;;同時,更換<&是不夠的,>"不會造成任何問題)

然而,在你的情況下,首先確保文件的內容是「文本」而不​​是「二進制」,因爲根據你如何使用客戶端上的值來返回字符串可能會導致問題是沒有意義的側。

相關問題