Ich habe eine GWT-Seite, wo Benutzer Daten eingeben (Startdatum, Enddatum, etc.), dann gehen diese Daten an den Server über RPC-Aufruf. Auf dem Server möchte ich einen Excel-Bericht mit POI erstellen und den Benutzer diese Datei auf seinem lokalen Rechner speichern lassen.Download dynamische Datei mit GWT
Dies ist mein Test-Code-Datei zurück an den Client zu streamen, aber aus irgendeinem Grund finde ich es nicht weiß, wie man die Client-Datei zu streamen, wenn ich RPC bin mit:
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;
}
}
Ich habe lesen Sie irgendwo im Internet, dass Sie Datei-Stream mit RPC nicht machen können, und ich muss Servlet dafür verwenden. Gibt es ein Beispiel für die Verwendung von Servlet und das Aufrufen dieses Servlets von ReportsServiceImpl. Muss ich wirklich ein Servlet erstellen oder es ist möglich, es mit meinem RPC zu streamen?
Bitte erarbeiten das Problem im Detail. "es weiß nicht" ist nicht wirklich beschreibend. Was genau passiert? Was genau passiert nicht? – BalusC
Die Antwort von @sri macht Sinn. Jetzt ist es an mir, einige Kommentare zu posten: 1) 'DataInputStream' ist überflüssig. Verwenden Sie einfach "FileInputStream". Sie brauchen schließlich * nur * die 'read()' Methode, die in der 'InputStream' Klasse definiert ist. 2) Die 'in! = Null'-Prüfung ist auch überflüssig, da das ** never ** null ist (du hast eine neue mit' new' erstellt, die niemals null sein kann). 3) 'Content-Disposition'-Header sieht im' filename'-Teil fehlerhaft aus. Um ein paar Ideen zu bekommen, wie man die Datei * basic * bereitstellt, kann man [diesen Artikel] (http://balusc.blogspot.com/2007/07/fileservlet.html) nützlich finden. Viel Glück. – BalusC