Вызов сервлета из GWT с почтовыми данными и загрузкой файла, сгенерированного сервлетом

У меня есть свой ExportServlet, который генерирует файлы XLSX (Excel ), которые мой пользователь будет запрашивать из моего приложения GWT, нажав кнопку экспорта.

Если я использую подход GET, пользователю предлагается загрузить файл. Код выглядит так:

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException
{
    try
    {
        byte[] xlsx = createTest("");
        sendXLSX(resp, xlsx, "test.xlsx");
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
 }

void sendXLSX(HttpServletResponse response, byte[] bytes, String name)
        throws IOException
{
    ServletOutputStream stream = null;

    stream = response.getOutputStream();
    response.setContentType(CONTENT_TYPE_XLSX);
    response.addHeader("Content-Type", CONTENT_TYPE_XLSX);
    response.addHeader("Content-Disposition", "inline; filename=" + name);
    response.setContentLength((int) bytes.length);
    stream.write(bytes);
    stream.close();
}

Это вызывается клиентом GWT следующим образом:

String url = GWT.getModuleBaseURL() + "ExportServlet";
Window.open(url, "", "");

и пользователю предлагается загрузить файл. Хорошо, это то, что я хочу:)

Но я хотел бы прикрепить к запросу много данных, и, как оказалось, существует ограничение на количество данных, которые вы можете поместить в параметр URL («ExportServlet?data=...» ), поэтому я вместо этого хотел бы обернуть это в POST-запрос.

Я пробовал следующее из GWT:

String url = GWT.getModuleBaseURL() + "ExportServlet";
RequestBuilder builder = new RequestBuilder(
                            RequestBuilder.POST, url);
Request response = builder.sendRequest("test data", new RequestCallback() 
{
    @Override
    public void onResponseReceived(Request request, Response response)
    {
        System.out.println("");
    }

    @Override
    public void onError(Request request, Throwable exception)
    {
        System.out.println("");
    }
});

и это в моем сервлете:

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException
{
    try
    {
        String data = req.getReader().readLine();
        byte[] xlsx = createTest(data);
        sendXLSX(resp, xlsx, "test.xlsx");
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
}

но пользователю не предлагается загрузить файл. Вызывается метод doPost, и данные принимаются сервлетом, но должен ли я извлекать файл XLSX из ответа, который я получаю в приложении GWT? и как мне это сделать?

Будем признательны за любую помощь или комментарии:)

8
задан Rasmus Nielsen 2 August 2012 в 12:52
поделиться