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.






