Exempel på nedladdning av fil i en Servlet

1. Översikt

Ett vanligt inslag i webbapplikationer är möjligheten att ladda ner filer.

I denna handledning kommer vi att täcka ett enkelt exempel på hur du skapar en nedladdningsbar fil och serverar den från ett Java Servlet-program .

Filen vi använder kommer från webapps resurser.

2. Maven Beroenden

Om du använder Jakarta EE behöver vi inte lägga till några beroenden. Men om vi använder Java SE behöver vi beroende av javax.servlet-api:

 javax.servlet javax.servlet-api 4.0.1 provided  

Den senaste versionen av beroendet finns här.

3. Servlet

Låt oss ta en titt på koden först och sedan ta reda på vad som händer:

@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. Begär slutpunkt

@WebServlet (“/ download”) -anteckningen markerar DownloadServlet- klassen för att betjäna förfrågningar riktade till slutpunkten “/ download” .

Alternativt kan vi göra detta genom att beskriva kartläggningen i web.xml-filen.

3.2. Svar Innehållstyp

Den HttpServletResponse objekt har en metod som kallas som setContentType som vi kan använda för att ställa in Content-Type header av HTTP-svaret.

Content-Type är det historiska namnet på header-egenskapen. Ett annat namn var MIME-typen (Multipurpose Internet Mail Extensions). Vi hänvisar nu helt enkelt till värdet som mediatyp.

Detta värde kan vara "applikation / pdf", "text / vanlig", "text / html", "bild / jpg", etc. , den officiella listan underhålls av Internet Assigned Numbers Authority (IANA) och kan hittas här .

För vårt exempel använder vi en enkel textfil. Den Content-Type för en textfil är ”text / plain”.

3.3. Svar Innehåll-Disposition

När du ställer in rubriken Content-Disposition i svarsobjektet berättar webbläsaren hur filen hanteras.

Webbläsare förstår användningen av Content-Disposition som en konvention men det är faktiskt inte en del av HTTP-standarden. W3 har ett memo om användningen av Content-Disposition som finns att läsa här.

De Content-Disposition värden för huvuddelen av ett svar kommer att vara antingen ”inline” (för innehållet på webbsidan som ska göras) eller ”attachment” (för en nedladdningsbar fil).

Om inget anges standard Content-Disposition är ”inline”.

Med hjälp av en valfri huvudparameter kan vi ange filnamnet "sample.txt".

Vissa webbläsare laddar omedelbart ner filen med det angivna filnamnet och andra visar en nedladdningsdialog med vårt fördefinierade värde.

Den exakta åtgärden som vidtas beror på webbläsaren.

3.4. Läser från fil och skriver till utdataström

I de återstående kodraderna tar vi ServletContext från begäran och använder den för att hämta filen på “/WEB-INF/sample.txt”.

Med hjälp av HttpServletResponse # getOutputStream () läser vi sedan från resursens inmatningsström och skriver till svarets OutputStream .

Storleken på byte-arrayen vi använder är godtycklig. Vi kan bestämma storleken baserat på hur mycket minne som är rimligt att allokera för överföring av data från InputStream till OutputStream ; ju mindre nuber desto fler öglor; ju större antal desto högre minnesanvändning.

Denna cykel fortsätter tills numByteRead är 0 eftersom det indikerar slutet på filen.

3.5. Stäng och spola

Stream fall måste stängas efter användning för att släppa några resurser som för närvarande håller. Författarinstanser måste också spolas för att skriva eventuella återstående buffrade byte till sin destination.

Med hjälp av ett försök-med-resurser- uttalande stänger applikationen automatiskt alla inställningar som kan stängas av automatiskt som definierats som en del av försöksuttrycket . Läs mer om försök med resurser här.

Vi använder dessa två metoder för att frigöra minne, vilket säkerställer att de data vi har förberett skickas ut från vår applikation.

3.6. Hämtar filen

Med allt på plats är vi nu redo att köra vår Servlet.

Nu när vi besöker den relativa slutpunkten "/ download" , kommer vår webbläsare att försöka ladda ner filen som "simple.txt".

4. Slutsats

Nedladdning av en fil från en Servlet blir en enkel process. Med hjälp av strömmar kan vi skicka ut data som byte och mediatyperna informerar klientens webbläsare vilken typ av data vi kan förvänta oss.

Det är upp till webbläsaren att avgöra hur svaret ska hanteras, men vi kan ge några riktlinjer med Content-Disposition- rubriken.

All kod i den här artikeln finns över på GitHub.