Eksempel på download af fil i en servlet

1. Oversigt

Et fælles træk ved webapplikationer er muligheden for at downloade filer.

I denne vejledning vi dækker et simpelt eksempel på oprettelse af en fil, der kan downloades og serveres fra en Java Servlet-applikation.

Den fil, vi bruger, kommer fra webapp-ressourcerne.

2. Maven-afhængigheder

Hvis du bruger Jakarta EE, behøver vi ikke tilføje afhængigheder. Men hvis vi bruger Java SE, har vi brug for javax.servlet-api-afhængigheden:

 javax.servlet javax.servlet-api 4.0.1 leveret 

Den seneste version af afhængigheden kan findes her.

3. Servlet

Lad os først se på koden og derefter finde ud af, hvad der foregår:

@WebServlet ("/ download") offentlig klasse DownloadServlet udvider HttpServlet {private final int ARBITARY_SIZE = 1048; @ Override beskyttet ugyldigt doGet (HttpServletRequest req, HttpServletResponse resp) kaster ServletException, IOException {resp.setContentType ("text / plain"); resp.setHeader ("Indholdsdisposition", "vedhæftet fil; filnavn = sample.txt"); prøv (InputStream in = req.getServletContext (). getResourceAsStream ("/ WEB-INF / sample.txt"); OutputStream out = resp.getOutputStream ()) {byte [] buffer = ny byte [ARBITARY_SIZE]; int numBytesRead; mens ((numBytesRead = in.read (buffer))> 0) {out.write (buffer, 0, numBytesRead); }}}}

3.1. Anmod om slutpunkt

@WebServlet (“/ download”) kommentar markerer DownloadServlet klasse til at betjene anmodninger rettet mod "/Hent" slutpunkt.

Alternativt kan vi gøre dette ved at beskrive kortlægningen i web.xml-filen.

3.2. Respons Indholdstype

Det HttpServletResponse objekt har en metode kaldet som setContentType som vi kan bruge til at indstille Indholdstype overskrift på HTTP-svaret.

Indholdstype er det historiske navn på headeregenskaben. Et andet navn var MIME-typen (Multipurpose Internet Mail Extensions). Vi henviser nu blot til værdien som medietype.

Denne værdi kan være "applikation / pdf", "tekst / almindelig", "tekst / html", "billede / jpg" osv., den officielle liste vedligeholdes af Internet Assigned Numbers Authority (IANA) og kan findes her.

Til vores eksempel bruger vi en simpel tekstfil. Det Indholdstype for en tekstfil er “tekst / almindelig”.

3.3. Respons Indhold-disposition

Indstilling af Indhold-disposition header i responsobjektet fortæller browseren, hvordan den skal håndtere den fil, den får adgang til.

Browsere forstår brugen af Indhold-disposition som en konvention, men det er faktisk ikke en del af HTTP-standarden. W3 har et notat om brugen af Indhold-disposition tilgængelig for at læse her.

Det Indhold-disposition værdierne for hoveddelen af ​​et svar er enten "indbygget" (for websideindhold, der skal gengives) eller "vedhæftet fil" (for en fil, der kan downloades).

Hvis ikke angivet, er standard Indhold-disposition er "inline".

Ved hjælp af en valgfri headerparameter kan vi angive filnavnet "sample.txt".

Nogle browsere downloader straks filen ved hjælp af det givne filnavn, og andre viser en download-dialog, der indeholder vores foruddefinerede værdi.

Den nøjagtige handling, der træffes, afhænger af browseren.

3.4. Læsning fra fil og skrivning til outputstream

I de resterende kodelinjer tager vi ServletContext fra anmodningen, og brug den til at hente filen på “/WEB-INF/sample.txt”.

Ved brug af HttpServletResponse#getOutputStream (), læser vi derefter fra ressourceens inputstrøm og skriver til svarets OutputStream.

Størrelsen på det byte-array, vi bruger, er vilkårlig. Vi kan bestemme størrelsen baseret på den mængde hukommelse, der er rimelig at allokere til at videregive data fra InputStream til OutputStream; jo mindre nuber, jo flere sløjfer; jo større antal, jo højere hukommelsesforbrug.

Denne cyklus fortsætter indtil numByteRead er 0, da det angiver slutningen af ​​filen.

3.5. Luk og skyl

Strøm forekomster skal lukkes efter brug for at frigøre de ressourcer, det i øjeblikket har. Forfatter forekomster skal også skylles for at skrive eventuelle resterende bufrede byte til dens destination.

Brug af en prøv med ressourcer erklæring, vil applikationen automatisk tæt nogen Kan lukkes automatisk instans defineret som en del af prøve udmelding. Læs mere om prøv-med-ressourcer her.

Vi bruger disse to metoder til at frigøre hukommelse og sikre, at de data, vi har forberedt, sendes ud fra vores applikation.

3.6. Download af filen

Med alt på plads er vi nu klar til at køre vores Servlet.

Nu når vi besøger det relative slutpunkt "/Hent", vil vores browser forsøge at downloade filen som “simple.txt”.

4. Konklusion

Download af en fil fra en Servlet bliver en simpel proces. Brug af streams giver os mulighed for at videregive dataene som bytes, og medietyperne informerer klientbrowseren om, hvilken type data vi kan forvente.

Det er op til browseren at afgøre, hvordan svaret skal håndteres, men vi kan give nogle retningslinjer med Indhold-disposition header.

Al kode i denne artikel kan findes over på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found