使用包含大量数据的post请求调用servlet,并在新选项卡中打开url

时间:2013-09-25 07:06:52

标签: gwt servlets canvas

我正在使用gwt canvas。

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

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

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

那么有什么方法我可以在新标签中打开一个网址,并可以使用gwt中的post请求调用servlet。

1 个答案:

答案 0 :(得分: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(); 
   }
}