Tengo una página GWT donde el usuario ingresa datos (fecha de inicio, fecha de finalización, etc.), luego estos datos van al servidor a través de una llamada RPC. En el servidor, quiero generar informes de Excel con POI y permitir que el usuario guarde ese archivo en su máquina local.Descargar archivo dinámico con GWT
Este es mi código de prueba para transmitir archivos de vuelta al cliente, pero por alguna razón creo que no sabe cómo se debe transmitir archivo al cliente cuando estoy usando 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;
}
}
tengo leí en algún lado en Internet que no puedes hacer stream de archivos con RPC y tengo que usar Servlet para eso. ¿Hay algún ejemplo de cómo usar Servlet y cómo llamar a ese servlet desde ReportsServiceImpl? ¿Realmente necesito hacer un servlet o es posible volver a transmitirlo con mi RPC?
favor elaborar el problema con más detalle. "no sabe" no es realmente descriptivo. ¿Qué pasa exactamente? ¿Qué pasa exactamente no? – BalusC
La respuesta de @sri tiene sentido. Ahora me toca a mí publicar algunos comentarios: 1) 'DataInputStream' es superfino. Simplemente use 'FileInputStream' directamente. Después de todo * solo * necesita el método 'read()' definido en la clase 'InputStream'. 2) La verificación 'in! = Null' también es superfloosa, ya que ** nunca ** null (creaste una nueva usando' new', que nunca puede ser nula). 3) El encabezado 'Content-Disposition' se ve mal formado en la parte' filename'. Para obtener algunas ideas sobre cómo hacer la entrega del archivo * básico *, puede encontrar útil [este artículo] (http://balusc.blogspot.com/2007/07/fileservlet.html). Buena suerte. – BalusC