Eksempel på nedlasting av fil i en Servlet

1. Oversikt

Et vanlig trekk ved webapplikasjoner er muligheten til å laste ned filer.

I denne veiledningen, vi dekker et enkelt eksempel på å lage en nedlastbar fil og servere den fra et Java Servlet-program.

Filen vi bruker kommer fra webapp-ressursene.

2. Maven-avhengigheter

Hvis du bruker Jakarta EE, trenger vi ikke legge til noen avhengigheter. Men hvis vi bruker Java SE, trenger vi avhengigheten av javax.servlet-api:

 javax.servlet javax.servlet-api 4.0.1 gitt 

Den siste versjonen av avhengigheten finner du her.

3. Servlet

La oss ta en titt på koden først og deretter finne ut hva som skjer:

@WebServlet ("/ download") offentlig klasse DownloadServlet utvider HttpServlet {private final int ARBITARY_SIZE = 1048; @ Override beskyttet ugyldig doGet (HttpServletRequest req, HttpServletResponse resp) kaster ServletException, IOException {resp.setContentType ("text / plain"); resp.setHeader ("Content-disposition", "vedlegg; 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. Be om sluttpunkt

@WebServlet (“/ last ned”) merknader markerer Last nedServlet klasse for å betjene forespørsler rettet mot "/nedlasting" sluttpunkt.

Alternativt kan vi gjøre dette ved å beskrive kartleggingen i web.xml-filen.

3.2. Respons Innholdstype

De HttpServletResponse objektet har en metode som kalles som setContentType som vi kan bruke til å stille inn Innholdstype overskrift på HTTP-responsen.

Innholdstype er det historiske navnet på topptekstegenskapen. Et annet navn var MIME-typen (Multipurpose Internet Mail Extensions). Vi refererer nå bare til verdien som medietype.

Denne verdien kan være "application / pdf", "text / plain", "text / html", "image / jpg", etc., den offisielle listen vedlikeholdes av Internet Assigned Numbers Authority (IANA) og finner du her.

For vårt eksempel bruker vi en enkel tekstfil. De Innholdstype for en tekstfil er “tekst / vanlig”.

3.3. Respons Innhold-disposisjon

Sette inn Innhold-disposisjon overskrift i svarobjektet forteller nettleseren hvordan den skal håndtere filen den får tilgang til.

Nettlesere forstår bruken av Innhold-disposisjon som en konvensjon, men det er faktisk ikke en del av HTTP-standarden. W3 har et notat om bruken av Innhold-disposisjon tilgjengelig for å lese her.

De Innhold-disposisjon Verdiene for hoveddelen av et svar vil være enten "innebygd" (for innhold på websiden som skal gjengis) eller "vedlegg" (for en nedlastbar fil).

Hvis ikke spesifisert, er standard Innhold-disposisjon er "inline".

Ved å bruke en valgfri headerparameter kan vi spesifisere filnavnet "sample.txt".

Noen nettlesere vil umiddelbart laste ned filen ved hjelp av det gitte filnavnet, og andre vil vise en nedlastingsdialog som inneholder vår forhåndsdefinerte verdi.

Den nøyaktige handlingen som tas, vil avhenge av nettleseren.

3.4. Lesing fra fil og skriving til utdatastrøm

I de resterende kodelinjene tar vi ServletContext fra forespørselen, og bruk den til å skaffe filen på “/WEB-INF/sample.txt”.

Ved hjelp av HttpServletResponse#getOutputStream (), så leser vi fra inngangsstrømmen til ressursen og skriver til svarene OutputStream.

Størrelsen på byte-arrayet vi bruker er vilkårlig. Vi kan bestemme størrelsen basert på hvor mye minne som er rimelig å allokere til å overføre data fra InputStream til OutputStream; jo mindre nuber, jo flere løkker; jo større tall, jo høyere minnebruk.

Denne syklusen fortsetter til numByteRead er 0 som indikerer slutten av filen.

3.5. Lukk og skyll

Strøm Forekomster må lukkes etter bruk for å frigjøre ressurser det for øyeblikket har. Forfatter Forekomster må også skylles for å skrive gjenværende buffrede byte til destinasjonen.

Bruker en prøv-med-ressurser uttalelse, vil applikasjonen automatisk Lukk noen Kan lukkes automatisk forekomst definert som en del av prøve uttalelse. Les mer om prøv-med-ressurser her.

Vi bruker disse to metodene for å frigjøre minne, og sørger for at dataene vi har utarbeidet blir sendt ut fra applikasjonen vår.

3.6. Laste ned filen

Med alt på plass er vi nå klare til å kjøre vår Servlet.

Nå når vi besøker det relative sluttpunktet "/nedlasting"vil nettleseren vår prøve å laste ned filen som “simple.txt”.

4. Konklusjon

Nedlasting av en fil fra en Servlet blir en enkel prosess. Ved å bruke strømmer kan vi sende ut dataene som byte, og medietyper informerer klientleseren om hvilken type data vi kan forvente.

Det er opp til nettleseren å bestemme hvordan svaret skal håndteres, men vi kan gi noen retningslinjer med Innhold-disposisjon Overskrift.

All kode i denne artikkelen kan bli funnet på GitHub.


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