Учебники

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

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

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

Следующий код HTM ниже создает форму загрузчика. Ниже приведены важные моменты, которые следует отметить –

  • Атрибут метода формы должен быть установлен в метод POST, и метод GET не может использоваться

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

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

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

Атрибут метода формы должен быть установлен в метод POST, и метод GET не может использоваться

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

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

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

 
<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> / 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, поэтому убедитесь, что в вашем classpath установлена ​​последняя версия файла commons-fileupload.xxjar . Вы можете скачать его с https://commons.apache.org/fileupload/ .

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

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

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

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

FileUpload зависит от ввода-вывода Commons, поэтому убедитесь, что в вашем пути к классам установлена ​​последняя версия файла commons-io-xxjar . Вы можете скачать его с 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:


Select a file to upload:

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