Beispiel für das Herunterladen einer Datei in einem Servlet

Beispiel für das Herunterladen einer Datei in einem Servlet

 1. Überblick

Ein gemeinsames Merkmal von Webanwendungen ist das Herunterladen von Dateien.

In diesem Tutorial werdenwe’ll cover a simple example of creating a downloadable file and serving it from a Java Servlet application.

Die von uns verwendete Datei stammt aus den Webapp-Ressourcen.

2. Maven-Abhängigkeiten

If using Java EE, then we wouldn’t need to add any dependencies. Wenn wir jedoch Java SE verwenden, benötigen wir die Abhängigkeit javax.servlet-api:


    javax.servlet
    javax.servlet-api
    4.0.1
    provided

Die neueste Version der Abhängigkeit befindet sich inhere.

3. Servlet

Schauen wir uns zuerst den Code an und finden dann heraus, was los ist:

@WebServlet("/download")
public class DownloadServlet extends HttpServlet {
    private final int ARBITARY_SIZE = 1048;

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
      throws ServletException, IOException {

        resp.setContentType("text/plain");
        resp.setHeader("Content-disposition", "attachment; filename=sample.txt");

        try(InputStream in = req.getServletContext().getResourceAsStream("/WEB-INF/sample.txt");
          OutputStream out = resp.getOutputStream()) {

            byte[] buffer = new byte[ARBITARY_SIZE];

            int numBytesRead;
            while ((numBytesRead = in.read(buffer)) > 0) {
                out.write(buffer, 0, numBytesRead);
            }
        }
    }
}

3.1. Endpunkt anfordern

Die Annotation von@WebServlet(“/download”)markiert die Klasse vonDownloadServlet, um Anforderungen zu bedienen, die an den Sendepunkt“/download” gerichtet sind.

Alternativ können wir dies tun, indem wir das Mapping in der Datei web.xml beschreiben.

3.2. AntwortContent-Type

DasHttpServletResponse-Objekt hat eine Methode namenssetContentType, mit der wir denContent-Type-Header der HTTP-Antwort festlegen können.

Content-Type ist der historische Name der Header-Eigenschaft. Ein anderer Name war der MIME-Typ (Multipurpose Internet Mail Extensions). Wir bezeichnen den Wert nun einfach als Medientyp.

This value could be “application/pdf”, “text/plain”, “text/html”, “image/jpg”, etc., die offizielle Liste wird von der Internet Assigned Numbers Authority (IANA) geführt und ist unterhere zu finden.

In unserem Beispiel verwenden wir eine einfache Textdatei. The Content-Type for a text file is “text/plain”.

3.3. AntwortContent-Disposition

Durch Festlegen des SheadersContent-Disposition im Antwortobjekt wird dem Browser mitgeteilt, wie mit der Datei umgegangen werden soll, auf die zugegriffen wird.

Browser verstehen die Verwendung vonContent-Disposition als Konvention, aber es ist eigentlich kein Teil des HTTP-Standards. W3 hat ein Memo über die Verwendung vonContent-Disposition zum Lesen vonhere.

DieContent-Disposition-Werte für den Hauptteil einer Antwort sind entweder "Inline" (für den zu rendernden Webseiteninhalt) oder "Anhang" (für eine herunterladbare Datei).

Wenn nicht angegeben, ist der StandardwertContent-Disposition "inline".

Mit einem optionalen Header-Parameter können wir den Dateinamen "sample.txt" angeben.

Einige Browser laden die Datei sofort mit dem angegebenen Dateinamen herunter, andere zeigen einen Download-Dialog mit unserem vordefinierten Wert an.

Die genauen Maßnahmen hängen vom Browser ab.

3.4. Aus Datei lesen und in Ausgabestream schreiben

In den verbleibenden Codezeilen nehmen wir dieServletContext aus der Anforderung und verwenden sie, um die Datei unter "/WEB-INF/sample.txt" abzurufen.

MitHttpServletResponse #getOutputStream() lesen wir dann aus dem Eingabestream der Ressource und schreiben inOutputStream der Antwort.

Die Größe des von uns verwendeten Byte-Arrays ist beliebig. Wir können entscheiden, welche Größe basierend auf der Speichermenge angemessen ist, um die Daten vonInputStream anOutputStream zu übergeben. je kleiner der Nuber, desto mehr Schleifen; Je größer die Zahl, desto höher die Speichernutzung.

Dieser Zyklus wird fortgesetzt, bisnumByteRead 0 ist, da dies das Ende der Datei anzeigt.

3.5. Schließen und spülen

Die Instanzen vonStreammüssen nach der Verwendung geschlossen werden, um die derzeit gehaltenen Ressourcen freizugeben. Die Instanzen vonWritermüssen ebenfalls geleert werden, um alle verbleibenden gepufferten Bytes in das Ziel zu schreiben.

Unter Verwendung einertry-with-resources-Anweisung führt die Anwendung automatischclose jedeAutoCloseable-Instanz aus, die als Teil dertry-Anweisung definiert ist. Lesen Sie mehr über Try-with-Resourceshere.

Wir verwenden diese beiden Methoden, um Speicher freizugeben und sicherzustellen, dass die von uns vorbereiteten Daten von unserer Anwendung gesendet werden.

3.6. Datei herunterladen

Mit allem, was vorhanden ist, können wir jetzt unser Servlet ausführen.

Wenn wir nun den relativen Endpunkt“/download” besuchen, versucht unser Browser, die Datei als "simple.txt" herunterzuladen.

4. Fazit

Das Herunterladen einer Datei von einem Servlet wird zu einem einfachen Vorgang. Durch die Verwendung von Streams können wir die Daten als Bytes ausgeben, und die Medientypen informieren den Client-Browser darüber, welche Art von Daten zu erwarten ist.

Es ist Sache des Browsers, zu bestimmen, wie mit der Antwort umgegangen werden soll. Wir können jedoch einige Richtlinien mit dem HeaderContent-Dispositionangeben.

Der gesamte Code in diesem Artikel befindet sich überover on GitHub.