使用GWT中的RequestBuilder处理响应中的附件

11

我正在从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        
}

我应该如何处理onResponseReceived回调中的响应?

2个回答

18

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

有几种替代方案可实现此目的:

  1. 如果您可以将数据作为GET请求传递(仅限于小数据量),则可以使用带有数据作为GET参数的URL创建新窗口,并使用Window.open()打开。

  2. 对于较大量的数据,您可以首先使用RequestBuilder将数据POST到服务器以临时存储数据,在RequestCallback.onResponseReceived()中使用类似第1个替代方案的短URL在新窗口中打开。在服务器端,您需要将PDF生成servlet分成两部分:一个具有POST方法(即将数据存储到Web会话中)的数据存储servlet以及一个具有GET方法的PDF渲染servlet,它从会话中获取数据(并删除它),不需要大参数。

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


  • 1
    在客户端,使用锚点而不是请求构建器,并通过使用Window.Location.replace(URL.encode(formActionUrl))直接调用servlet。

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接