Pertama, izinkan saya memperkenalkan teknologi yang relevan:
Dua parameter penting dalam metode layanan.
ServletRequest menggunakannya untuk menerima permintaan pengguna, dan fungsinya adalah:
Salah satu subinterfacesnya: javax.servlet.http.httpservletrequest
ServletResponse digunakan untuk mengembalikan data kepada pengguna.
Salah satu subinterfacesnya: javax.servlet.http.httpservletResponse
Teknologi Unduh File:
Teknologi unduhan file relatif mudah untuk file unggahan file. Ayo ambil mengunduh gambar sebagai contoh:
Jelajahi gambar terlebih dahulu dan kemudian unduh
1. Kode front-end:
<span style = "font-size: 14px;"> <a href = "img"> Temukan semua gambar di bawah folder </a> <br/> </span>
Meja depan dapat dilakukan hanya dalam satu kalimat. Langsung cari program latar belakang melalui web.xml
2. Kode Tampilan Latar Belakang:
<span style = "font-size: 14px;"> Public Class ShowImg memperluas httpservlet {public void doGet (httpservletRequest, respons httpservletResponse) t servletException, ioException {<span = "white-space: pre"> </span> dopost (permintaan, respons); // Untuk mencegah pengecualian, menghubungkan doget dan dopost bersama} </span> <span style = "font-size: 14px;"> public void dopost (httpservletRequest, htt pservletResponse response) melemparkan servletexception, IOException {request.setcharacterencoding ("UTF-8"); "> <span style =" font-size: 14px; "> // <span style =" white-space: pre "> </span> hubungi servletContext, tentu saja, Anda juga dapat menyebutnya secara langsung --- Saat terdaftar satu per satu jalur absolut ke file diperlukan saat gambar digunakan </span> ServLetContext Context = getSerVletContext (); string path = context.getRealPath ("/imgs"); // Temukan jalur absolut file folder = file baru (path); "> // <span style =" White-space: pre "> </span> Setelah menemukan folder, daftar semua gambar untuk pengguna untuk menelusuri file string [] = file.list (); untuk (string fn: file) {</span> <pre name = "code"> <span style = "font-size: 14px;"> // tunjukkan semuanya </span> String img = "<img src = 'imgs/"+fn+"'/>";
// out.print ("<a href = imgs/'"+fn+"> Unduh gambar </a>"); string str = "<a href =' down? name = imgs/"+fn+"'> Unduh gambar </a> "; // Berikan hyperlink untuk diunduh, lewati parameter --- Transfer nama file ke konten tautan pengguna dan tulis out.print (str); out.print (img+" <br/ > ");}}
3. Unduh file tertentu
Pertama, protokol yang sesuai harus diatur. Protokol unduhan memerlukan pengaturan header unduhan yang sesuai
<span style = "White-space: pre"> </span> <span style = "font-size: 18px;"> <strong> response.setContentType ("Application/force-download" </strong>);/ /Atur header yang sesuai </span> Saat mengunduh, Anda perlu menampilkan nama file dari gambar saat ini.
<span style = "font-size: 18px;"> <span style = "white-space: pre"> </span> outputStream out = response.getOutputStream (); // Dapatkan string stream output name = reque st. getParameter ("name"); // Nama parameter yang diteruskan dari layanan klien adalah int num = name.lastIndexof ("/"); "UTF- 8"); // Jika orang Cina perlu dikodekan // System.out.println (AA); Strong> lampiran; Membuat unduhan tertentu
<span style = "font-size: 18px;"> string fileName = this.getSerVletContext (). getRealpath (name); // Dapatkan jalur absolut, lewati nama file, dan pada saat yang sama, lewati jalur absolut itu dapat diperoleh dan Anda dapat membacanya inputstream in = new FileInputStream (nama file); {out.write (b, 0, len);} </span> Gambar reproduksi:
Render setelah mengklik:
Nama file berbeda
Teknologi unggahan file
Akan sangat merepotkan untuk mengunggah file sendiri, sehingga kami dapat menggunakan paket orang lain untuk mengunduh tautan dan mengklik untuk membuka formulir tautan:
Klien harus menggunakan tipe data multipart/form-data untuk mewakili tipe data komposit saat mengirim HTTP.
Yaitu: <bentuk enctype = "multipart/form-data">
Gunakan <input type = "file" name = "somename"/> tag html dalam formulir.
Paket Diperlukan:
Commons-fileupload.jar, alat unggahan file inti ada dalam paket ini.
Paket Commons-Oo.jar Diperlukan untuk Mengunggah File
Penjelasan terperinci:
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.
Proses utama:
File f = file baru ("f:/ex/temp"); // Tentukan lokasi penyimpanan file sementara
DiskFileItemFactory ff = DiskFileItemFactory baru (1024*1024*5, f); // Lokasi ukuran dan penyimpanan file sementara
Servletfileupload sf = servletfileUpload baru (ff);
Daftar <FILEITEM> DAFTAR = SF.ParSeRequest (Request); // Mulai Parsing
untuk (fileItem it: list) {// Dapatkan nama file. Dan gunakan UUID untuk menyelesaikan masalah nama duplikat
Fileutils.copyInputStreamToFile (it.getInputStream (), File baru (path+"/"+fileName)); // Di folder yang ditulis ditulis
}
1. Kode meja depan:
<span style = "font-size: 18px;"> <h2> unggah file </h2> <form aksi = "upfile" method = "post" <span style = "color:#ff0000;"> enctype = "multipart /form-data "</span>> // Itu harus ditulis, jika tidak stasiun tidak dapat menerima data <!-Enctype =" multipart/form-data "ini ---> file1 <input type =" file "< span style = "color:#ff6666;"> name </pan> = "file"/> <br/> Harap masukkan nama: <input type = "text" <span style = "color:#ff6666;"> Nama </span> = "desc"/> <br/> file2 <input type = "file" <span style = "color:#ff6666;"> nama </span> = "file"/> <br/> Harap masukkan nama: <input type = "text" <span style = "color:#ff0000;"> name </span> = "desc"/> <br/> <input type = "kirim" value = " "/> </form> </span>
2. Kode Latar Belakang:
2-1 Pertama membuat pabrik berbasis hard disk untuk menyimpan file sementara
// Tentukan file lokasi penyimpanan sementara f = file baru ("f:/ex/temp"); // Tentukan lokasi penyimpanan sementara diskfileItemFactory ff = DiskfileItemFactory baru (1024*1024*5, f); // Ukuran dari File sementara dan lokasi penyimpanan2-2 Buat Objek ServletFileUpload dan atur ukuran file untuk memaksimalkan transfer file
// Buat objek untuk parsing servletFileUpload sf = new servletfileUpload (ff); *20); // Nilai maksimum semua file adalah string Path = this.getServletContext (). GetRealPath ("/IMGS"); 2-3 mulai mem-parsing objek
<span style = "white-space: pre"> </span> list <fileitem> list = sf.parserequest (permintaan); // Dapatkan semua informasi yang dikirimkan dari meja depan, meja depan harus mengisi enctype = "multipart /Form- data "untuk (fileItem it: list) {it0 = it; // <span style =" white-space: pre "> </span> Jika itu adalah objek bentuk normal-Anda dapat secara langsung menilai jika ( it.isformField ()) {// Ini adalah item formulir normal, seperti type = nama teks nilai string name = it.getString ("UTF-8"); +nama); // Di bawah nama penjelasan yang ditulis} else {<span style = "White-space: pre"> </span> // Ini adalah nama file yang dipilih oleh string name meja depan = it.getname (); // jalur file spesifik-- -absolute path // string str = it.getString (); // konten dalam file // system.out.println ("str"+str); .getContentType (); <name = "code" style = "font- ukuran: 18px;"> // <span style = "White-space: pre"> </span> Nama file sumber daya di sisi server tidak dapat dalam bahasa Cina, Browser akan secara otomatis menyandikannya --------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- ------------ Nama file yang diunggah dikonversi menjadi nama tanpa penyimpanan Cina. Nama pemetaan harus disimpan, dan kemudian dikonversi kembali saat pengguna mengunduh. // Nama peta string id = uuid.randomuuid (). Tostring (). Ganti ("-", ""); // Satu-satunya UUID yang digunakan untuk // nama file string lastName = name.substring (nama. lastIndexof (".")); // File format // Nama file semua ditemukan --- kombinasi string fileName = id+lastName; // Nama file baru // Salin Stream. Biarkan menulis ke lokasi yang sesuai fileUtils.copyInputStreamtoFile (it.getInputStream (), file baru (path+"/"+nama file)); // path adalah jalur absolut dari penyimpanan-yang ditentukan sebelumnya} sebelumnya
Ini dapat mencapai unggahan sederhana, tetapi unggahan semacam ini tidak aman sama sekali. Kode lengkap dilampirkan dengan masalah kecil untuk mencegah masalah umum.
Setelah memilih file
Periksa file di IMG server web, file telah diunggah ke halaman "Nama file yang dihasilkan oleh UUID"
Kode Sumber Unggah File:
<span = "font-size: 14px;"> Paket CN.Hncu.upfile; impor java.io.file; Java .util.list; .apache .commons.fileupload.fileItem; Apache.Commons .io.fileutils; Tidak ada respons <span style = "White-space: pre;"> </span> @Override <span style = "White-space: pre;"> </span> void doGet yang dilindungi (httpservletRequest req, http servletresponse resp) < span style = "White-space: pre;"> </span> melempar servletException, ioException {<span style = "White-space: pre;"> </span> resp.setContentType ("UTF-8"); span style = "White-space: pre;"> </span> writer wr = resp.getWriter (); Metode yang didukung namun unggah "); <span style =" White-space: pre; "> </span>} <span style =" White-space: pre; "> </span> <span style =" White-space : pre; "> </span> public void dopost (permintaan httpservletRequest, respons httpservletresponse) <span style =" white-space: pre; "> </span> melempar servletException, ioException {<span style =" white-space: pra; "> </span> request.setcharacterencoding (" UTF-8 "); <span style =" White-space: pre; "> </span> response.setContentType (" Teks/html; charset = utf- 8 "); <span style =" White-space: pre; "> </span> printwriter out = response.getWriter (); <span style =" white-space: pre; "> </span> // lindungi ke Formulir Normal Metode Unggah 1: <span style = "White-space: pre;"> </span> // value return get (null) post1 (aplikasi/x-form-urlencoded, bentuk normal) post2 (file: multipart/ Formulir- Data, Formulir Upload File) // <span style = "White-space: pre;"> </span> string type = request.getContentType (); > </span>if( !type.contains("mulitpart/form-data ")) {// <span style =" white-space: pre; "> </span> out.write (" Jangan mendukung unggahan mendukung unggahan dari bentuk normal 2 "); // <span style =" White-space: pre; "> </span> return; // <span style =" White-space: pre; "> </span>} <span style = "White-Space: Pre;"> </span> // Metode 2 <span style = "White-space: pre;"> </span> boolean boo = servletfileUpload.ismultipartContent (permintaan); <span style = "White- space: pre;"> </span> if (boo == false) {<span style = "White-space: pre;"> </span> out.print ("Unggah 1 dari bentuk normal tidak didukung "); <span style =" spasi putih: pre; "> </span> <span style =" White-space: pre; "> </span>} <span style =" White-space: pre; "> </span>} span> <span style =" White-space: pre; "> </span> // Tentukan lokasi penyimpanan sementara <span style =" White-space: pre; "> </span> file f = file baru ("f:/ex/temp"); // Tentukan lokasi penyimpanan file sementara <span style = "White-space: pre;"> </span> diskfileItemFactory ff = DiskFileItemFactory baru (1024*1024* 5, f); // Ukuran file sementara dan lokasi penyimpanan <span style = "White-space: pre;"> </span> <span style = "white-space: pre;"> </span> // create Objek untuk parsing <span style = "White-space: pre;"> </span> servletfileUpload sf = servletfileUpload baru (ff); (1024*1024*10); // Nilai maksimum hanya satu lokasi penyimpanan adalah 10m <span style = "White-space: pre;"> </span> sf.setsizeMax (1024*1024*20);/ /Nilai maksimum semua file adalah 20m <span style = "White-space: pre;"> </span> string path = this.getServletContext (). GetRealPath ("/imgs"); Ruang: pra; "> </span> System.out.println (" Jalur penyimpanan: "+path); <span style =" White-space: pre; "> </span> // Mulai parsing <span style = "White-Space: Pre;"> </span> FileItem It0 = null; // Digunakan untuk menghapus file sementara di <span style = "White-space: pre;"> </span> coba {<span style = "White-Space: Pre;"> </span> Daftar <FILEITEM> LIST = SF.ParSequest (permintaan); // Dapatkan semua informasi yang dikirimkan dari meja depan, meja depan harus mengisi enctype = "multipart/form- data "<span style =" white- space: pre; "> </span> for (fileitem it: list) {<span style =" white-space: pre; "> </span> it0 = it; <span style = "White-space: pre;"> </span> if (it.isformField ()) {// adalah item bentuk normal, seperti type = nilai teks nama <span style = "White-space: pre ; "> </span> name string = it.getString (" UTF-8 "); <span style =" White-space: pre; "> </span> System.out.println (" Nama item Formulir Dasar: "+name); // Ditulis di bawah nama penjelasannya adalah <span style =" White-space: pre; "> </span>} else {<span style =" White-space: pre; "> <// span> string name = it.getName ();//jalur file tertentu // <span style = "White-space: pre;"> </span> string n1 = it.getFieldName (); "SPACE WHITE: Pre;"> </span> string str = it.getString (); // Konten dalam file // <span style = "White-space: pre;"> </span> sistem. out.println ("str"+str); -space: pre; "> </span> string contentType = it.getContentType (); <span style =" white-space: pre; "> </span> ukuran panjang = it.getsize (); <span style = "White-Space: Pre;"> </span> // mencegah file dari kosong <span style = "White-space: pre;"> </span> if (size == 0) {<span style = " White-Space: Pre; "> </span> Lanjutkan; // File itu kosong, kembali secara langsung; <span style =" White-space: pre; "> </span>} <span style =" White-space : pra; "> </span> // Nama pengguna. Anda harus mengisi <span style = "white-space: pre;"> </span> if (name == null || name.trim () == "") {<span style = "White-space: pre ; "> </span> lanjutkan; <span style =" White-space: pre; "> </span>} <span style =" White-space: pre; "> </span> // <span style = "SPACE: Pre;"> </span> System.out.println (Name+","+ContentType+","+size); / Nama file sumber daya di sisi server tidak dapat dalam bahasa Cina, browser akan secara otomatis menyandikannya ------------------------------ -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- ------> </span> // Untuk memungkinkan pengguna mengembalikan nama aslinya saat mengunduh, mereka harus menyimpan korespondensi antara nama file asli dan nama pemetaan, dan mengonversinya kembali ketika pengguna mengunduh. pre; "> </span> // Pemetaan Nama <span style =" White-space: pre; "> </span> string id = uuid.randomuuid (). tostring (). ganti ("-"," "" ); <span style = "white-space: pre;"> </span> // nama file <span style = "White-space: pre;"> </span> string lastname = name.substring (name.lastIndexof (".")); <span style = "White-space: pre;"> </span> // format file nama semuanya ditemukan --- kombinasi <span style = "White-space: pre;"> </span> string fileName = ID+LastName; Biarkan menulis ke lokasi yang sesuai <span style = "white-space: pre;"> </span> fileutils.copyInputStreamtofile (it.getInputStream (), file baru (path+"/"+filename));} <span style) = "White-Space: Pre;"> </span>}} catch (FileUploAdException e) {<span style = "White-space: pre;"> </span> Lempar runtimeException baru ("Kesalahan parsing unggahan file." + e); <span style = "White-space: pre;"> </span>} akhirnya {<span style = "white-space: pre;"> </span> if (it0 == null) {< span style = "spasi putih: pre;"> </span> it0.delete (); // hapus file sementara <span style = "white-space: pre;"> </span>}} out.close ( );}} </span> <span style = "font-size: 18px;"> </span> Kode sumber unduhan file: [html] Lihat PlainCopyPrint? <span style = "font-size: 14px;"> Paket cn .hncu.downimg; Servlet.servletexception; respons ervletresponse) melempar ServletExcepti di, ioException {dopost (permintaan, respons); Kirim nama pengguna ke meja depan/*Transfer string nama pengguna tetap AA = "1.jpg"; // Jika ada dalam bahasa Cina, Anda perlu mengkode aa = urlencoder.encode (aa, "UTF-8"); response.setHeader ("Disposisi konten", "lampiran; fileName = '"+aa+"'"); ///// Anda harus menambahkan "lampiran;", jika tidak itu akan menjadi penelusuran*/outputStream out = respons. getoutputStream (); // Dapatkan string string output nama = permintaan. substring (num+1); Disposisi "," lampiran; fileName = '"+aa+"' "); // Dapatkan nama file yang diteruskan dari sana sehingga dapat diunduh saat menyimpan string filename = this.getSerVletContext (). GetRealPath (name); // Dapatkan InputStream Path Absolute in = FileInputStream baru (nama file); tulis (b, 0, len);}}} </span> <span style = "font-size: 18px;"> </span>Di atas adalah semua tentang artikel ini, saya harap ini akan membantu untuk pembelajaran semua orang.