Загрузка файла сервлета 3 — @MultipartConfig, часть
Сегодня мы рассмотрим пример загрузки файла Servlet 3 с использованием загрузки файла Servlet, и я использовал Apache FileUpload API, но здесь мы будем использовать функцию загрузки файла Servlet 3.
Загрузка файла сервлета 3
Поскольку загрузка файлов является распространенной задачей в веб-приложениях, Servlet Specs 3.0 предоставили дополнительную поддержку для загрузки файлов на сервер, и для этого нам не нужно зависеть от каких-либо сторонних API. В этом руководстве мы увидим, как мы можем использовать API Servlet 3.0 для загрузки файлов на сервер.
MultipartConfig
Нам нужно аннотировать сервлет обработчика загрузки файлов аннотацией MultipartConfig для обработки запросов multipart/form-data, которые используются для загрузки файла на сервер. Аннотация MultipartConfig имеет следующие атрибуты:
- fileSizeThreshold: мы можем указать пороговое значение размера, после которого файл будет записан на диск. Значение размера указано в байтах, поэтому 1024*1024*10 равно 10 МБ.
- местоположение: каталог, в котором по умолчанию будут храниться файлы, значение по умолчанию — \».
- maxFileSize: максимально допустимый размер загружаемого файла, значение указывается в байтах. Значение по умолчанию: -1L означает неограниченное количество.
- maxRequestSize: Максимально допустимый размер для запроса multipart/form-data. Значение по умолчанию: -1L, что означает неограниченное количество.
Узнайте больше об аннотациях в учебнике по аннотациям Java.
Интерфейс детали
Интерфейс части представляет часть или элемент формы, который был получен в рамках запроса POST multipart/form-data. Некоторыми важными методами являются getInputStream()
, write(String fileName)
, которые мы можем использовать для чтения и записи файла.
Изменения HttpServletRequest
HTML-форма
У нас есть простая html-страница, на которой мы можем выбрать файл для загрузки и отправить запрос на сервер, чтобы загрузить его. index.html
<html>
<head></head>
<body>
<form action="FileUploadServlet" method="post" enctype="multipart/form-data">
Select File to Upload:<input type="file" name="fileName">
<br>
<input type="submit" value="Upload">
</form>
</body>
</html>
Сервлет загрузки файлов
Вот наша реализация сервлета загрузки файлов. FileUploadServlet.java
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 для указания различных параметров размера загружаемого файла. Нам нужно использовать атрибут заголовка запроса «content-disposition», чтобы получить имя файла, отправленное клиентом, мы сохраним файл с тем же именем. Расположение каталога относительно веб-приложения, в котором я сохраняю файл, вы можете настроить его в другое место, как в примере Apache Commons FileUpload.
Ответ JSP
Простая страница JSP, которая будет отправлена клиенту в качестве ответа после успешной загрузки файла на сервер. response.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"https://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Upload File Response</title>
</head>
<body>
<%-- Using JSP EL to get message attribute value from request scope --%>
<h2>${requestScope.message}</h2>
</body>
</html>
Дескриптор развертывания
В файле web.xml нет ничего нового для загрузки файла сервлета, он используется только для того, чтобы сделать index.html приветственным файлом. web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xmlns="https://java.sun.com/xml/ns/javaee" xsi:schemaLocation="https://java.sun.com/xml/ns/javaee https://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
<display-name>ServletFileUploadExample</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>
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, вы получите другую структуру, но четкую.
Загрузить проект загрузки многокомпонентных файлов Servlet 3