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.

  • ๐Ÿ“ค Nozioni di base sul caricamento: Utilizza il metodo POST e imposta enctype su multipart/form-data per qualsiasi caricamento di file.
  • ๐Ÿงฉ Apache Commons: DiskFileItemFactory e ServletFileUpload analizzano la richiesta multipart suddividendola in elementi file.
  • ๐Ÿ—‚๏ธ Gestione delle servlet: Il metodo doPost scorre gli elementi del file e scrive ciascuno di essi in una cartella di destinazione.
  • ๐Ÿ“ฅ Scarica Flow: Una servlet trasmette in streaming un file utilizzando FileInputStream e l'intestazione Content-Disposition.
  • โš™๏ธ Configurazione: Prima di leggere o scrivere un file, รจ necessario impostare i percorsi, i limiti di dimensione e il tipo di contenuto.

Caricamento e download di file JSP

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:

Caricamento file JSP

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".

Caricamento file utilizzando operazioni JSP

Una volta cliccato sul pulsante di caricamento, viene visualizzato il messaggio che il file รจ stato caricato correttamente.

Caricamento file utilizzando operazioni JSP

Nel diagramma sottostante, possiamo vedere che il file รจ stato caricato nella cartella c:/guru/upload.

Caricamento file utilizzando operazioni JSP

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:

Download del file

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.

DOMANDE FREQUENTI

Sรฌ. Gli assistenti basati sull'IA possono generare automaticamente servlet e moduli JSP per il caricamento e il download di file, aggiungere la logica di caricamento file di Apache Commons e suggerire la validazione. รˆ comunque consigliabile testare il codice e verificare i percorsi dei file e i limiti di dimensione.

Sรฌ. Gli scanner basati sull'intelligenza artificiale possono ispezionare i file caricati alla ricerca di malware, tipi inattesi o payload di dimensioni eccessive prima che vengano archiviati. Questo aggiunge un ulteriore livello di protezione, sebbene la convalida lato server del tipo e delle dimensioni rimanga essenziale.

La codifica multipart/form-data divide la richiesta in parti in modo che i dati del file binario siano transmitted intatto. Senza di esso, il browser invia al server solo il nome del file, non il contenuto effettivo del file.

Apache Commons FileUpload, insieme a Commons IO, รจ ampiamente utilizzato. Analizza le richieste multipart, espone ogni FileItem e scrive il contenuto caricato in una directory scelta sul server.

Riassumi questo post con: