Tinjauan Upload File
Untuk mewujudkan fungsi unggahan file dalam pengembangan web, Anda perlu menyelesaikan dua langkah berikut:
Tambahkan input unggah ke halaman web
Baca data file yang diunggah di servlet dan simpan ke hard disk lokal.
Bagaimana cara menambahkan item input unggah ke halaman web?
Tag <input type = "file"> digunakan untuk menambahkan file input unggahan file ke halaman web. Anda harus memperhatikan saat mengatur file input unggahan file:
1. Atribut nama item input input harus diatur, jika tidak browser tidak akan mengirim data file yang diunggah.
2. Nilai enctype bentuk harus diatur ke multipart/form-data. Setelah menetapkan nilai ini, ketika browser mengunggah file, itu akan melampirkan data file ke badan pesan permintaan HTTP, dan menggunakan protokol MIME untuk menggambarkan file yang diunggah untuk memfasilitasi penerima untuk menguraikan dan memproses data yang diunggah.
Tinjauan Upload File
Bagaimana cara membaca data unggahan file di servlet dan menyimpannya ke hard disk lokal?
Objek permintaan menyediakan metode GetInputStream, yang melaluinya data yang dikirimkan oleh klien dapat dibaca. Namun, karena pengguna dapat mengunggah banyak file secara bersamaan, itu adalah pekerjaan yang sangat merepotkan untuk membaca data unggahan secara terprogram secara langsung di sisi servlet dan menguraikan data file yang sesuai secara terpisah, contoh.
Untuk memfasilitasi pengguna untuk memproses data pengunggahan file, Organisasi Sumber Terbuka Apache menyediakan komponen open source (Commons-Fileupload) yang digunakan untuk memproses unggahan file formulir. Komponen ini memiliki kinerja yang sangat baik dan API -nya sangat mudah digunakan, memungkinkan pengembang untuk dengan mudah mengimplementasikan fungsi pengunggahan file web. Oleh karena itu, fungsi unggahan file biasanya diimplementasikan dalam pengembangan web, yang biasanya diimplementasikan menggunakan komponen Commons-Fileupload.
Gunakan komponen Commons-Fileupload untuk mengimplementasikan unggahan file, dan Anda perlu mengimpor paket toples dukungan yang sesuai untuk komponen ini: Commons-Fileupload dan Commons -o. Commons-IO bukan milik file JAR pengembangan untuk komponen unggahan file, tetapi komponen Commons-Fileupload dimulai dengan versi 1.1 dan membutuhkan dukungan dari paket Commons -o saat berfungsi.
alur kerja komponen fileupload
API inti - diskfileitemfactory
DiskFileItemFactory adalah pabrik yang membuat objek FileItem. Metode umum untuk kelas pabrik ini:
public void setsizethreshold (int sizethreshold): Mengatur ukuran buffer memori, nilai default adalah 10k. Ketika file unggahan lebih besar dari ukuran buffer, komponen fileupload akan mengunggah file menggunakan cache file sementara.
public void setRepository (java.io.file repository): Tentukan direktori file sementara, nilai default adalah system.getProperty ("java.io.tmpdir").
DiskfileItemFactory publik (int sizethreshold, java.io.file repositori): konstruktor
Core API - ServletFileUpload
ServletFileUpload bertanggung jawab untuk memproses data file yang diunggah dan merangkum setiap item input dalam formulir ke dalam objek FileItem. Metode umum adalah:
Boolean IsmultipartContent (permintaan httpservletrequest): Menentukan apakah formulir yang diunggah adalah tipe multipart/formulir-data
Daftar ParSeRequest (permintaan httpservletRequest): Parse objek permintaan, bungkus setiap item input dalam formulir ke objek FileItem, dan kembalikan koleksi daftar yang menyimpan semua fileItem.
SetFilesizeMax (Long FilesizeMax): Atur nilai maksimum file yang diunggah
SetSizeMax (Long Sizemax): Tetapkan nilai maksimum dari jumlah total file yang diunggah
setheaderencoding (java.lang.string encoding): Atur format encoding
SetProgressListener (ProgressListener Plistener)
Casing Unggah File
Langkah Implementasi
1. Buat objek DiskFileItemFactory, atur ukuran buffer dan direktori file sementara 2. Gunakan objek DiskFileItemFactory untuk membuat objek ServletFileUpload, dan atur batas ukuran untuk mengunggah file.
3. Hubungi ServletFileUpload.ParseRequest Metode untuk menguraikan objek permintaan dan dapatkan objek daftar yang menyimpan semua konten yang diunggah.
4. Iterasi melalui daftar. Setiap mengulangi objek FileItem, dan memanggil metode ISFormField untuk menentukan apakah itu adalah file yang diunggah.
Ini adalah bidang bentuk normal, lalu hubungi GetFieldName dan Metode Getstring untuk mendapatkan nama bidang dan nilai bidang
Untuk mengunggah file, metode GetInputStream dipanggil untuk mendapatkan aliran input data, sehingga membaca data yang diunggah.
Pengkodean untuk mengimplementasikan unggahan file
Memproses detail pengunggahan file
Masalah File China
Masalah nama file Cina yang kacau, Anda dapat menghubungi metode setheaderencoding dari servletuploader, atau mengatur properti setCharacterencoding dari permintaan tersebut
Masalah Penghapusan File Sementara
Karena ukuran file melebihi ukuran buffer memori yang ditetapkan oleh DiskFileItemFactory.SetsizeTheshold Method, komponen Commons-Fileupload akan menggunakan file sementara untuk menyimpan data yang diunggah. Oleh karena itu, di akhir program, pastikan untuk menghubungi metode fileitem.delete untuk menghapus file sementara.
Panggilan ke metode Hapus harus setelah aliran ditutup, jika tidak, penggunaan file akan terjadi, yang mengakibatkan kegagalan penghapusan.
Lokasi penyimpanan file
Untuk memastikan keamanan server, file yang diunggah harus disimpan di direktori web-INF aplikasi, atau direktori yang tidak dikelola oleh server web.
Untuk mencegah beberapa pengguna mengunggah file dengan nama file yang sama, menghasilkan file yang menimpa, pengunggah file harus memastikan bahwa file yang diunggah memiliki nama file yang unik.
Untuk mencegah terlalu banyak file dalam satu direktori dan mempengaruhi kecepatan membaca dan menulis file, program yang menangani file mengunggah harus memilih algoritma pembuatan struktur direktori yang sesuai berdasarkan jumlah total yang mungkin diunggah file, dan menyimpan file yang diunggah dengan cara yang tersebar.
Unduh File
Karena file yang akan diunduh dapat berupa berbagai jenis, file harus ditransfer ke klien, dan konten yang sesuai harus diproses sebagai biner, sehingga metode tersebut harus dipanggil untuk mengembalikan objek ServeltOutputStream untuk menulis konten file ke klien.
Unduh kasingnya
Izin melalui semua file di direktori unggah dan menampilkannya kepada pengguna dan memungkinkan pengguna untuk menyelesaikan unduhan.
(Baca semua file di folder tertentu, simpan ke daftar dalam koleksi, dan kemudian simpan ke ruang lingkup permintaan) ListFileServlt― (tunjukkan semua file daftar) listFiles.jsp ---- downloaservlet.javaprivate string id; private string savename; // Nama file unggahan, nama UUID dari file private string realname; // Nama asli file unggah pribadi string savePath; // Ingat lokasi file uptime tanggal pribadi; // Waktu unggahan dari deskripsi string pribadi file; // Deskripsi file pengguna string pribadi file; // Pengunggah ListFileServletPackage com.hbsi.servlet; impor java.io.file; import java.io.ioException; impor java.io.printwriter; impor java.util.hashmap; import java.util.map; impor javax.servlet.servlet javax.servlet.http.httpservlet; importJavax.servlet.http.httpservletRequest; importJavax.servlet.http.httpservletRespons; Respons) ThrowsServletException, ioException {stringsAvePath = this.getSerVletContext (). getRealPath ("/web-inf/unggah"); mapMap = hashMap baru (); listFile (newfile (savePath), peta); request.setAttribute ("peta", peta); request.getRequestDispatcher ("/listFile.jsp"). Forward (request, response);} Privatevoid listFiles (file file, peta peta) {if (file.isfile ()) {stringuUdname = file.getName (); // uuid_a_1_3_3.txtStringrealname = uuidname.substring(uuidname.indexOf("_") + 1);map.put(uuidname,realname);}else {File[]files = file.listFiles();for(File f : files) {listFiles(f,map);}}}publicvoid DOPOST (permintaan httpservletRequest, respons httpservletResponse) ThrowsServletException, ioException {doGet (permintaan, respons);}} downloadservletpackage com.hbsi.servlet; impor java.io.file; impor java.io.hbsi.servlet; java.io.outputStream; import java.io.printwriter; impor java.net.urlencoder; import javax.servlet.servletException; impor javax.servlet.http.httpservlet; importjavax.servlet.http.httpservletrequest; importJavax.servlet.http.httpservletResponse; respons) ThrowsServletException, ioException {stringFileName = request.getParameter ("FileName"); fileName = string baru (filename.getbytes ("iso8859-1"), "utf-8"); System.out.println (fileName); stringsavePath = this. = file baru (savePath + "//" + fileName); if (! f.exists ()) {request.setAttribute ("pesan", "sumber daya yang diunduh tidak ada"); request.getRequestDispatcher ("/pesan Urlencoder.encode (this.getRealName (fileName), "utf-8")); fileInputStreaminS = FileInputStream (f); byte [] buf = byte baru [1024]; intlen = 0; outputStreamout = response.getOutputStream (); while ((len = in.read (outputStreamout = getoutputStream (); while ((len = in.read (outputStreamout = getoutputStream (); while ((len = in. len);} in.close ();} publicString getFilesAvePath (string fileName) {intdir1 = filename.hashcode () & 0xf; intdir2 = (filename.hashcode () >> 4) & 0xf; stringSavePath = this.getservletex () "." dir1 + "//" + dir2;returnsavepath;}publicString getRealName(String filename) {StringrealName = filename.substring(filename.indexOf("_") + 1);returnrealName;}publicvoid doPost(HttpServletRequest request, HttpServletResponse response)throwsServletException, IoException {doGet (request, response);}}