Загрузка файла на сервер с использованием сервлета и 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 для обработки загрузки файлов.