【问题标题】:Start download from servlet via gwt (http get)通过 gwt (http get) 从 servlet 开始下载
【发布时间】:2011-08-24 22:56:43
【问题描述】:

我想从我的 gwt Web 应用程序中的点击事件开始下载文件。所以我写了一个 Servlet,它将数据写入输出并开始下载。通过http get接收数据。

public void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {

    String data = request.getParameter("data");
    String filename = request.getParameter("filename");
    byte[] streamData = data.getBytes();
    response.setContentType("application/force-download");
    response.setHeader("Content-Disposition", "attachment; fileName="
            + filename + ".csv");
    response.setContentLength(streamData.length);

    ServletOutputStream out = response.getOutputStream();
    out.write(streamData);
    out.flush();
}

在客户端我通过 requestBuilder.sendRequest() 启动 get 方法:

RequestBuilder requestBuilder = new RequestBuilder(RequestBuilder.GET, /download");
requestBuilder.sendRequest("filename=dues&data="+ theDataAsString, new RequestCallback() {

                    @Override
                    public void onResponseReceived(Request request,
                            Response response) {
                        // Anything to do here?
                    }

                    @Override
                    public void onError(Request request, Throwable exception) {
                        exception.printStackTrace();
                        SC.warn("Error while creating export file.");
                    }
                });

什么都没有发生。但为什么?浏览器不应该要求开始下载吗?

在这种情况下,我使用 post 还是 get 是否重要?

我不想使用类似的东西

Window.open("/download?data=myData&filename=filename", "_blank", "");

有什么想法吗?

【问题讨论】:

  • servlet 只在响应正文中返回检索到的请求参数(可能使用错误的字符编码)。那么这里 servlet 的全部目的是什么?我不做 GWT,但你为什么不直接把它写到它的响应中呢?
  • @BalusC:问题在于所有的 GWT Java 代码都被翻译成 JavaScript 并且不支持 java.io.*,所以我必须使用 Servlet。但你对编码是正确的,在我的情况下,我应该使用“text/csv”。 (但实际上“应用程序/强制下载”也可以)
  • Re GWT:好的。重新编码:不,我的意思是您需要在String#getBytes()HttpServletResponse#setCharacterEncoding() 中指定的字符编码。不指定字符编码将导致使用平台默认值,如果字符最初不是使用相同的编码进行编码,则可能会导致字符格式错误。
  • 好的,谢谢您的提示。但是我还没弄明白:编码会导致Servlet平台默认吗?还是会是发送客户端(我的 smartgwt 客户端)的编码?

标签: java gwt servlets get httprequest


【解决方案1】:

在客户端,使用 Anchor 而不是请求构建器并直接调用 servlet。

【讨论】:

  • 是的,就是这样。我不知道为什么requestBuilder.sendRequest() 不起作用但 Anchor 起作用。实际上我现在使用 post 方法和 FormPanel 而不是 Anchor...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-30
相关资源
最近更新 更多