Servlet - Caricamento di file

È possibile utilizzare un servlet con un tag del modulo HTML per consentire agli utenti di caricare file sul server. Un file caricato potrebbe essere un file di testo, un file di immagine o qualsiasi documento.

Creazione di un modulo di caricamento file

Il seguente codice HTM di seguito crea un modulo di caricamento. Di seguito sono riportati i punti importanti da annotare:

  • Il modulo method l'attributo dovrebbe essere impostato su POST il metodo e il metodo GET non possono essere utilizzati

  • Il modulo enctype l'attributo dovrebbe essere impostato su multipart/form-data.

  • Il modulo actionl'attributo deve essere impostato su un file servlet che gestisca il caricamento dei file sul server di backend. L'esempio seguente sta usandoUploadServlet servlet per caricare il file.

  • Per caricare un singolo file devi utilizzare un unico tag <input ... /> con attributo type = "file". Per consentire il caricamento di più file, includi più di un tag di input con valori diversi per l'attributo name. Il browser associa un pulsante Sfoglia a ciascuno di essi.

<html>
   <head>
      <title>File Uploading Form</title>
   </head>
   
   <body>
      <h3>File Upload:</h3>
      Select a file to upload: <br />
      <form action = "UploadServlet" method = "post" enctype = "multipart/form-data">
         <input type = "file" name = "file" size = "50" />
         <br />
         <input type = "submit" value = "Upload File" />
      </form>
   </body>
</html>

Questo mostrerà il seguente risultato che consentirebbe di selezionare un file dal PC locale e quando l'utente farebbe clic su "Carica file", il modulo verrà inviato insieme al file selezionato -

File Upload: 
Select a file to upload: 


NOTE: This is just dummy form and would not work.

Scrittura del servlet di backend

Di seguito è riportato il servlet UploadServletche si occuperebbe di accettare il file caricato e di memorizzarlo nella directory <Tomcat-installation-directory> / webapps / data. Questo nome di directory può anche essere aggiunto utilizzando una configurazione esterna come un filecontext-param elemento in web.xml come segue:

<web-app>
   ....
   <context-param> 
      <description>Location to store uploaded file</description> 
      <param-name>file-upload</param-name> 
      <param-value>
         c:\apache-tomcat-5.5.29\webapps\data\
      </param-value> 
   </context-param>
   ....
</web-app>

Di seguito è riportato il codice sorgente per UploadServlet che può gestire il caricamento di più file alla volta. Prima di procedere devi assicurarti quanto segue:

  • L'esempio seguente dipende da FileUpload, quindi assicurati di avere l'ultima versione di commons-fileupload.x.x.jarfile nel tuo classpath. Puoi scaricarlo dahttps://commons.apache.org/fileupload/.

  • FileUpload dipende da Commons IO, quindi assicurati di avere l'ultima versione di commons-io-x.x.jarfile nel tuo classpath. Puoi scaricarlo dahttps://commons.apache.org/io/.

  • Durante il test del seguente esempio, è necessario caricare un file di dimensioni inferiori a maxFileSize altrimenti il ​​file non verrà caricato.

  • Assicurati di aver creato le directory c: \ temp ec: \ apache-tomcat8.0.28 \ webapps \ data con largo anticipo.

// Import required java libraries
import java.io.*;
import java.util.*;
 
import javax.servlet.ServletConfig;
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.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.output.*;

public class UploadServlet extends HttpServlet {
   
   private boolean isMultipart;
   private String filePath;
   private int maxFileSize = 50 * 1024;
   private int maxMemSize = 4 * 1024;
   private File file ;

   public void init( ){
      // Get the file location where it would be stored.
      filePath = getServletContext().getInitParameter("file-upload"); 
   }
   
   public void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, java.io.IOException {
   
      // Check that we have a file upload request
      isMultipart = ServletFileUpload.isMultipartContent(request);
      response.setContentType("text/html");
      java.io.PrintWriter out = response.getWriter( );
   
      if( !isMultipart ) {
         out.println("<html>");
         out.println("<head>");
         out.println("<title>Servlet upload</title>");  
         out.println("</head>");
         out.println("<body>");
         out.println("<p>No file uploaded</p>"); 
         out.println("</body>");
         out.println("</html>");
         return;
      }
  
      DiskFileItemFactory factory = new DiskFileItemFactory();
   
      // maximum size that will be stored in memory
      factory.setSizeThreshold(maxMemSize);
   
      // Location to save data that is larger than maxMemSize.
      factory.setRepository(new File("c:\\temp"));

      // Create a new file upload handler
      ServletFileUpload upload = new ServletFileUpload(factory);
   
      // maximum file size to be uploaded.
      upload.setSizeMax( maxFileSize );

      try { 
         // Parse the request to get file items.
         List fileItems = upload.parseRequest(request);
	
         // Process the uploaded file items
         Iterator i = fileItems.iterator();

         out.println("<html>");
         out.println("<head>");
         out.println("<title>Servlet upload</title>");  
         out.println("</head>");
         out.println("<body>");
   
         while ( i.hasNext () ) {
            FileItem fi = (FileItem)i.next();
            if ( !fi.isFormField () ) {
               // Get the uploaded file parameters
               String fieldName = fi.getFieldName();
               String fileName = fi.getName();
               String contentType = fi.getContentType();
               boolean isInMemory = fi.isInMemory();
               long sizeInBytes = fi.getSize();
            
               // Write the file
               if( fileName.lastIndexOf("\\") >= 0 ) {
                  file = new File( filePath + fileName.substring( fileName.lastIndexOf("\\"))) ;
               } else {
                  file = new File( filePath + fileName.substring(fileName.lastIndexOf("\\")+1)) ;
               }
               fi.write( file ) ;
               out.println("Uploaded Filename: " + fileName + "<br>");
            }
         }
         out.println("</body>");
         out.println("</html>");
         } catch(Exception ex) {
            System.out.println(ex);
         }
      }
      
      public void doGet(HttpServletRequest request, HttpServletResponse response)
         throws ServletException, java.io.IOException {

         throw new ServletException("GET method used with " +
            getClass( ).getName( )+": POST method required.");
      }
   }
}

Compilare ed eseguire servlet

Compilare il servlet UploadServlet sopra e creare la voce richiesta nel file web.xml come segue.

<servlet>
   <servlet-name>UploadServlet</servlet-name>
   <servlet-class>UploadServlet</servlet-class>
</servlet>

<servlet-mapping>
   <servlet-name>UploadServlet</servlet-name>
   <url-pattern>/UploadServlet</url-pattern>
</servlet-mapping>

Ora prova a caricare i file utilizzando il modulo HTML che hai creato sopra. Quando provi http: // localhost: 8080 / UploadFile.htm, verrà visualizzato il seguente risultato che ti aiuterà a caricare qualsiasi file dalla tua macchina locale.

File Upload: 

Select a file to upload:


Se il tuo script servlet funziona correttamente, il tuo file dovrebbe essere caricato nella directory c: \ apache-tomcat8.0.28 \ webapps \ data \.