2

gwt canvas を使用しています。

サーブレットに渡したい74kbの文字列(画像)データがあります。そのため、サーブレットはそのデータを処理し、コンテンツをブラウザにスローします。このようにして、ユーザーにダウンロードを促します。

クライアント側から RequestBuilder を使用してサーブレットを呼び出し、それにリクエスト データを設定します。データが大きいため、ポスト リクエストを使用しています。ブラウザにコンテンツをスローするサーブレットにもヒットしていますが、ダウンロードは表示されません。

canvas を持つ現在の URL .I は、何もダウンロードしていない理由だと思います。この結論は、そのサーブレットを直接使用http://localhost:8080/servletしてダウンロードしている場合 (この場合、クライアント側からのコンテンツを証明していません)、URL がその与える問題をキャンバスにします。

新しいタブで URL を開き、gwt でポスト リクエストを使用してサーブレットを呼び出す方法はありますか。

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();

正しいヘッダーを配置すると、サーブレットによって返されるコンテンツは、ユーザーナビゲーターによってダウンロードされます。

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 に答える