Contoh -contoh dalam artikel ini berbagi dengan Anda teknologi unggahan file java untuk referensi Anda. Konten spesifiknya adalah sebagai berikut
Membentuk:
Klien harus menggunakan tipe data multipart/form-data untuk mewakili tipe data komposit saat mengirim HTTP. Sekarang:
Gunakan tag HTML dalam bentuk.
Paket Diperlukan:
Commons-fileupload.jar, alat file unggahan inti ada dalam paket ini.
Paket Commons-Oo.jar Diperlukan untuk Mengunggah File
Penjelasan terperinci tentang mengunggah kelas file:
DiskFileItemFactory - Buat direktori file pemantauan waktu, yang mengacu pada ukuran area cache
ServletFileUpload digunakan untuk menguraikan httpservletRequest. Mengembalikan satu set objek file.
FileItem mewakili setiap objek file yang diunggah oleh pengguna.
<%@ page language = "java" import = "java.util.*" pageEncoding = "UTF-8"%> <! Doctype html public "-// w3c // dtd html 4.01 transisi // en"> <html> <omead> <titem Papan-Pahami lapisan yang mendasari </font> <!-multipart/form-data: multipart (tidak hanya file, tetapi juga bagian)-> <form Action = "<%= request.getContextPath ()%>/unggah" METODE "" POST "ENCTYPE =" Multipart/Form-Data "> File: <Input Type =" "POST" ENCTYPE = "Multipart/Form-Data"> <!-Nama file yang diunggah tidak dapat dalam bahasa Cina, jika tidak, nama file yang diperoleh kacau, tetapi contoh berikut dapat menyelesaikan masalah ini-> </form> <br/> <font color = "red" size = "6"> Gunakan alat unggahan file Apache (font unggahan "(font =" font/form <ponts = ack =%/x-wwwwwwwww-form-ublencoded-/unggah unggahan. Method = "Posting" enctype = "multipart/form-data"> File: <input type = "file" name = "file"/> <input type = "kirim" value = "unggah"/> </form> <font color = "red" size = "6"> Gunakan unggahan file apache untuk mencapai unggahan file 2 (solve name found unggahan. enctype = Application/X-WWW-Form-Urlencoded (nilai default) </p> <p> post2 (unggah formulir file): enctype = multipart/form-data: multipart (tidak hanya file, tetapi juga bagian) </p> <bentuk acti type = "file" name = "file"/> <!-post2 (unggah formulir file)-> <br/> file deskripsi: <input type = "text" name = "desc"/> <!-post1 (formulir normal)-> <br/> file 2: <input type = "name =" file "/<br/ <br/> Deskripsi file 2: <input type =" name = "file" " -> <br/> File 2: <Input type = "file" name = "file"/> <br/> File Deskripsi 2: <input type = "text" name = "desc"/> <input type = "kirim" value = "unggah"/> </formrum> <font color = "red" size = "6" menggunakan alat unggahan norma) <font color = "red" Formulir): enctype = Application/X-WWW-Form-Urlencoded (nilai default)-> <!-post2 (unggah formulir file): enctype = multipart/form-data: multipart (tidak hanya file, tetapi juga bagian)-> <form Action = "<%= equild.getContextPath ()%/unggah" METODE = "POSP = POSTPART" MOTOD "POSTPART" METODE "POSTPART" type = "file" name = "file"/> <!-post2 (unggah formulir file)-> <br/> deskripsi file: <input type = "text" name = "desc"/> <!-post1 (formulir normal)-> <br/> <br/> file 2: <input type = "file" name = "file"/<br/> <br in> "input" name "name =" "file"/<br/> <br/<br input = "" "" " value = "unggah"/> </form> </body> </html>
Memahami lapisan bawah papan transisi
Paket cn.hncu.servlet; impor java.io.bufferedreader; import java.io.ioException; impor java.io.inputstream; impor java.io.inputStreamReader; impor java.printwriter; impor javax.servlet.servletexception; javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletResponse; unggah kelas publik. di = request.getInputStream (); BufferedReader BR = BufferedReader baru (InputStreamReader baru (IN)); Garis string; while ((line = br.readline ())! = null) {System.out.println (line); }}}Gunakan alat unggah file apache untuk mengimplementasikan unggahan file
Paket cn.hncu.servlet; impor java.io.file; impor java.io.ioException; import java.io.printwriter; impor java.util.list; impor java.util.uuid; import javax.servletexception; impor javax.servlet javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletResponse; import org.apache.commons.fileupload.fileitem; impor org.apache.commons.fileupload.fileuPoadeM; org.apache.commons.fileupload.disk.diskfileItemFactory; impor org.apache.commons.fileupload.servlet.servletfileupload; impor org.apache.commons.io.fileutils; unggah kelas publik. HttpservletResponse response) melempar servletException, ioException {response.setContentType ("Text/html"); Printwriter out = response.getWriter (); out.println ("<! Doctype html public/"-// w3c // dtd html 4.01 transisi // en/">"); out.println ("<Html>"); out.println ("<head> <title> a servlet </iteme> </head>"); out.println ("<body>"); out.print ("tidak mendukung mendapatkan pengunggahan ...."); out.println ("</body>"); out.println ("</html>"); out.flush (); out.close (); } public void dopost (permintaan httpservletrequest, respons httpservletResponse) melempar servletException, ioException {// di server, tentukan direktori untuk semua file string path = getServletContext (). getRealPath ("/unggah"); System.out.println ("Path:"+Path); File dir = file baru (path); if (! dir.exists ()) {dir.mkdirs (); } // Buat pabrik berbasis hard disk // diskfileItemFactory disk = DiskFileItemFactory () baru; // atur direktori sementara (disarankan untuk merancang direktori sementara, jika tidak, direktori sementara sistem akan digunakan.) //Disk.setrepository( file ("d:/a")); // 3. Atur ukuran buffer untuk menulis data ke disk hard disk. // Ketika file lebih besar dari pengaturan ini, file sementara akan dibentuk di direktori sementara // Atur ukuran buffer file sementara-buffer 8k, alamat file sementara diskfileitemfactory f = DiskfileItemFactory baru (1024*8, file baru ("D:/a")); // Upload Tool-Buat objek untuk parsing servletFileUpload unggah = servletFileUpload baru (f); unggah.setFilesizeMax (1024*1024*5); // Atur file tunggal yang diunggah maksimum ke 5m // atur ukuran maksimum file yang diunggah. Jika itu adalah beberapa file, itu adalah jumlah dari beberapa file hingga 8m unggah.setsizeMax (1024*1024*8); // Atur jumlah semua ukuran file yang diunggah hingga 8m // Gunakan alat parsing untuk parse coba {list <fileitem> list = unggah.parsequest (permintaan); untuk (FileItem Fi: Daftar) {System.out.println ("Jenis Konten File:"+fi.getContentType ()); // Jenis Konten File: Teks/Sistem Plain ext = fi.getName (). Substring (fi.getName (). LastIndexof (".")); //. Txt string uuid = uuid.randomuuid (). ToString (). REPLACE ("-", ""); String filename = uuid+ext; // fileutils.copyInputStreamtofile (fi.getInputStream (), file baru ("d: /a/d/a.txt")); // Tuliskan itu mati // fi.getInputStream () adalah informasi file nyata fileutils.copyinputstreamtile (fi.iDetile (fi. File (path+"/"+fileName)); // tuliskan itu hidup}} catch (fileuploadException e) {e.printstacktrace (); }}} Simpan file yang diunggah di tempat ini
Unggah informasi:
Hasil Unggah:
Gunakan alat unggah file apache untuk mencapai unggahan file 2 (selesaikan nama file yang kacau)
Paket cn.hncu.servlet; impor java.io.file; impor java.io.ioException; import java.io.printwriter; impor java.util.list; impor java.util.uuid; import javax.servletexception; impor javax.servlet javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletResponse; import org.apache.commons.fileupload.fileitem; impor org.apache.commons.fileupload.fileuPoadeM; org.apache.commons.fileupload.disk.diskfileItemfactory; impor org.apache.commons.fileupload.servlet.servletfileupload; impor org.apache.commons.io.fileutils; unggah kelas publik HttpservletResponse response) melempar servletException, ioException {response.setContentType ("Text/html"); // Jika itu adalah formulir yang berisi file yang diunggah (POST2), drama ini hanya dapat mengatur pengkodean dalam nama file file yang diunggah (menyelesaikan kode yang kacau Cina) // tetapi tidak dapat menyelesaikan kode komponen bentuk biasa di Chinese dalam mode printwriter post2 out = response.getwriter (); out.println ("<! Doctype html public/"-// w3c // dtd html 4.01 transisi // en/">"); out.println ("<Html>"); out.println ("<head> <title> a servlet </iteme> </head>"); out.println ("<body>"); out.print ("tidak mendukung mendapatkan pengunggahan ...."); out.println ("</body>"); out.println ("</html>"); out.flush (); out.close (); } public void dopost (permintaan httpservletRequest, respons httpservletResponse) melempar servletException, ioException {// Langkah 1 // Formulir Biasa (POST1), Kalimat berikut dapat mengatur pengkodean Konten Formulir Biasa (Can Can Celve Morseri Berlari-Gabungan Mereka). // Jika itu adalah formulir yang berisi file yang diunggah (POST2), kalimat ini hanya dapat mengatur pengkodean pada nama file file yang diunggah (menyelesaikan kode kacau Cina). Tetapi tidak dapat menyelesaikan kode yang kacau dari komponen formulir biasa (tidak dapat mengatur penyandiannya) // di server, tentukan direktori untuk semua file string path = getServletContext (). GetRealPath ("/unggah"); System.out.println ("Path:"+Path); File dir = file baru (path); if (! dir.exists ()) {dir.mkdirs (); } // Atur ukuran buffer file sementara-buffer 8k, alamat file sementara diskfileItemFactory f = DiskFileItemFactory baru (1024*8, file baru ("d:/a")); // unggah alat servletfileupload unggah = servletfileupload baru (f); unggah.setFilesizeMax (1024*1024*5); // Atur file tunggal yang diunggah maksimum ke 5m unggah.setsizeMax (1024*1024*8); // Atur jumlah dari semua ukuran file yang diunggah ke 8m // Gunakan alat parsing untuk parse coba {list <fileitem> list = unggah.parsequest (permintaan); untuk (FileItem fi: list) {if ((fi.isformField ())) {// Jika itu adalah komponen bentuk normal: kotak centang, radio, kata sandi ... // string desc = fi.getString (); System.out.println ("fi.getString ():"+fi.getString ()); // string langkah kedua desc = fi.getString ("UTF-8"); // Kalimat ini mengatur pengkodean konten dari komponen bentuk biasa.out.println ("Setelah pengkodean:"+desc); } else {string ext = fi.getName (). substring (fi.getName (). lastIndexof (".")); //. Txt string uuid = uuid.randomuuid (). toString (). ganti ("-", ""); String filename = uuid+ext; //fi.getInputStream () adalah informasi file nyata fileutils.copyInputStreamtofile (fi.getInputStream (), file baru (path+"/"+nama file)); // tuliskan itu hidup}}} (FileUploAdEpsception E) {e.printstacktrace (); }}}Unggah informasi:
Hasil Unggah:
Gunakan alat unggah file apache untuk mencapai unggahan file 3 (breakdown file)
Mengoptimalkan penyimpanan file dengan direktori hash:
Direktori hash adalah metode untuk mengoptimalkan kinerja penyimpanan file. Apakah itu Windows atau Linux, apakah itu NTFS atau EXT3, jumlah item yang dapat ditampung di setiap direktori terbatas.
Bukannya itu tidak dapat disimpan, tetapi ketika jumlah proyek terlalu besar, kecepatan pengindeksan file akan dikurangi.
Oleh karena itu, perlu menimbang berapa banyak file yang harus disimpan dalam direktori. Menyimpan terlalu banyak akan mempengaruhi kinerja, sementara menabung terlalu sedikit akan menyebabkan terlalu banyak direktori dan pemborosan ruang. Jadi saat menyimpan sejumlah besar file,
Ada algoritma yang dapat "memecahkan" file lebih merata di subdirektori yang berbeda untuk meningkatkan kecepatan indeks setiap level. Algoritma ini hash. MD5, SHA1, dll yang umum digunakan dapat digunakan sebagai direktori hash. MD5 juga digunakan dalam sesi saya untuk mendapatkan digit sessionID pertama dan kesembilan, yang merupakan jalur hash dua tingkat. Dengan kata lain, sistem mendistribusikan semua file sesi menjadi 16 × 16 = 256 subdirektori. Dengan asumsi bahwa menyimpan 1000 file di setiap direktori Linux dapat mencapai rasio kinerja ruang terbaik, sistem ini dapat memiliki 256.000 file sesi yang digunakan pada saat yang sama.
Paket cn.hncu.servlet; impor java.io.file; impor java.io.ioException; import java.io.printwriter; impor java.util.list; impor java.util.uuid; import javax.servletexception; impor javax.servlet javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletResponse; import org.apache.commons.fileupload.fileitem; impor org.apache.commons.fileupload.fileuPoadeM; org.apache.commons.fileupload.progresslistener; impor org.apache.commons.fileupload.disk.diskfileItemFactory; Impor org.apache.commons.fileupload.servlet.servletfileupload; impor org.ioMache.oOmmons.Servlet {public void doGet (permintaan httpservletRequest, respons httpservletResponse) melempar servletException, ioException {response.setContentType ("text/html"); // Jika itu adalah formulir yang berisi file yang diunggah (POST2), drama ini hanya dapat mengatur pengkodean dalam nama file file yang diunggah (menyelesaikan kode yang kacau Cina) // tetapi tidak dapat menyelesaikan kode komponen bentuk biasa di Chinese dalam mode printwriter post2 out = response.getwriter (); out.println ("<! Doctype html public/"-// w3c // dtd html 4.01 transisi // en/">"); out.println ("<Html>"); out.println ("<head> <title> a servlet </iteme> </head>"); out.println ("<body>"); // Dapatkan bagian setelah "?" Nomor dalam URL dalam metode get // http: // localhost: 8080/servletDemo3/unggah? name = jack & sex = jantan string qstr = request.getQueryString (); System.out.println ("qstr:"+qstr); // qstr: name = jack & sex = Male out.print ("Jangan mendukung mendapatkan unggahan ...."); out.println ("</body>"); out.println ("</html>"); out.flush (); out.close (); } public void dopost (permintaan httpservletRequest, respons httpservletResponse) melempar servletException, ioException {response.setContentType ("Teks/html; charset = UTF-8"); Printwriter out = response.getWriter (); // 1 Anti-Black: Front-end perlindungan diserahkan menggunakan metode post1 // metode 1 /* string type = request.getContentType (); if (! type.contains ("multipart/form-data")) {out.println ("pengiriman formulir yang tidak didukung"); kembali; }*/// Metode 2 boolean boo = servletfileupload.ismultipartcontent (permintaan); if (! boo) {out.println ("pengiriman formulir yang tidak didukung"); kembali; } // Langkah 1 // Formulir Formulir Biasa (POST1), kalimat berikut dapat mengatur pengkodean konten komponen bentuk biasa (dapat memecahkan masalah yang kacau Cina) permintaan.setcharacterencoding ("UTF-8"); // Jika itu adalah formulir yang berisi file yang diunggah (POST2), kalimat ini hanya dapat mengatur pengkodean pada nama file file yang diunggah (menyelesaikan kode kacau Cina). Tetapi tidak dapat menyelesaikan kode yang kacau dari komponen formulir biasa (tidak dapat mengatur penyandiannya) // di server, tentukan direktori untuk semua file string path = getServletContext (). GetRealPath ("/unggah"); System.out.println ("Path:"+Path); File dir = file baru (path); if (! dir.exists ()) {dir.mkdirs (); } // Atur ukuran buffer file sementara-buffer 8k, alamat file sementara diskfileItemFactory f = DiskFileItemFactory baru (1024*8, file baru ("d:/a")); // unggah alat servletfileupload unggah = servletfileupload baru (f); unggah.setFilesizeMax (1024*1024*5); // Atur file tunggal yang diunggah maksimum ke 5m unggah.setsizeMax (1024*1024*8); // Tetapkan jumlah maksimum dari semua ukuran file yang diunggah adalah 8m // ▲ 4 Upload Progress Mendengarkan Upload. pitems) {double D = 1.0*pbyteread/pcontentlength*100; // Gunakan alat parsing untuk parse coba {list <fileitem> list = unggah.parsequest (permintaan); untuk (FileItem fi: list) {if ((fi.isformField ())) {// Jika itu adalah komponen bentuk normal: kotak centang, radio, kata sandi ... // string desc = fi.getString (); System.out.println ("fi.getString ():"+fi.getString ()); // string langkah kedua desc = fi.getString ("UTF-8"); // Kalimat ini mengatur pengkodean konten dari komponen bentuk normal.out.println ("Pengkodean:"+desc); } else {// protect: filter out komponen file kosong yang belum memilih if (fi.getsize () <= 0) {lanjutan; // Baca file berikutnya} System.out.println ("Jenis konten file:"+fi.getContentType ()); // File Tipe: Teks/Teks/Sistem Plain System.out.println (") (") (") (" FiNOME: "FILMETEME:" Fi. C: /users/adl1/desktop/a.txt string ext = fi.getname (). Substring (fi.getname (). LastIndexof (".")); //. Txt string uuid = uuid.randomuuid (). Tostring (). Ganti ("", "); String filename = uuid+ext; // File Directory Breaking Technology String dir1 = integer.tohexstring (uuid.hashcode () & 0x0f); String dir2 = integer.tohexString ((uuid.hashcode () & 0xf0) >> 4); //fi.getInputStream () adalah file informasi file real fileutils.copyInputStreamtofile (fi.getInputStream (), file baru (path+"/"+dir1+"/"+dir2+"/"+nama file)); // Writing Alive}}} Catch (FileuploadeException E) {e) {e) {e) {e) {e) {e) {e) {e) {e) {e) {e) {e) {e) {e) {e) {e) {e) {e) {e) {file. }}}Hancurkan pesannya:
Hancurkan hasilnya:
File 1:
File 2:
Tunjukkan prinsip kemajuan unggahan
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.