Memuat naik Fail dengan Servlet dan JSP

1. Pengenalan

Dalam tutorial ringkas ini, kita akan melihat cara memuat naik fail dari servlet.

Untuk mencapainya, pertama-tama kita akan melihat penyelesaian EE vanilla Jakarta dengan keupayaan memuat naik fail yang disediakan oleh anotasi @MultipartConfig asli .

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

2. Menggunakan Jakarta EE @MultipartConfig

Jakarta EE memiliki kemampuan untuk menyokong muat naik pelbagai bahagian di luar kotak.

Oleh itu, ini mungkin merupakan langkah awal untuk memperkaya aplikasi Jakarta EE dengan sokongan muat naik fail.

Pertama, mari tambahkan borang ke fail HTML kami:

 Choose a file:   

Bentuk harus ditentukan menggunakan atribut enctype = "multipart / form-data" untuk menandakan muat naik berbilang bahagian.

Seterusnya, kami ingin memberi penjelasan kepada HttpServlet kami dengan maklumat yang betul menggunakan anotasi @MultipartConfig :

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

Kemudian, pastikan folder muat naik pelayan lalai kami ditetapkan:

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

Akhir sekali, kita boleh mendapatkan inbound kami File dari permintaan menggunakan getParts () kaedah , dan simpan ke cakera:

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

Perhatikan bahawa, dalam contoh ini, kami menggunakan kaedah penolong 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. projek, kita boleh menggunakan kaedah Part.getSubmittedFileName () :

fileName = part.getSubmittedFileName();

3. Menggunakan Muat Naik Fail Apache Commons

Sekiranya kita tidak menggunakan projek Servlet 3.0, kita boleh menggunakan perpustakaan Apache Commons FileUpload secara langsung.

3.1. Persediaan

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

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

Versi terbaru boleh didapati dengan carian pantas di Maven's Central Repository: commons-fileupload dan commons-io.

3.2. Muat naik Servlet

Tiga bahagian utama untuk menggabungkan perpustakaan FileUpload Apache adalah seperti berikut:

  • Borang muat naik di halaman .jsp .
  • Mengkonfigurasi anda DiskFileItemFactory dan ServletFileUpload objek.
  • Memproses kandungan sebenar muat naik fail berbilang bahagian.

Borang muat naik sama seperti yang terdapat di bahagian sebelumnya.

Mari maju untuk membuat servlet Jakarta EE kami

Dalam kaedah pemprosesan permintaan kami, kami dapat membungkus HttpRequest yang masuk dengan cek untuk melihat apakah itu muat naik berbilang bahagian.

Kami juga akan menentukan sumber apa yang akan diperuntukkan untuk memuat naik fail buat sementara waktu (semasa diproses) di DiskFileItemFactory kami .

Terakhir, kami akan membuat objek ServletFileUpload yang akan mewakili fail sebenar itu sendiri . Ia akan mendedahkan kandungan muat naik pelbagai bahagian untuk bahagian pelayan kegigihan terakhir:

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, kita boleh mengekstrak kandungan tersebut dan menulisnya ke cakera:

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 projek kami ke dalam .war , kami dapat memasukkannya ke dalam contoh Tomcat tempatan kami dan memulakannya.

Dari sana, kami dapat memaparkan paparan muat naik utama di mana kami diberikan borang:

Setelah berjaya memuat naik fail kami, kami akan melihat mesej:

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

5. Kesimpulan

Itu sahaja! Kami telah belajar bagaimana menyediakan muat naik fail pelbagai bahagian menggunakan Jakarta EE, serta perpustakaan Apache Common FileUpload !

Coretan kod, seperti biasa, terdapat di GitHub.