Caricamento e download di file JSP
⚡ Riepilogo intelligente
Il caricamento e il download di file in JSP sono operazioni di input e output fondamentali che consentono a un'applicazione web di ricevere file dagli utenti e di restituirli loro. Questa risorsa illustra entrambi i flussi utilizzando i moduli di azione JSP, Apache Commons FileUpload e le classi servlet, con codice completo e funzionante.

Caricamento file JSP
- Possiamo caricare qualsiasi file utilizzando JSP.
- Può essere un file di testo, un file binario, un file di immagine o qualsiasi altro documento.
- In caso di caricamento di file verrà utilizzato solo il metodo POST e non il metodo GET.
- L'attributo Enctype deve essere impostato su multipart/form-data.
Esempio: utilizzo dell'azione
In questo esempio, carichiamo un file utilizzando un oggetto IO.
File_azione.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Guru File</title> </head> <body> <a>Guru File Upload:</a> Select file: <br /> <form action="action_file_upload.jsp" method="post" enctype="multipart/form-data"> <input type="file" name="file" size="50" /> <br /> <input type="submit" value="Upload File" /> </form> </body> </html>
Action_file_upload.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@ page import="java.io.*,java.util.*, javax.servlet.*" %> <%@ page import="javax.servlet.http.*" %> <%@ page import="org.apache.commons.fileupload.*" %> <%@ page import="org.apache.commons.fileupload.disk.*" %> <%@ page import="org.apache.commons.fileupload.servlet.*" %> <%@ page import="org.apache.commons.io.output.*" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Guru File Upload</title> </head> <body> <% File file ; int maxFileSize = 5000 * 1024; int maxMemSize = 5000 * 1024; String filePath = "E:/guru99/data"; String contentType = request.getContentType(); if ((contentType.indexOf("multipart/form-data") >= 0)) { DiskFileItemFactory factory = new DiskFileItemFactory(); factory.setSizeThreshold(maxMemSize); factory.setRepository(new File("c:\\temp")); ServletFileUpload upload = new ServletFileUpload(factory); upload.setSizeMax( maxFileSize ); try{ List fileItems = upload.parseRequest(request); Iterator i = fileItems.iterator(); out.println("<html>"); out.println("<body>"); while ( i.hasNext () ) { FileItem fi = (FileItem)i.next(); if ( !fi.isFormField () ) { String fieldName = fi.getFieldName(); String fileName = fi.getName(); boolean isInMemory = fi.isInMemory(); long sizeInBytes = fi.getSize(); file = new File( filePath + "yourFileName") ; fi.write( file ) ; out.println("Uploaded Filename: " + filePath + fileName + "<br>"); } } out.println("</body>"); out.println("</html>"); }catch(Exception ex) { System.out.println(ex); } }else{ out.println("<html>"); out.println("<body>"); out.println("<p>No file uploaded</p>"); out.println("</body>"); out.println("</html>"); } %> </body> </html>
Spiegazione del codice:
File_azione.jsp
Code Linea 12-18: Qui stiamo creando un modulo con un campo file, che caricherà un file sul server, e l'azione verrà passata a action_file_upload.jsp.
Action_file_upload.jsp
Code Linea 20: Qui stiamo specificando il percorso del file verso un percorso specifico.
Code Linea 23-38: Qui controlliamo se il tipo di contenuto è multipart/form-data. In tal caso, il contenuto è di tipo file e viene letto. Dopo la lettura, il file viene scritto in un file temporaneo, che viene poi convertito nel file principale.
Quando esegui il codice sopra, ottieni il seguente output:
Produzione:
Stiamo caricando un file utilizzando l'opzione "Scegli file" e il pulsante "Carica file" caricherà il file sul server nel percorso specificato.
Esempio: utilizzo delle operazioni JSP
In questo esempio, caricheremo un file utilizzando operazioni JSP. Useremo un modulo con un pulsante "Carica" e, quando si fa clic su questo pulsante, il file verrà caricato.
Caricamento_1.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Guru Uploading File</title> </head> <body> File: <br /> <form action="guru_upload" method="post" enctype="multipart/form-data"> <input type="file" name="guru_file" size="50" /> <br /> <input type="submit" value="Upload" /> </form> </body> </html>
Spiegazione del codice:
Code Linea 11-12: Qui stiamo prendendo un modulo che ha un'azione sulla servlet guru_upload, che passerà attraverso il metodo POST. Inoltre, qui l'attributo enctype specifica come i dati del modulo devono essere codificati e inviati al server e viene utilizzato solo con il metodo POST. Qui lo impostiamo su multipart/form-data, che è per il file (poiché i dati saranno di grandi dimensioni).
Code Linea 13: Qui stiamo specificando l'elemento guru_file con tipo file e impostando la dimensione a 50.
Code Linea 15: Si tratta di un pulsante di invio denominato "Carica", tramite il quale verrà richiamata la servlet di azione, che elaborerà la richiesta e leggerà e scriverà il file al suo interno.
Guru_upload.java
package demotest; import java.io.File; import java.io.IOException; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; public class guru_upload extends HttpServlet { private static final long serialVersionUID = 1L; public guru_upload() { super(); // TODO Auto-generated constructor stub } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { if(ServletFileUpload.isMultipartContent(request)){ try { List <FileItem> multiparts = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request); for(FileItem item : multiparts){ if(!item.isFormField()){ String name = new File(item.getName()).getName(); item.write( new File("c:/guru/upload" + File.separator + name)); } } //File uploaded successfully request.setAttribute("gurumessage", "File Uploaded Successfully"); } catch (Exception ex) { request.setAttribute("gurumessage", "File Upload Failed due to " + ex); } }else{ request.setAttribute("gurumessage","No File found"); } request.getRequestDispatcher("/result.jsp").forward(request, response); } }
Spiegazione del codice:
Code Linea 12-14: Qui dovremo importare la libreria org.apache.commons nella configurazione del codice. Dovremo importare la classe fileupload dalla libreria org.apache.commons.
Code Linea 23: Qui abbiamo il metodo doPost(), che verrà chiamato quando passiamo il metodo POST in JSP e accetterà come parametri gli oggetti request e response.
Code Linea 26: Qui creiamo un oggetto della classe ServletFileUpload dal pacchetto fileUpload della libreria org.apache.commons, che verificherà se sono presenti oggetti file nella JSP. Se ne vengono trovati, tali oggetti file verranno prelevati dalla richiesta.
Code Linea 27-32: Itereremo sul numero di file controllando quanti elementi file sono presenti nell'oggetto multiparts, che è un oggetto lista (se carichiamo più di un file), e lo salveremo nella cartella c:/guru/upload con il nome file fornito. Scriveremo il file utilizzando il metodo write dell'oggetto file nella cartella specificata.
Code Linea 34: Se non si verifica alcuna eccezione, impostiamo un attributo nella richiesta denominato gurumessage con il valore "File caricato correttamente".
Code Linea 35-36: Se si verifica un'eccezione, visualizziamo il messaggio "Caricamento del file non riuscito".
Code Linea 40: Se il file non viene trovato, impostiamo il messaggio su "File non trovato".
Code Linea 42: Inoltro della richiesta tramite l'oggetto requestdispatcher a result.jsp con gli oggetti request e response.
Risultato.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Guru Result</title> </head> <body> <% String msg = (String)request.getAttribute("message"); out.println(msg); %> </body> </html>
Spiegazione del codice:
Code Linea 10: Qui stiamo recuperando l'attributo dall'oggetto request con il valore gurumessage e lo stiamo convertendo in una stringa.
Code Linea 11: Qui stiamo stampando quel messaggio.
Quando eseguiamo il codice sopra, otteniamo il seguente output:
Produzione:
Viene visualizzato un modulo contenente dei campi per selezionare un file dalla directory. Una volta selezionato il file, è necessario fare clic sul pulsante "Carica".
Una volta cliccato sul pulsante di caricamento, viene visualizzato il messaggio che il file è stato caricato correttamente.
Nel diagramma sottostante, possiamo vedere che il file è stato caricato nella cartella c:/guru/upload.
Scarica file JSP
In questo esempio, scaricheremo un file da una directory facendo clic sul pulsante.
Download_1.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Downloading Guru Example</title> </head> <body> Guru Downloading File<a href="guru_download">Download here!!!</a> </body> </html>
Spiegazione del codice:
Code Linea 10: Qui abbiamo fornito un collegamento per scaricare un file dalla cartella c:/guru/upload utilizzando la servlet guru_download.
Guru_download.java
package demotest; import java.io.FileInputStream; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet implementation class guru_download */ public class guru_download extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); String gurufile = "test.txt"; String gurupath = "c:/guru/upload/"; response.setContentType("APPLICATION/OCTET-STREAM"); response.setHeader("Content-Disposition", "attachment; filename=\"" + gurufile + "\""); FileInputStream fileInputStream = new FileInputStream(gurupath + gurufile); int i; while ((i = fileInputStream.read()) != -1) { out.write(i); } fileInputStream.close(); out.close(); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub } }
Spiegazione del codice:
Code Linea 3-5: Qui stiamo importando FileInputStream, IOException e Print.Writer dal pacchetto java.io.
Code Linea 15: Stiamo definendo il guru_download servlet che estende HttpServlet.
Code Linea 18: Come abbiamo definito un href, che sarà racchiuso in un URL, quindi il metodo GET verrà elaborato (doGet verrà chiamato nella servlet), che include anche gli oggetti richiesta e risposta.
Code Linea 19-20: Stiamo impostando il tipo di contenuto nell'oggetto di risposta e recuperando l'oggetto scrittore dalla risposta.
Code Linea 21-22: Definizione di una variabile denominata gurufile con valore test.txt e gurupath come c:/guru/upload/.
Code Linea 23-25: Stiamo impostando il tipo di contenuto utilizzando l'oggetto di risposta e utilizziamo il metodo setHeader, che imposta l'intestazione nell'oggetto di risposta con il nome del file che è stato caricato.
Code Linea 27-28: Stiamo creando un FileInputStream in cui aggiungeremo gurupath+gurufile.
Code Linea 31-33: Qui abbiamo preso a mentre il ciclo che verrà eseguito finché il file non sarà letto, quindi abbiamo impostato la condizione come != -1. In questa condizione, stiamo scrivendo utilizzando l'oggetto printwriter out.
Eseguendo il codice sopra riportato, otterrai il seguente output:
Produzione:
Dobbiamo cliccare su downloading_1.jsp e otterremo un collegamento ipertestuale con la dicitura "Scarica qui". Cliccando su questo collegamento, il file verrà scaricato nel sistema.





