Muat Naik Fail dengan Spring MVC

1. Gambaran keseluruhan

Dalam artikel sebelumnya, kami memperkenalkan asas-asas pengendalian borang dan meneroka perpustakaan tag borang di Spring MVC.

Dalam artikel ini, kami memfokuskan pada apa yang ditawarkan Spring untuk sokongan multipart (muat naik fail) dalam aplikasi web.

Spring membolehkan kita mengaktifkan sokongan multipart ini dengan objek MultipartResolver yang dapat dipasang . Kerangka ini menyediakan satu implementasi MultipartResolver untuk digunakan dengan Commons FileUpload dan yang lain untuk digunakan dengan parsing permintaan multipart Servlet 3.0 .

Setelah mengkonfigurasi MultipartResolver kita akan melihat cara memuat naik satu fail dan beberapa fail.

Kami juga akan menyentuh Spring Boot.

2. Muat turun Fail Commons

Untuk menggunakan CommonsMultipartResolver untuk menangani muat naik fail, kita perlu menambahkan kebergantungan berikut:

 commons-fileupload commons-fileupload 1.3.1 

Sekarang kita boleh menentukan kacang CommonsMultipartResolver ke dalam konfigurasi Spring kami.

Ini MultipartResolver datang dengan satu siri set kaedah untuk menentukan ciri-ciri seperti saiz maksimum untuk muat naik:

@Bean(name = "multipartResolver") public CommonsMultipartResolver multipartResolver() { CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(); multipartResolver.setMaxUploadSize(100000); return multipartResolver; }

Di sini kita perlu mengawal sifat berbeza CommonsMultipartResolver dalam definisi Bean itu sendiri.

3. Dengan Servlet 3.0

Untuk menggunakan penghuraian multipart Servlet 3.0 , kita perlu mengkonfigurasi beberapa bahagian aplikasi. Pertama, kita perlu menetapkan MultipartConfigElement dalam pendaftaran DispatcherServlet kami :

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); } }

Dalam objek MultipartConfigElement , kami telah mengkonfigurasi lokasi penyimpanan, ukuran file individu maksimum, ukuran permintaan maksimum (dalam kasus beberapa file dalam satu permintaan), dan ukuran di mana kemajuan pemuatan file dialihkan ke lokasi penyimpanan.

Tetapan ini mesti diterapkan pada tingkat pendaftaran servlet, kerana Servlet 3.0 tidak membenarkannya didaftarkan di MultipartResolver seperti halnya dengan CommonsMultipartResolver.

Setelah ini selesai, kita dapat menambahkan StandardServletMultipartResolver ke konfigurasi Spring kami:

@Bean public StandardServletMultipartResolver multipartResolver() { return new StandardServletMultipartResolver(); }

4. Memuat naik Fail

Untuk memuat naik fail kami, kami dapat membuat bentuk sederhana di mana kami menggunakan tag input HTML dengan type = 'file'.

Terlepas dari konfigurasi pengendalian muat naik, kami telah memilih, kami harus menetapkan atribut pengekodan bentuk ke multipart / form-data. Ini membolehkan penyemak imbas mengetahui cara mengekod borang:


    
Select a file to upload

Untuk menyimpan fail yang dimuat naik kita boleh menggunakan pemboleh ubah MultipartFile . Kami dapat mengambil pemboleh ubah ini dari parameter permintaan dalam kaedah pengendali kami:

@RequestMapping(value = "/uploadFile", method = RequestMethod.POST) public String submit(@RequestParam("file") MultipartFile file, ModelMap modelMap) { modelMap.addAttribute("file", file); return "fileUploadView"; } 

The MultipartFile kelas menyediakan akses kepada maklumat mengenai fail yang dimuat naik , termasuk nama fail, jenis fail, dan sebagainya. Kita boleh menggunakan halaman HTML sederhana untuk memaparkan maklumat ini:

Submitted File

OriginalFileName: ${file.originalFilename}
Type: ${file.contentType}

5. Memuat naik Berbilang Fail

Untuk memuat naik banyak fail dalam satu permintaan, kami hanya memasukkan beberapa medan fail input di dalam borang:


    
Select a file to upload
Select a file to upload
Select a file to upload

Kita perlu memastikan bahawa setiap medan input memiliki nama yang sama sehingga dapat diakses sebagai array MultipartFile :

@RequestMapping(value = "/uploadMultiFile", method = RequestMethod.POST) public String submit(@RequestParam("files") MultipartFile[] files, ModelMap modelMap) { modelMap.addAttribute("files", files); return "fileUploadView"; } 

Sekarang, kita boleh melakukan iterasi pada array itu untuk memaparkan maklumat fail:

   Spring MVC File Upload   

Submitted Files

OriginalFileName: ${file.originalFilename}
Type: ${file.contentType}

6. Memuat naik Fail Dengan Data Borang Tambahan

Kami juga dapat menghantar maklumat tambahan ke pelayan bersama dengan fail yang diunggah. Kita hanya perlu memasukkan bidang yang diperlukan dalam bentuk:


    
Name
Email
Select a file to upload

Di pengawal, kita boleh mendapatkan semua data borang menggunakan anotasi @RequestParam :

@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"; }

Sama seperti bahagian sebelumnya, kita dapat menggunakan halaman HTML dengan tag JSTL untuk memaparkan maklumat.

Kami juga dapat merangkum semua bidang borang dalam kelas model dan menggunakan anotasi @ModelAttribute di pengawal. Ini akan sangat berguna apabila terdapat banyak bidang tambahan bersama dengan fail. Mari kita lihat kodnya:

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. Muat Naik Fail Spring Boot

Sekiranya kita menggunakan Spring Boot, semua yang kita lihat setakat ini masih berlaku.

Walau bagaimanapun, Spring Boot menjadikannya lebih mudah untuk mengkonfigurasi dan memulakan semuanya dengan sedikit kerumitan.

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

Dalam artikel ini, kami melihat pelbagai cara untuk mengkonfigurasi sokongan berbilang bahagian pada musim bunga. Dengan menggunakan ini, kami dapat menyokong muat naik fail di aplikasi web kami.

Pelaksanaan tutorial ini boleh didapati dalam projek GitHub. Apabila projek berjalan secara tempatan, contoh borang dapat diakses di // localhost: 8080 / spring-mvc-java / file