Загрузка файла на сервер с использованием сервлета и JSP — обычная задача в веб-приложении Java. Прежде чем кодировать ваш сервлет или JSP для обработки запроса на загрузку файла, вам нужно немного узнать о поддержке загрузки файлов в протоколах HTML и HTTP. Если вы хотите, чтобы ваш пользователь выбирал файлы из файловой системы и загружал их на сервер, вам нужно использовать <input type = ”file” />. Это позволит выбрать любую файловую систему и загрузить ее на сервер. Следующее, что метод формы должен быть HTTP POST с enctype как multipart / form-data , что делает данные файла доступными частями внутри тела запроса. Теперь, чтобы прочитать эти части файла и создать файл внутри сервлета, можно выполнить с помощью ServletOutputStream. Лучше использовать Apache commons FileUpload , библиотеку с открытым исходным кодом. Apache FileUpload обрабатывает все нижние детали синтаксического анализа HTTP-запроса, которые подтверждаются в RFC 1867 или «Загрузка файлов на основе форм в HTML» , когда вы устанавливаете метод сообщения формы и тип контента как «multipart / form-data».
Важные точки:
- DiskFileItemFactory является классом Factory по умолчанию для FileItem. Когда Apache осуществляет чтение мультикомпонентного содержимого и генерирует FileItem, эта реализация сохраняет содержимое файла либо в памяти, либо на диске как временный файл, в зависимости от размера порога. По умолчанию DiskFileItemFactory имеет пороговый размер 10 КБ и создает временные файлы во временном каталоге, возвращаемом System.getProperty («java.io.tmpdir»). Оба эти значения можно настраивать, и лучше всего их настроить для производственного использования. Вы можете получить проблемы с разрешениями, если у учетной записи пользователя, используемой для запуска Сервера, недостаточно прав для записи файлов во временный каталог.
- Тщательно выбирайте пороговый размер в зависимости от использования памяти. Хранение большого объема в памяти может привести к java.lang.OutOfMemory , в то время как слишком маленькие значения могут привести к появлению большого количества временных файлов.
- Apache Commons File Upload также предоставляет FileCleaningTracker для удаления временных файлов, созданных DiskFileItemFactory. FileCleaningTracker удаляет временные файлы, как только соответствующий экземпляр File собирается мусором. Это достигается с помощью более чистого потока, который создается при загрузке FileCleaner. Если вы используете эту функцию, не забудьте прекратить эту тему, когда закончится ваше веб-приложение.
- Сохраняйте настраиваемые данные, например, каталог загрузки, максимальный размер файла, пороговый размер и т. Д. В файлах конфигурации, и используйте разумные значения по умолчанию, если они не настроены.
- Рекомендуется проверять размер, тип и другие сведения о файлах в соответствии с требованиями вашего проекта, например, вы можете разрешить загрузку только изображений определенного размера и определенных типов, например JPEG, PNG и т. Д.
Пример загрузки файла в сервлете Java и JSP
Вот полный код для загрузки файлов в веб-приложение Java с использованием Servlet и JSP. Этот пример загрузки файла требует четырех файлов:
- index.jsp, который содержит HTML-контент для настройки формы, который позволяет пользователю выбирать и загружать файл на сервер.
- Сервлет FileUploader, который обрабатывает запрос на загрузку файла и использует библиотеку Apache FileUpload для анализа данных многоэлементной формы
- web.xml для настройки сервлета и JSP в веб-приложении Java.
- result.jsp для отображения результата операции загрузки файла.
FileUploadHandler.java
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
import java.io.File;import java.io.IOException;import java.util.List;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.disk.DiskFileItemFactory;import org.apache.commons.fileupload.servlet.ServletFileUpload;/** * Servlet to handle File upload request from Client * @author Javin Paul */public class FileUploadHandler extends HttpServlet { private final String UPLOAD_DIRECTORY = "C:/uploads"; @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //process only if its multipart content if(ServletFileUpload.isMultipartContent(request)){ try { List<FileItem> multiparts = new ServletFileUpload( new DiskFileItemFactory()).parseRequest(request); for(FileItem item : multiparts){ if(!item.isFormField()){ String name = new File(item.getName()).getName(); item.write( new File(UPLOAD_DIRECTORY + File.separator + name)); } } //File uploaded successfully request.setAttribute("message", "File Uploaded Successfully"); } catch (Exception ex) { request.setAttribute("message", "File Upload Failed due to " + ex); } }else{ request.setAttribute("message", "Sorry this Servlet only handles file upload request"); } request.getRequestDispatcher("/result.jsp").forward(request, response); } } |
index.jsp
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
|
<%@page contentType="text/html" pageEncoding="UTF-8"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>File Upload Example in JSP and Servlet - Java web application</title> </head> <body> <div> <h3> Choose File to Upload in Server </h3> <form action="upload" method="post" enctype="multipart/form-data"> <input type="file" name="file" /> <input type="submit" value="upload" /> </form> </div> </body></html> |
result.jsp
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
|
<%@page contentType="text/html" pageEncoding="UTF-8"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>File Upload Example in JSP and Servlet - Java web application</title> </head> <body> <div id="result"> <h3>${requestScope["message"]}</h3> </div> </body></html> |
web.xml
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
<?xml version="1.0" encoding="UTF-8"?><web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <servlet> <servlet-name>FileUploadHandler</servlet-name> <servlet-class>FileUploadHandler</servlet-class> </servlet> <servlet-mapping> <servlet-name>FileUploadHandler</servlet-name> <url-pattern>/upload</url-pattern> </servlet-mapping> <session-config> <session-timeout> 30 </session-timeout> </session-config> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list></web-app> |
В итоге, при загрузке файлов с помощью веб-приложения на Java помните три вещи
- Используйте тип ввода HTML-формы в качестве файла для просмотра файлов для загрузки
- Используйте метод form как post и enctype как multipart / form-data
- Используйте Apache commons FileUpload в сервлете для обработки HTTP-запроса с многокомпонентными данными.
зависимость
Чтобы скомпилировать и запустить это веб-приложение на Java на любом веб-сервере, например Tomcat , необходимо включить следующий JAR-файл зависимости в папку lib WEB-INF.
Обще-FileUpload-1.2.2.jar
Обще-ю-2.4.jar
Если вы используете Maven, вы также можете использовать следующие зависимости:
|
01
02
03
04
05
06
07
08
09
10
|
<dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.2.2</version></dependency><dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.4</version></dependency> |
Это все о том, как загружать файлы с помощью сервлета и JSP в веб-приложении Java . Этот пример загрузки файла может быть написан с использованием JSP, Filter или Servlet, потому что все три являются точкой входа запроса в веб-приложении Java. Я использовал Servlet для обработки запроса загрузки файла для простоты. В отличие от API Servlet 3.0, Servlet поддерживает данные многоэлементных форм, и вы можете использовать метод getPart () HttpServletRequest для обработки загрузки файлов.
