Beispiel für das Herunterladen einer Datei in ein Servlet

1. Übersicht

Ein gemeinsames Merkmal von Webanwendungen ist das Herunterladen von Dateien.

In diesem Tutorial wird ein einfaches Beispiel für das Erstellen einer herunterladbaren Datei und deren Bereitstellung aus einer Java-Servlet-Anwendung behandelt .

Die von uns verwendete Datei stammt aus den Webanwendungsressourcen.

2. Maven-Abhängigkeiten

Wenn Sie Jakarta EE verwenden, müssen Sie keine Abhängigkeiten hinzufügen. 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 finden Sie hier.

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 @WebServlet ("/ download") markiert die DownloadServlet- Klasse, um Anforderungen zu bearbeiten , die an den Endpunkt "/ download" gerichtet sind .

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

3.2. Antwort Content-Type

Das HttpServletResponse- Objekt verfügt über eine Methode namens setContentType, mit der wir den Content-Type- Header der HTTP-Antwort festlegen können .

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

Dieser Wert kann "application / pdf", "text / plain", "text / html", "image / jpg" usw. sein . Die offizielle Liste wird von der Internet Assigned Numbers Authority (IANA) geführt und ist hier zu finden .

In unserem Beispiel verwenden wir eine einfache Textdatei. Der Inhaltstyp für eine Textdatei lautet "text / plain".

3.3. Antwort Inhalt-Disposition

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

Browser verstehen die Verwendung von Content-Disposition als Konvention, aber es ist eigentlich kein Teil des HTTP-Standards. W3 hat ein Memo über die Verwendung von Content-Disposition hier zu lesen.

Die Content-Disposition- Werte für den Hauptteil einer Antwort sind entweder "Inline" (für das Rendern von Webseiteninhalten) oder "Anhang" (für eine herunterladbare Datei).

Wenn nicht angegeben, ist die Standard- Inhaltsdisposition "Inline".

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

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

Die genaue Aktion hängt vom Browser ab.

3.4. Lesen aus der Datei und Schreiben in den Ausgabestream

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

Mit HttpServletResponse # getOutputStream () lesen wir dann aus dem Eingabestream der Ressource und schreiben in den OutputStream der Antwort .

Die Größe des von uns verwendeten Byte-Arrays ist beliebig. Wir können die Größe basierend auf der Größe des Speichers festlegen , der für die Übergabe der Daten vom InputStream an den OutputStream angemessen ist . je kleiner der Nuber, desto mehr Schleifen; Je größer die Zahl, desto höher die Speichernutzung.

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

3.5. Schließen und spülen

Stream- Instanzen müssen nach der Verwendung geschlossen werden, um die derzeit gehaltenen Ressourcen freizugeben. Writer- Instanzen müssen ebenfalls geleert werden, um alle verbleibenden gepufferten Bytes in das Ziel zu schreiben.

Mit Hilfe eines Try-mit-Ressourcen - Anweisung, wird die Anwendung automatisch schließen jede AutoCloseable Instanz im Rahmen der definierten try - Anweisung. Lesen Sie hier mehr über das Ausprobieren von Ressourcen.

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

3.6. Herunterladen der Datei

Nachdem alles 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 sind.

Es ist Sache des Browsers, zu bestimmen, wie mit der Antwort umgegangen werden soll. Wir können jedoch einige Richtlinien für den Content-Disposition- Header angeben.

Der gesamte Code in diesem Artikel ist auf GitHub zu finden.