Mengupload File dengan Servlets dan JSP

1. Perkenalan

Dalam tutorial singkat ini, kita akan melihat cara mengupload file dari servlet.

Untuk mencapai ini, pertama-tama kita akan melihat solusi vanilla Jakarta EE dengan kemampuan unggah file yang disediakan oleh anotasi asli @MultipartConfig .

Kemudian, kita akan membahas pustaka FileUpload Apache Commons , untuk versi API Servlet sebelumnya.

2. Menggunakan Jakarta EE @MultipartConfig

Jakarta EE memiliki kemampuan untuk mendukung upload multi-bagian secara langsung.

Dengan demikian, ini mungkin merupakan tujuan default saat memperkaya aplikasi Jakarta EE dengan dukungan unggah file.

Pertama, mari tambahkan formulir ke file HTML kita:

 Choose a file:   

Formulir harus ditentukan menggunakan atribut enctype = "multipart / form-data" untuk menandakan unggahan multi bagian.

Selanjutnya, kami ingin memberi anotasi pada HttpServlet kami dengan informasi yang benar menggunakan anotasi @MultipartConfig :

@MultipartConfig(fileSizeThreshold = 1024 * 1024, maxFileSize = 1024 * 1024 * 5, maxRequestSize = 1024 * 1024 * 5 * 5) public class MultipartServlet extends HttpServlet { //... } 

Kemudian, pastikan folder unggahan server default kami disetel:

String uploadPath = getServletContext().getRealPath("") + File.separator + UPLOAD_DIRECTORY; File uploadDir = new File(uploadPath); if (!uploadDir.exists()) uploadDir.mkdir(); 

Akhirnya, kita dapat dengan mudah mengambil masuk kami Berkas dari permintaan menggunakan getParts () metode , dan simpan ke disk:

for (Part part : request.getParts()) { fileName = getFileName(part); part.write(uploadPath + File.separator + fileName); } 

Perhatikan bahwa, dalam contoh ini, kami menggunakan metode pembantu getFileName ():

private String getFileName(Part part) { for (String content : part.getHeader("content-disposition").split(";")) { if (content.trim().startsWith("filename")) return content.substring(content.indexOf("=") + 2, content.length() - 1); } return Constants.DEFAULT_FILENAME; }

Untuk Servlet 3.1. proyek, kita dapat menggunakan metode Part.getSubmittedFileName () sebagai alternatif:

fileName = part.getSubmittedFileName();

3. Menggunakan FileUpload Apache Commons

Jika kita tidak menggunakan proyek Servlet 3.0, kita dapat menggunakan pustaka FileUpload Apache Commons secara langsung.

3.1. Mendirikan

Kami ingin menggunakan dependensi pom.xml berikut untuk menjalankan contoh kami:

 commons-fileupload commons-fileupload 1.3.3   commons-io commons-io 2.6 

Versi terbaru dapat ditemukan dengan pencarian cepat di Central Repository Maven: commons-fileupload dan commons-io.

3.2. Unggah Servlet

Tiga bagian utama untuk memasukkan pustaka FileUpload Apache adalah sebagai berikut:

  • Formulir upload dalam halaman .jsp .
  • Mengonfigurasi objek DiskFileItemFactory dan ServletFileUpload Anda .
  • Memproses konten sebenarnya dari unggahan file multibagian.

Formulir unggahan sama dengan yang ada di bagian sebelumnya.

Mari lanjutkan dengan membuat servlet Jakarta EE kita.

Dalam metode pemrosesan permintaan kami, kami dapat membungkus HttpRequest yang masuk dengan pemeriksaan untuk melihat apakah itu unggahan multi-bagian.

Kami juga akan menentukan sumber daya apa yang akan dialokasikan ke unggahan file untuk sementara (saat diproses) di DiskFileItemFactory kami .

Terakhir, kita akan membuat objek ServletFileUpload yang akan mewakili file itu sendiri . Ini akan mengekspos konten unggahan multi-bagian untuk sisi server persistensi akhir:

if (ServletFileUpload.isMultipartContent(request)) { DiskFileItemFactory factory = new DiskFileItemFactory(); factory.setSizeThreshold(MEMORY_THRESHOLD); factory.setRepository(new File(System.getProperty("java.io.tmpdir"))); ServletFileUpload upload = new ServletFileUpload(factory); upload.setFileSizeMax(MAX_FILE_SIZE); upload.setSizeMax(MAX_REQUEST_SIZE); String uploadPath = getServletContext().getRealPath("") + File.separator + UPLOAD_DIRECTORY; File uploadDir = new File(uploadPath); if (!uploadDir.exists()) { uploadDir.mkdir(); } //... }

Dan, kemudian kita dapat mengekstrak konten tersebut dan menulisnya ke disk:

if (ServletFileUpload.isMultipartContent(request)) { //... List formItems = upload.parseRequest(request); if (formItems != null && formItems.size() > 0) { for (FileItem item : formItems) { if (!item.isFormField()) { String fileName = new File(item.getName()).getName(); String filePath = uploadPath + File.separator + fileName; File storeFile = new File(filePath); item.write(storeFile); request.setAttribute("message", "File " + fileName + " has uploaded successfully!"); } } } }

4. Menjalankan Contoh

Setelah kami menyusun proyek kami menjadi .war , kami dapat memasukkannya ke dalam instance Tomcat lokal kami dan memulainya.

Dari sana, kita dapat memunculkan tampilan unggahan utama di mana kita disajikan dengan formulir:

Setelah berhasil mengupload file kita, kita akan melihat pesan:

Terakhir, kami dapat memeriksa lokasi yang ditentukan di servlet kami:

5. Kesimpulan

Itu dia! Kami telah mempelajari cara menyediakan upload file multi-bagian menggunakan Jakarta EE, serta library Common FileUpload Apache !

Cuplikan kode, seperti biasa, dapat ditemukan di GitHub.