У меня есть страница 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?
Вы должны создать обычный сервлет, вы не можете передавать двоичные данные из ReportsServiceImpl
. Кроме того, невозможно вызвать сервлет из ReportsServiceImpl - ваш клиентский код должен напрямую вызывать сервлет.
На стороне клиента вам нужно будет создать обычную ссылку привязки с параметрами, передаваемыми через строку запроса. Что-то вроде
.
На стороне сервера переместите свой код на стандартный сервлет, который НЕ наследуется от RemoteServiceServlet
. Прочтите параметры из объекта запроса, создайте Excel и отправьте его клиенту. Браузер автоматически откроет диалоговое окно загрузки файла.