Java:上传文件并获取文件的字符串(内容)

时间:2011-06-25 16:55:12

标签: java gwt servlets

嗨,我有GWT客户端,标准的服务器端Servlet。

  • 我可以从GWT客户端上传文件,并在服务器端读取它的内容
  • 我可以将它作为String
  • 发送回客户端

BUT

我有动作的GWT FormPanel(myModule +“import”)。 FormPanel从servlet调用 POST 。然后浏览器将我重定向到 myurl / import ,这样我就可以看到上传文件的内容。

不是我想要的。我只想把我的弦回来。我补充道 submitCompleteHandler到我的FormPanel,但它没有记录任何结果。

我注意到servlet有方法setContentType所以我尝试了text / html,text / plain ...我不知道应该在那里...

用一句话来说,我想从servlet向客户端发送String,而不需要浏览器将其重定向到其他地方。可能吗?

2 个答案:

答案 0 :(得分:3)

由于您要提交表单,因此您的浏览器会更改导航。为了使它按照您希望的方式工作,您必须使用ajax发送文件。对于GWT,有GWTUpload库允许您这样做。

答案 1 :(得分:2)

如果浏览器重定向您,那是因为您为FormPanel提供了“目标”。默认情况下,它在隐藏的iframe(a.k.a“ajax upload”)中提交。

正如in the javadoc所述,如果您希望可靠地调用setContentType("text/html"),则必须在您的servlet中onSubmitComplete

onSubmitComplete结果是返回的HTML body innerHTML,因此在使用<发回值时必须非常小心其中&。让他们回来的唯一可靠方法是在服务器端转义,并在客户端取消它们。您可以使用自己的转义机制,也可以使用&lt;&amp;。在后一种情况下,对于客户端的unescape,你要么使用String#replace,要么创建一个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;")

(如果您不希望<成为&amp;lt;,则此处的顺序很重要;此外,替换<&就足够了,>"这里不会引起任何问题)

在你的情况下,首先要确保文件的内容是“文本”而不​​是“二进制”,因为返回它是没有意义的,因为String可能会导致问题,具体取决于你如何使用客户端上的值侧。