Muat Naik Fail Spring dan Apache

1. Gambaran keseluruhan

The Apache Commons File Upload Perpustakaan membantu kita memuat naik fail besar melalui protokol HTTP dengan menggunakan pelbagai bahagian / bentuk-data jenis kandungan.

Dalam tutorial ringkas ini, kita akan melihat bagaimana mengintegrasikannya dengan Spring.

2. Pergantungan Maven

Untuk menggunakan perpustakaan, kita memerlukan artifak commons-fileupload :

 commons-fileupload commons-fileupload 1.3.3 

Versi terbaru boleh didapati di Maven Central.

3. Memindahkan Semua sekaligus

Untuk tujuan demonstrasi, kami akan membuat permintaan pemprosesan Pengawal dengan muatan fail:

@PostMapping("/upload") public String handleUpload(HttpServletRequest request) throws Exception { boolean isMultipart = ServletFileUpload.isMultipartContent(request); DiskFileItemFactory factory = new DiskFileItemFactory(); factory.setRepository( new File(System.getProperty("java.io.tmpdir"))); factory.setSizeThreshold( DiskFileItemFactory.DEFAULT_SIZE_THRESHOLD); factory.setFileCleaningTracker(null); ServletFileUpload upload = new ServletFileUpload(factory); List items = upload.parseRequest(request); Iterator iter = items.iterator(); while (iter.hasNext()) { FileItem item = iter.next(); if (!item.isFormField()) { try ( InputStream uploadedStream = item.getInputStream(); OutputStream out = new FileOutputStream("file.mov");) { IOUtils.copy(uploadedStream, out); } } } return "success!"; } 

Pada mulanya, kita perlu memeriksa apakah permintaan tersebut mengandungi kandungan multipart menggunakan kaedah isMultipartContent yang terdapat di kelas ServletFileUpload dari perpustakaan.

Secara lalai, Spring menampilkan MultipartResolver yang perlu kita lumpuhkan untuk menggunakan perpustakaan ini. Jika tidak, ia akan membaca kandungan permintaan sebelum sampai ke Pengawal kami .

Kami dapat mencapainya dengan memasukkan konfigurasi ini dalam fail application.properties kami :

spring.http.multipart.enabled=false

Sekarang, kita dapat menetapkan direktori di mana fail kita akan disimpan, ambang di mana perpustakaan memutuskan untuk menulis ke disk dan jika fail harus dihapus setelah permintaan berakhir.

Perpustakaan menyediakan kelas DiskFileItemFactory yangmengambil tanggungjawab konfigurasi untuk menyimpan dan membersihkan fail . The setRepository kaedah menetapkan direktori sasaran, dengan lalai yang ditunjukkan dalam contoh.

Seterusnya, setSizeThreshold menetapkan ukuran fail maksimum.

Kemudian, kami mempunyai kaedah setFileCleaningTracker yang, apabila diset ke null, membiarkan fail sementara tidak tersentuh. Secara lalai, ia akan menghapusnya setelah permintaan selesai .

Sekarang kita boleh meneruskan pengendalian fail yang sebenarnya.

Pertama, kami membuat ServletFileUpload kami dengan memasukkan kilang yang kami buat sebelumnya; kemudian kami terus menguraikan permintaan dan menghasilkan senarai FileItem yang merupakan abstraksi utama perpustakaan untuk bidang borang.

Sekarang jika kita tahu itu bukan bidang bentuk biasa, maka kita terus mengekstrak InputStream dan memanggil kaedah salinan yang berguna dari IOUtils (untuk lebih banyak pilihan, anda dapat melihat tutorial ini) .

Sekarang kita telah menyimpan fail kita dalam folder yang diperlukan. Ini biasanya merupakan cara yang lebih mudah untuk menangani keadaan ini kerana membolehkan akses mudah ke fail, tetapi juga kecekapan masa / memori tidak optimum.

Pada bahagian seterusnya, kita akan melihat API streaming.

4. Streaming API

API streaming mudah digunakan, menjadikannya cara yang baik untuk memproses fail besar hanya dengan tidak menyalin ke lokasi sementara:

ServletFileUpload upload = new ServletFileUpload(); FileItemIterator iterStream = upload.getItemIterator(request); while (iterStream.hasNext()) { FileItemStream item = iterStream.next(); String name = item.getFieldName(); InputStream stream = item.openStream(); if (!item.isFormField()) { // Process the InputStream } else { String formFieldValue = Streams.asString(stream); } } 

Kita dapat melihat dalam coretan kod sebelumnya bahawa kita tidak lagi menyertakan DiskFileItemFactory . Ini kerana, ketika menggunakan streaming API, kita tidak memerlukannya .

Seterusnya, untuk memproses bidang, perpustakaan menyediakan FileItemIterator , yang tidak membaca apa-apa sehingga kami mengekstraknya dari permintaan dengan kaedah seterusnya .

Akhirnya, kita dapat melihat bagaimana memperoleh nilai dari medan borang yang lain.

5. Kesimpulan

Dalam artikel ini, kami telah mengkaji bagaimana kita dapat menggunakan Perpustakaan Muat Naik Fail Apache Commons dengan Spring untuk memuat naik dan memproses fail besar.

Seperti biasa, kod sumber lengkap boleh didapati di GitHub.