Primjer preuzimanja datoteke u servletu

1. Pregled

Zajednička značajka web aplikacija je mogućnost preuzimanja datoteka.

U ovom vodiču, pokrivat ćemo jednostavan primjer stvaranja datoteke za preuzimanje i posluživanja iz aplikacije Java Servlet.

Datoteka koju koristimo bit će iz resursa webappa.

2. Ovisnosti Mavena

Ako upotrebljavate Jakarta EE, ne bismo trebali dodavati nikakve ovisnosti. Međutim, ako koristimo Java SE, trebat će nam ovisnost javax.servlet-api:

 javax.servlet javax.servlet-api 4.0.1 

Najnoviju verziju ovisnosti možete pronaći ovdje.

3. Servlet

Prvo pogledajmo kod, a zatim saznajmo što se događa:

@WebServlet ("/ download") javna klasa DownloadServlet proširuje HttpServlet {private final int ARBITARY_SIZE = 1048; @Override protected void doGet (HttpServletRequest req, HttpServletResponse resp) baca ServletException, IOException {resp.setContentType ("text / plain"); resp.setHeader ("Dispozicija sadržaja", "privitak; ime datoteke = sample.txt"); probajte (InputStream u = req.getServletContext (). getResourceAsStream ("/ WEB-INF / sample.txt"); OutputStream out = resp.getOutputStream ()) {byte [] buffer = novi bajt [ARBITARY_SIZE]; int numBytesRead; while ((numBytesRead = in.read (buffer))> 0) {out.write (buffer, 0, numBytesRead); }}}}

3.1. Zatraži krajnju točku

@WebServlet (“/ preuzimanje”) napomena označava DownloadServlet klase za posluživanje zahtjeva usmjerenih na "/preuzimanje datoteka" krajnja točka.

Alternativno, to možemo učiniti opisivanjem mapiranja u datoteci web.xml.

3.2. Odgovor Vrsta sadržaja

The HttpServletResponse objekt ima metodu koja se naziva kao setContentType pomoću koje možemo postaviti Vrsta sadržaja zaglavlje HTTP odgovora.

Vrsta sadržaja je povijesni naziv svojstva zaglavlja. Drugi naziv bio je MIME tip (Višenamjenska proširenja internetske pošte). Sada vrijednost jednostavno nazivamo Vrsta medija.

Ova vrijednost može biti "application / pdf", "text / plain", "text / html", "image / jpg" itd., službeni popis održava IANA (Internet Assigned Numbers Authority) i možete ga pronaći ovdje.

Za naš primjer koristimo jednostavnu tekstualnu datoteku. The Vrsta sadržaja jer je tekstualna datoteka "text / plain".

3.3. Odgovor Sadržaj-Dispozicija

Postavljanje Sadržaj-Dispozicija zaglavlje u objektu odgovora govori pregledniku kako postupati s datotekom kojoj pristupa.

Preglednici razumiju upotrebu Sadržaj-Dispozicija kao konvencija, ali zapravo nije dio HTTP standarda. W3 ima bilješku o upotrebi Sadržaj-Dispozicija dostupno za čitanje ovdje.

The Sadržaj-Dispozicija vrijednosti za glavno tijelo odgovora bit će ili „umetnuti“ (za prikaz web stranice) ili „privitak“ (za datoteku koja se može preuzeti).

Ako nije navedeno, zadano Sadržaj-Dispozicija je "inline".

Koristeći opcijski parametar zaglavlja, možemo odrediti naziv datoteke "sample.txt".

Neki će preglednici datoteku odmah preuzeti pomoću datog imena, a drugi će prikazati dijaloški okvir za preuzimanje koji sadrži našu unaprijed definiranu vrijednost.

Točna poduzeta radnja ovisit će o pregledniku.

3.4. Čitanje iz datoteke i pisanje u izlazni tok

U preostale retke koda uzimamo ServletContext iz zahtjeva i upotrijebite ga za dobivanje datoteke na “/WEB-INF/sample.txt”.

Koristeći HttpServletResponse#getOutputStream (), tada čitamo iz ulaznog toka resursa i upisujemo u odgovor Izlazni tok.

Veličina bajt polja koju koristimo je proizvoljna. Možemo odlučiti veličinu na temelju količine memorije koju je razumno dodijeliti za prosljeđivanje podataka iz InputStream prema Izlazni tok; što je manji nuber, to je više petlji; što je veći broj, veća je upotreba memorije.

Ovaj se ciklus nastavlja do numByteRead je 0 jer to označava kraj datoteke.

3.5. Zatvori i ispiraj

Stream instance moraju biti zatvorene nakon upotrebe da bi se oslobodili svi resursi koje trenutno drži. Pisac instancije se također moraju isprati da bi se zabilježili preostali baferirani bajtovi na odredište.

Korištenje a pokušajte s resursima izjava, aplikacija će automatski Zatvoriti bilo koji AutoCloseable instanca definirana kao dio probati izjava. Pročitajte više o pokušaju s resursima ovdje.

Ove dvije metode koristimo za oslobađanje memorije, osiguravajući da se podaci koje smo pripremili šalju iz naše aplikacije.

3.6. Preuzimanje datoteke

Sa svime na svom mjestu, sada smo spremni pokrenuti naš Servlet.

Sad kad posjetimo relativnu krajnju točku "/preuzimanje datoteka", naš će preglednik pokušati preuzeti datoteku kao "simple.txt".

4. Zaključak

Preuzimanje datoteke s Servleta postaje jednostavan postupak. Korištenje streamova omogućuje nam da podatke proslijedimo u bajtovima, a vrste medija informiraju klijentski preglednik koju vrstu podataka očekuje.

Na pregledniku je da utvrdi kako će postupati s odgovorom, međutim, možemo dati neke smjernice s Sadržaj-Dispozicija Zaglavlje.

Sav kôd u ovom članku možete pronaći preko GitHub-a.


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