Сервлеты - загрузка файлов

Сервлет можно использовать с тегом HTML-формы, чтобы пользователи могли загружать файлы на сервер. Загруженный файл может быть текстовым файлом, файлом изображения или любым документом.

Создание формы загрузки файла

Приведенный ниже код HTM создает форму для загрузки. Ниже приведены важные моменты, которые следует отметить:

  • Форма method атрибут должен быть установлен на POST метод и метод GET не могут использоваться

  • Форма enctype атрибут должен быть установлен на multipart/form-data.

  • Форма actionАтрибут должен быть установлен в файл сервлета, который будет обрабатывать загрузку файла на внутренний сервер. В следующем примере используетсяUploadServlet сервлет для загрузки файла.

  • Чтобы загрузить один файл, вы должны использовать один тег <input ... /> с атрибутом type = "file". Чтобы разрешить загрузку нескольких файлов, включите несколько входных тегов с разными значениями атрибута name. Браузер связывает кнопку «Обзор» с каждым из них.

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

Это отобразит следующий результат, который позволит выбрать файл с локального ПК, и когда пользователь нажмет на «Загрузить файл», форма будет отправлена ​​вместе с выбранным файлом -

File Upload: 
Select a file to upload: 


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

Написание серверного сервлета

Ниже приводится сервлет UploadServletкоторый позаботится о том, чтобы загрузить загруженный файл и сохранить его в каталоге <Tomcat-installation-directory> / webapps / data. Это имя каталога также можно добавить с помощью внешней конфигурации, напримерcontext-param элемент в web.xml следующим образом -

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

Ниже приведен исходный код для UploadServlet, который может обрабатывать несколько загрузок файлов за раз. Прежде чем продолжить, убедитесь, что выполнены следующие условия -

  • Следующий пример зависит от FileUpload, поэтому убедитесь, что у вас установлена ​​последняя версия commons-fileupload.x.x.jarфайл в вашем пути к классам. Вы можете скачать его сhttps://commons.apache.org/fileupload/.

  • FileUpload зависит от Commons IO, поэтому убедитесь, что у вас установлена ​​последняя версия commons-io-x.x.jarфайл в вашем пути к классам. Вы можете скачать его сhttps://commons.apache.org/io/.

  • При тестировании следующего примера вы должны загрузить файл, размер которого меньше maxFileSize, иначе файл не будет загружен.

  • Убедитесь, что вы заранее создали каталоги c: \ temp и c: \ apache-tomcat8.0.28 \ webapps \ data.

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

Компиляция и запуск сервлета

Скомпилируйте указанный выше сервлет UploadServlet и создайте необходимую запись в файле web.xml следующим образом.

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

Теперь попробуйте загрузить файлы, используя HTML-форму, которую вы создали выше. Когда вы попробуете http: // localhost: 8080 / UploadFile.htm, отобразится следующий результат, который поможет вам загрузить любой файл с вашего локального компьютера.

File Upload: 

Select a file to upload:


Если ваш сценарий сервлета работает нормально, ваш файл должен быть загружен в каталог c: \ apache-tomcat8.0.28 \ webapps \ data \.