Загрузите динамический файл GWT

У меня есть страница GWT, где пользователь вводит данные (дата начала, дата окончания, и т.д.), затем эти данные переходят к серверу через вызов RPC. На сервере я хочу генерировать отчет Excel с ПОИ и позволить пользователю сохранить тот файл на их локальной машине.

Это - мой тестовый код для потоковой передачи файла назад клиенту, но по некоторым причинам я думаю, что он не знает, как передать файл потоком клиенту, когда я использую RPC:

public class ReportsServiceImpl extends RemoteServiceServlet implements ReportsService {
    public String myMethod(String s) {

        File f = new File("/excelTestFile.xls");

        String filename = f.getName();

        int length = 0;

        try {
            HttpServletResponse resp = getThreadLocalResponse();
            ServletOutputStream op = resp.getOutputStream();
            ServletContext context = getServletConfig().getServletContext();
            resp.setContentType("application/octet-stream");
            resp.setContentLength((int) f.length());
            resp.setHeader("Content-Disposition", "attachment; filename*=\"utf-8''" + filename + "");

            byte[] bbuf = new byte[1024];
            DataInputStream in = new DataInputStream(new FileInputStream(f));

            while ((in != null) && ((length = in.read(bbuf)) != -1)) {
                op.write(bbuf, 0, length);
            }

            in.close();
            op.flush();
            op.close();

        }
        catch (Exception ex) {
            ex.printStackTrace();
        }

        return "Server says: " + filename;
    }
}

Я читал где-нибудь в Интернете, что Вы не можете сделать потока файла с RPC, и я должен использовать Сервлет для этого. Есть ли любой пример того, как использовать Сервлет и как назвать тот сервлет от ReportsServiceImpl. Я должен действительно сделать сервлет, или возможно передать его потоком назад с моим RPC?

9
задан Maksim 13 May 2010 в 16:45
поделиться

1 ответ

Вы должны создать обычный сервлет, вы не можете передавать двоичные данные из ReportsServiceImpl . Кроме того, невозможно вызвать сервлет из ReportsServiceImpl - ваш клиентский код должен напрямую вызывать сервлет.

На стороне клиента вам нужно будет создать обычную ссылку привязки с параметрами, передаваемыми через строку запроса. Что-то вроде .

На стороне сервера переместите свой код на стандартный сервлет, который НЕ наследуется от RemoteServiceServlet . Прочтите параметры из объекта запроса, создайте Excel и отправьте его клиенту. Браузер автоматически откроет диалоговое окно загрузки файла.

14
ответ дан 4 December 2019 в 13:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: