处理附件以响应GWT中的RequestBuilder

nis*_*shu 10 java pdf gwt attachment

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

响应流的标头是:

Content-Disposition: attachment; filename=report.pdf
Run Code Online (Sandbox Code Playgroud)

我想在用户浏览器的新窗口中打开此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        
}
Run Code Online (Sandbox Code Playgroud)

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

van*_*nje 17

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

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

  1. 如果你能在一个GET请求(仅适用于小数据量)通过你的数据,你可以创建一个数据作为GET参数的URL,然后打开一个新的浏览器窗口Window.open()传递数据的URL.

  2. 对于大量数据,您可以先将数据RequestBuilder发送到服务器以临时存储数据,然后在RequestCallback.onResponseReceived()中打开一个新的浏览器窗口,其中包含如上所述的短URL.在服务器端,您必须拆分PDF生成的servlet分为两个部分:一数据存储的servlet与POST方法(即存储数据到所述网络会话)和PDF渲染GET方法,该方法将数据从会话(和删除它)servlet和没有按"需要大参数.

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