Рубрики
Без рубрики

Загрузка файла сервлета 3 – @MultipartConfig, Часть

Сегодня мы рассмотрим пример загрузки файла Servlet 3 с использованием аннотации @MultipartConfig и javax.servlet.http.Part. Некоторое время назад я написал статью

Автор оригинала: Pankaj Kumar.

Сегодня мы рассмотрим пример загрузки файла Servlet 3 с использованием аннотации @MultipartConfig и javax.servlet.http.Часть . Некоторое время назад я написал статью о Загрузке файлов сервлетов и использовал API загрузки файлов Apache, но здесь мы будем использовать функцию загрузки файлов сервлета 3.

Загрузка файла Сервлета 3

Поскольку загрузка файлов является обычной задачей в веб-приложениях, спецификации сервлета 3.0 предоставили дополнительную поддержку для загрузки файлов на сервер, и для этого нам не нужно зависеть от каких-либо сторонних API. В этом уроке мы увидим, как мы можем использовать API сервлета 3.0 для загрузки файлов на сервер.

Многокомпонентная конфигурация

Нам нужно аннотировать сервлет обработчика загрузки файлов аннотацией MultipartConfig для обработки запросов на данные из нескольких частей/форм, которые используются для загрузки файла на сервер. Аннотация MultipartConfig имеет следующие атрибуты:

  • Пороговый размер файла : Мы можем указать пороговый размер, после которого файл будет записан на диск. Значение размера указано в байтах, поэтому 1024*1024*10 составляет 10 МБ.
  • расположение : Каталог, в котором по умолчанию будут храниться файлы, значение по умолчанию равно “”.
  • MaxFileSize : Максимальный размер, разрешенный для загрузки файла, его значение указано в байтах. Значение по умолчанию-1L означает неограниченное количество.
  • максимальный размер запроса : Максимальный размер, разрешенный для запроса данных из нескольких частей/формы. Значение по умолчанию-1L, что означает неограниченное количество.

Подробнее об аннотациях читайте в учебнике по аннотациям Java .

Интерфейс Детали

Часть интерфейс представляет часть или элемент формы, который был получен в рамках запроса на отправку данных из нескольких частей/форм. Некоторые важные методы: getInputStream() , запись(строковое имя файла) , которые мы можем использовать для чтения и записи файла.

Изменения запроса HttpServletRequest

В добавлены новые методы HttpServletRequest для получения всех частей в составном/форма-запрос данных через getParts() метод. Мы можем получить конкретную деталь, используя метод get Part(строковое имя детали) .

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

HTML-форма

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

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




Select File to Upload:

Сервлет Загрузки Файлов

Вот наша реализация сервлета загрузки файлов.

Вот наша реализация сервлета загрузки файлов.

package com.journaldev.servlet;
 
import java.io.File;
import java.io.IOException;
 
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
 
@WebServlet("/FileUploadServlet")
@MultipartConfig(fileSizeThreshold=1024*1024*10, 	// 10 MB 
                 maxFileSize=1024*1024*50,      	// 50 MB
                 maxRequestSize=1024*1024*100)   	// 100 MB
public class FileUploadServlet extends HttpServlet {
 
    private static final long serialVersionUID = 205242440643911308L;
	
    /**
     * Directory where uploaded files will be saved, its relative to
     * the web application directory.
     */
    private static final String UPLOAD_DIR = "uploads";
     
    protected void doPost(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        // gets absolute path of the web application
        String applicationPath = request.getServletContext().getRealPath("");
        // constructs path of the directory to save uploaded file
        String uploadFilePath = applicationPath + File.separator + UPLOAD_DIR;
         
        // creates the save directory if it does not exists
        File fileSaveDir = new File(uploadFilePath);
        if (!fileSaveDir.exists()) {
            fileSaveDir.mkdirs();
        }
        System.out.println("Upload File Directory="+fileSaveDir.getAbsolutePath());
        
        String fileName = null;
        //Get all the parts from request and write it to the file on server
        for (Part part : request.getParts()) {
            fileName = getFileName(part);
            part.write(uploadFilePath + File.separator + fileName);
        }
 
        request.setAttribute("message", fileName + " File uploaded successfully!");
        getServletContext().getRequestDispatcher("/response.jsp").forward(
                request, response);
    }
 
    /**
     * Utility method to get file name from HTTP header content-disposition
     */
    private String getFileName(Part part) {
        String contentDisp = part.getHeader("content-disposition");
        System.out.println("content-disposition header= "+contentDisp);
        String[] tokens = contentDisp.split(";");
        for (String token : tokens) {
            if (token.trim().startsWith("filename")) {
                return token.substring(token.indexOf("=") + 2, token.length()-1);
            }
        }
        return "";
    }
}

Обратите внимание на использование аннотации @MultipartConfig для указания различных параметров размера загружаемого файла. Нам нужно использовать атрибут заголовка запроса “содержимое-расположение”, чтобы получить имя файла, отправленное клиентом, мы сохраним файл с тем же именем.

Расположение каталога относительно веб-приложения, в котором я сохраняю файл, вы можете настроить его в другом месте, например, в примере загрузки файлов Apache Commons.

Ответ JSP

Простая страница JSP, которая будет отправлена клиенту в качестве ответа после успешной загрузки файла на сервер.

Простая страница JSP, которая будет отправлена клиенту в качестве ответа после успешной загрузки файла на сервер.

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>




Upload File Response


	<%-- Using JSP EL to get message attribute value from request scope --%>
    

${requestScope.message}

Дескриптор развертывания

В этом нет ничего нового web.xml файл для servletfileupload, он используется только для index.html в качестве файла приветствия.

В этом нет ничего нового web.xml файл для servletfileupload, он используется только для index.html в качестве файла приветствия.



  ServletFileUploadExample
  
    index.html
  

Теперь, когда мы запускаем приложение, в качестве ответа мы получаем следующие страницы.

В журналах будет отображаться расположение каталога, в котором сохранен файл, и информация о заголовке содержимого.

Upload File Directory=/Users/pankaj/Documents/workspace/j2ee/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/ServletFileUploadExample/uploads
content-disposition header= form-data; name="fileName"; filename="IMG_2046.jpg"

Я запускаю Tomcat через Eclipse, вот почему расположение файла такое. Если вы запустите tomcat через командную строку и развернете приложение, экспортировав его как файл WAR в каталог webapps, вы получите другую структуру, но четкую.