处理附件以响应GWT中的RequestBuilder

我正在从GWT客户端向HTTPServlet发出HTTP POST请求。 此Servlet正在从请求内容创建PDF文件并将其写入响应流。

响应流的标头是:

Content-Disposition: attachment; filename=report.pdf 

我想在用户浏览器的新窗口中打开此PDF或提示他下载它。

 import com.google.gwt.http.client.*; ... String url = "http://www.myserver.com/getData?type=3"; RequestBuilder builder = new RequestBuilder(RequestBuilder.POST, URL.encode(url)); try { Request request = builder.sendRequest(data, new RequestCallback() { public void onError(Request request, Throwable exception) { // Couldn't connect to server (could be timeout, SOP violation, etc.) } public void onResponseReceived(Request request, Response response) { if (200 == response.getStatusCode()) { // Process the response in response.getText() // Window.open(url, "_blank", ""); } else { // Handle the error. Can get the status text from response.getStatusText() } } }); } catch (RequestException e) { // Couldn't connect to server } 

我该如何处理onResponseRecieved中的响应?

我想在这种情况下你不应该使用单个RequestBuilder AJAX调用。 您可以通过调用普通调用并让浏览器处理PDF响应(使用PDF查看器插件显示它或打开“保存”对话框)来依赖默认浏览器行为。

有几种方法可以实现这一目标:

  1. 如果您可以在GET请求中传递数据(仅适用于小数据卷),则可以使用数据作为GET参数创建URL,然后使用Window.open()传递带有数据的URL来打开新的浏览器窗口。

  2. 对于大量数据,您可以先使用RequestBuilder将数据RequestBuilder到服务器以临时存储数据,并在RequestCallback.onResponseReceived()中打开一个新的浏览器窗口,其中包含如上所述的短URL。在服务器端,您必须将PDF生成servlet分为两部分:一个带POST方法的数据存储servlet(即将数据存储到Web会话中)和一个带有GET方法的PDF呈现servlet,它将数据从会话中取出(并删除它)并且不会不需要大的参数。

  3. 使用方法POST,数据的隐藏字段和PDF生成servlet URL创建表单。 用您的数据填充隐藏字段并以编程方式提交表单(即FormPanel.submit() )。 如果使用目标名称创建FormPanel ,浏览器将打开一个新窗口或使用指定的框架来处理响应。

在客户端,使用Anchor而不是请求构建器,并使用Window.Location.replace(URL.encode(formActionUrl))直接调用servlet;