2

我正在使用 gwt 画布。

我有 74kb 字符串(图像)数据,我想将其传递给 servlet。这样 servlet 就会处理该数据并将内容发送给浏览器。这样它会提示用户下载它。

从客户端我正在使用 RequestBuilder 调用一个 servlet,将请求数据设置给它,数据很大,所以我使用的是 post 请求。它击中 servlet 也会在浏览器上抛出内容,但没有显示任何下载内容。

当前 url 有 canvas 。我认为这就是为什么它没有下载任何东西这个结论是因为如果直接使用打开该 servlethttp://localhost:8080/servlet然后它的下载属性(在这种情况下我没有证明来自客户端的任何内容)但是对于 url画布它的给予问题。

那么有什么方法可以让我在新选项卡中打开一个 url 并可以使用 gwt 中的 post 请求调用 servlet。

4

1 回答 1

3

您可以使用表单面板进行上传,表单面板将使用隐藏的 iframe,

FormPanel form = new FormPanel();
form.setMethod(FormPanel.METHOD_POST);
form.setAction("/downloadServlet");
FlowPanel hiddenPanel = new FlowPanel();
hiddenPanel.add(new Hidden("name1", "value"));
hiddenPanel.add(new Hidden("name2", "value"));
form.setWidget(hiddenPanel);
RootPanel.get().add(form);
form.submit();

如果您放置了正确的标头,则 servlet 返回的内容将由用户导航器下载。

public class ServletDownloadDemo extends HttpServlet{

  private static final int BYTES_DOWNLOAD = 1024;

  @Override
  public void doPost(HttpServletRequest request, 
   HttpServletResponse response) throws IOException{
    //Get Parameters
    String name1 = request.getParameter("name1");
    String name2 = request.getParameter("name2");

    response.setContentType("text/plain");
    response.setHeader("Content-Disposition",
                     "attachment;filename=downloadname.txt");
    ServletContext ctx = getServletContext();
    InputStream is = ctx.getResourceAsStream("/testing.txt");

    int read=0;
    byte[] bytes = new byte[BYTES_DOWNLOAD];
    OutputStream os = response.getOutputStream();

    while((read = is.read(bytes))!= -1){
        os.write(bytes, 0, read);
    }
    os.flush();
    os.close(); 
   }
}
于 2013-09-25T07:50:48.467 回答