Servlets - Hochladen von Dateien

Ein Servlet kann mit einem HTML-Formular-Tag verwendet werden, damit Benutzer Dateien auf den Server hochladen können. Eine hochgeladene Datei kann eine Textdatei, eine Bilddatei oder ein beliebiges Dokument sein.

Erstellen eines Formulars zum Hochladen von Dateien

Der folgende HTM-Code erstellt ein Uploader-Formular. Im Folgenden sind die wichtigen Punkte aufgeführt, die zu beachten sind:

  • Die Form method Attribut sollte auf gesetzt sein POST Methode und GET-Methode können nicht verwendet werden

  • Die Form enctype Attribut sollte auf gesetzt sein multipart/form-data.

  • Die Form actionDas Attribut sollte auf eine Servlet-Datei festgelegt werden, die das Hochladen von Dateien auf dem Back-End-Server übernimmt. Das folgende Beispiel verwendetUploadServlet Servlet zum Hochladen der Datei.

  • Um eine einzelne Datei hochzuladen, sollten Sie ein einzelnes <input ... /> -Tag mit dem Attributtyp = "Datei" verwenden. Um das Hochladen mehrerer Dateien zu ermöglichen, fügen Sie mehr als ein Eingabe-Tag mit unterschiedlichen Werten für das Namensattribut hinzu. Der Browser ordnet jedem von ihnen eine Schaltfläche zum Durchsuchen zu.

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

Daraufhin wird das folgende Ergebnis angezeigt, mit dem eine Datei vom lokalen PC ausgewählt werden kann. Wenn der Benutzer auf "Datei hochladen" klickt, wird das Formular zusammen mit der ausgewählten Datei gesendet.

File Upload: 
Select a file to upload: 


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

Backend-Servlet schreiben

Es folgt das Servlet UploadServletDies würde dafür sorgen, dass hochgeladene Dateien akzeptiert und im Verzeichnis <Tomcat-Installationsverzeichnis> / webapps / data gespeichert werden. Dieser Verzeichnisname kann auch mithilfe einer externen Konfiguration wie zcontext-param Element in web.xml wie folgt -

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

Im Folgenden finden Sie den Quellcode für UploadServlet, mit dem mehrere Dateien gleichzeitig hochgeladen werden können. Bevor Sie fortfahren, stellen Sie Folgendes sicher:

  • Das folgende Beispiel hängt von FileUpload ab. Stellen Sie daher sicher, dass Sie über die neueste Version von verfügen commons-fileupload.x.x.jarDatei in Ihrem Klassenpfad. Sie können es von herunterladenhttps://commons.apache.org/fileupload/.

  • FileUpload hängt von Commons IO ab. Stellen Sie daher sicher, dass Sie über die neueste Version von verfügen commons-io-x.x.jarDatei in Ihrem Klassenpfad. Sie können es von herunterladenhttps://commons.apache.org/io/.

  • Während Sie das folgende Beispiel testen, sollten Sie eine Datei hochladen, die kleiner als maxFileSize ist, da sonst die Datei nicht hochgeladen wird.

  • Stellen Sie sicher, dass Sie die Verzeichnisse c: \ temp und c: \ apache-tomcat8.0.28 \ webapps \ data rechtzeitig erstellt haben.

// 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.");
      }
   }
}

Servlet kompilieren und ausführen

Kompilieren Sie das obige Servlet UploadServlet und erstellen Sie den erforderlichen Eintrag in der Datei web.xml wie folgt.

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

Versuchen Sie nun, Dateien mit dem oben erstellten HTML-Formular hochzuladen. Wenn Sie http: // localhost: 8080 / UploadFile.htm ausprobieren, wird das folgende Ergebnis angezeigt, mit dem Sie Dateien von Ihrem lokalen Computer hochladen können.

File Upload: 

Select a file to upload:


Wenn Ihr Servlet-Skript ordnungsgemäß funktioniert, sollte Ihre Datei im Verzeichnis c: \ apache-tomcat8.0.28 \ webapps \ data \ hochgeladen werden.