1. Общ преглед
В предишни статии въведохме основите на обработката на формуляри и изследвахме библиотеката с маркери на формуляри в Spring MVC.
В тази статия ние се фокусираме върху това, което Spring предлага за поддръжка на няколко части (качване на файлове) в уеб приложения.
Spring ни позволява да активираме тази поддръжка на няколко части с включени обекти MultipartResolver . Рамката предвижда един MultipartResolver изпълнение за използване с Commons FileUpload и друг за използване с Servlet 3.0 съставното искане разбор.
След конфигуриране на MultipartResolver ще видим как да качите един файл и множество файлове.
Ще засегнем и Spring Boot.
2. Commons FileUpload
За да използваме CommonsMultipartResolver за обработка на качването на файл, трябва да добавим следната зависимост:
commons-fileupload commons-fileupload 1.3.1
Сега можем да дефинираме боб CommonsMultipartResolver в нашата конфигурация Spring.
Този MultipartResolver се предлага с поредица от зададен метод за дефиниране на свойства като максималния размер за качвания:
@Bean(name = "multipartResolver") public CommonsMultipartResolver multipartResolver() { CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(); multipartResolver.setMaxUploadSize(100000); return multipartResolver; }
Тук трябва да контролираме различни свойства на CommonsMultipartResolver в самата дефиниция на Bean.
3. Със Servlet 3.0
За да използваме многоразделен синтактичен анализ на Servlet 3.0 , трябва да конфигурираме няколко части от приложението. Първо, трябва да зададем MultipartConfigElement в нашата регистрация на DispatcherServlet :
public class MainWebAppInitializer implements WebApplicationInitializer { private String TMP_FOLDER = "/tmp"; private int MAX_UPLOAD_SIZE = 5 * 1024 * 1024; @Override public void onStartup(ServletContext sc) throws ServletException { ServletRegistration.Dynamic appServlet = sc.addServlet("mvc", new DispatcherServlet( new GenericWebApplicationContext())); appServlet.setLoadOnStartup(1); MultipartConfigElement multipartConfigElement = new MultipartConfigElement(TMP_FOLDER, MAX_UPLOAD_SIZE, MAX_UPLOAD_SIZE * 2, MAX_UPLOAD_SIZE / 2); appServlet.setMultipartConfig(multipartConfigElement); } }
В обекта MultipartConfigElement сме конфигурирали местоположението за съхранение, максималния размер на отделния файл, максималния размер на заявката (в случай на множество файлове в една заявка) и размера, при който ходът на качване на файл се изчиства до мястото за съхранение.
Тези настройки трябва да се прилагат на ниво регистрация на сървлети, тъй като Servlet 3.0 не позволява да бъдат регистрирани в MultipartResolver, какъвто е случаят с CommonsMultipartResolver.
След като това бъде направено, можем да добавим StandardServletMultipartResolver към нашата конфигурация Spring:
@Bean public StandardServletMultipartResolver multipartResolver() { return new StandardServletMultipartResolver(); }
4. Качване на файл
За да качим нашия файл, можем да изградим проста форма, в която използваме HTML таг за въвеждане с type = 'file'.
Независимо от конфигурацията за обработка на качване, която сме избрали, трябва да зададем атрибута за кодиране на формуляра на multipart / form-data. Това позволява на браузъра да знае как да кодира формата:
Select a file to upload
За съхраняване на качения файл можем да използваме променлива MultipartFile . Можем да извлечем тази променлива от параметъра на заявката в метода на нашия контролер:
@RequestMapping(value = "/uploadFile", method = RequestMethod.POST) public String submit(@RequestParam("file") MultipartFile file, ModelMap modelMap) { modelMap.addAttribute("file", file); return "fileUploadView"; }
Класът MultipartFile предоставя достъп до подробности за качения файл , включително име на файл, тип файл и т.н. Можем да използваме проста HTML страница, за да покажем тази информация:
Submitted File
OriginalFileName:
${file.originalFilename}
Type:
${file.contentType}
5. Качване на множество файлове
За да качим множество файлове в една заявка, ние просто поставяме множество полета за входни файлове във формуляра:
Select a file to upload
Select a file to upload
Select a file to upload
Трябва да се погрижим всяко поле за въвеждане да има едно и също име, за да може да бъде достъпно като масив от MultipartFile :
@RequestMapping(value = "/uploadMultiFile", method = RequestMethod.POST) public String submit(@RequestParam("files") MultipartFile[] files, ModelMap modelMap) { modelMap.addAttribute("files", files); return "fileUploadView"; }
Сега можем просто да прегледаме този масив, за да покажем информация за файлове:
Spring MVC File Upload Submitted Files
OriginalFileName:
${file.originalFilename}
Type:
${file.contentType}
6. Качване на файлове с допълнителни данни за формуляра
Също така можем да изпратим допълнителна информация на сървъра заедно с файла, който се качва. Просто трябва да включим задължителните полета във формуляра:
Name
Email
Select a file to upload
In the controller, we can get all the form data using the @RequestParam annotation:
@PostMapping("/uploadFileWithAddtionalData") public String submit( @RequestParam MultipartFile file, @RequestParam String name, @RequestParam String email, ModelMap modelMap) { modelMap.addAttribute("name", name); modelMap.addAttribute("email", email); modelMap.addAttribute("file", file); return "fileUploadView"; }
Similar to previous sections, we can use the HTML page with JSTL tags to display the information.
We can also encapsulate all the form fields in a model class and use @ModelAttribute annotation in the controller. This would be helpful when there's a lot of additional fields along with the file. Let' look at the code:
public class FormDataWithFile { private String name; private String email; private MultipartFile file; // standard getters and setters }
@PostMapping("/uploadFileModelAttribute") public String submit(@ModelAttribute FormDataWithFile formDataWithFile, ModelMap modelMap) { modelMap.addAttribute("formDataWithFile", formDataWithFile); return "fileUploadView"; }
7. Spring Boot File Upload
If we're using Spring Boot, everything we've seen so far still applies.
However, Spring Boot makes it even easier to configure and start everything with little hassle.
In particular, it's not necessary to configure any servlet, as Boot will register and configure it for us, provided that we include the web module in our dependencies:
org.springframework.boot spring-boot-starter-web 2.1.8.RELEASE
We can find the latest version of spring-boot-starter-web on Maven Central.
If we want to control the maximum file upload size, we can edit our application.properties:
spring.servlet.multipart.max-file-size=128KB spring.servlet.multipart.max-request-size=128KB
We can also control whether file uploading is enabled, and the location for file upload:
spring.servlet.multipart.enabled=true spring.servlet.multipart.location=${java.io.tmpdir}
Note that we've used ${java.io.tmpdir} to define the upload location so that we can use the temporary location for different operating systems.
8. Conclusion
В тази статия разгледахме различни начини за конфигуриране на поддръжка на няколко части през пролетта. Използвайки тези, ние можем да поддържаме качване на файлове в нашите уеб приложения.
Прилагането на този урок може да бъде намерено в проект на GitHub. Когато проектът се изпълнява локално, примерът на формуляр може да бъде достъпен на // localhost: 8080 / spring-mvc-java / fileUpload