2012-12-05 1 views
7

Ich verwende GWT (Google Web Toolkit), um eine Website zu erstellen. Ich muss dem Benutzer eine Tabelle anzeigen und den Benutzer den Inhalt der Tabelle herunterladen lassen.Wie kann ein Benutzer eine Datei auf Clientseite herunterladen (Google Web Toolkit)

Auf der Client-Seite, wie kann ein Benutzer eine Datei herunterladen, wenn er den "Download" -Button drückt?

Der "Download" Button hat einen onClick() Listener. Und die Client-Seite Klasse erweitert Composite.

Ich habe versucht, die Klasse HttpServlet zu erweitern, aber es wird zu kompliziert.

Ich lese schon Beiträge hier:

  1. http://www.mkyong.com/java/how-to-download-file-from-website-java-jsp/
  2. How to use GWT when downloading Files with a Servlet?

Aber ich weiß noch nicht, wie kann ich herunterladbare Datei an den Benutzer auf der Client-Seite zur Verfügung stellen.

+0

Für Client: 'Window.Location.replace ("/downloadServlet ");' – Chloe

Antwort

21

Sie müssen wirklich zwischen GWT Client-Seite Java-Code und Server-Seite Java-Code unterscheiden.

Auf der Client-Seite in Ihrem GWT Java-Code

String url = GWT.getModuleBaseURL() + "downloadService?fileInfo1=" + fileInfo1; 
Window.open(url, "_blank", "status=0,toolbar=0,menubar=0,location=0"); 

Auf Server-Seite in Ihrem Nicht-gwt Java code-

In web.xml

<servlet> 
    <servlet-name>downloadService</servlet-name> 
    <servlet-class>AAA.BBB.CCC.DownloadServlet</servlet-class> 
</servlet> 

<servlet-mapping> 
    <servlet-name>downloadService</servlet-name> 
    <url-pattern>/<gwtmodulename>/downloadService</url-pattern> 
</servlet-mapping> 

Im Server-Paketcode ein Servlet

public class DownloadServlet extends HttpServlet{ 
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 
     { 
      String fileName = req.getParameter("fileInfo1"); 

      int BUFFER = 1024 * 100; 
      resp.setContentType("application/octet-stream"); 
      resp.setHeader("Content-Disposition:", "attachment;filename=" + "\"" + fileName + "\""); 
      ServletOutputStream outputStream = resp.getOutputStream(); 
      resp.setContentLength(Long.valueOf(getfile(fileName).length()).intValue()); 
      resp.setBufferSize(BUFFER); 
      //Your IO code goes here to create a file and set to outputStream// 

     } 
    } 

Stellen Sie sicher, dass Sie den Dateiinhalt auf **outputStream** schieben.

+0

Ja, Sie haben Recht. Ich habe versucht, meinen eigenen Code zu machen, aber das Schreiben von Dateien auf der Client-Seite ist unmöglich. Ich löse dieses Problem ähnlich. Wie auch immer, Danke für die Antwort. –

+0

Anstatt ein neues Servlet zu erstellen, können Sie eines Ihrer GWT-Service-Servlets wiederverwenden, indem Sie einfach die Methode 'javax.servlet.http.HttpServlet # doGet' überschreiben. –

+0

Nicht sehr sicher. Können Sie ein Codebeispiel freigeben? – SSR

3

Wenn Sie den Pfad der Datei kennen, wird das Code-Snippet unten angezeigt.

button.addClickHandler(new ClickHandler() 
{ 

    @Overrid 
    public void onClick(ClickEvent event) 
    { 
     Window.open(GWT.getHostPageBaseURL() + "/file.rar", "name", "enabled"); 
    } 
}); 
+0

Danke für Ihren Kommentar, aber ich denke schon darüber nach.Problem ist, dass ich Datei schreiben Routine auf Client-Seite nicht verwenden kann (Es kann kompiliert werden, aber Fehler - Modul laden Fehler) –

+0

Sie können die Datei auf der Client-Seite nicht durch Code schreiben, Sachen wie dies ist nicht erlaubt auf der Browser. Sie müssen den Browser die Datei herunterladen lassen und den Speicherort angeben. – Spiff

+0

Sie haben Recht. Ich löse dieses Problem auf ähnliche Weise. Wie auch immer, Danke für die Antwort. –

0

Um die Antwort zu der Nummer eins Element im io Teil zu vervollständigen ...

können Sie beziehen sich auf Link

http://www.programcreek.com/2009/02/java-convert-a-file-to-byte-array-then-convert-byte-array-to-a-file/

oder auf diesen Code verweisen

File file = new File(enter the filepath here) 
FileInputStream fis = new FileInputStream(file); 
       ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
       byte[] buf = new byte[1024]; 
       try { 
        for (int readNum; (readNum = fis.read(buf)) != -1;) { 
         bos.write(buf, 0, readNum); //no doubt here is 0 
         //Writes len bytes from the specified byte array starting at offset off to this byte array output stream. 
         System.out.println("read " + readNum + " bytes,"); 
        } 
       } catch (IOException ex) { 
        System.err.println("unable to convert to bytes"); 
       } 
       byte[] bytes = bos.toByteArray(); 
       outputStream.write(bytes); 
       outputStream.flush(); 
       outputStream.close(); 

hoffe es hilft!