Mengunggah dan mengunduh file sangat umum selama pengembangan. Berikut ringkasan singkatnya:
1. Kondisi yang harus dipenuhi untuk unggahan file:
A. Metode formulir halaman harus diposting karena data yang dikirimkan oleh get terlalu kecil
B. Enctype dari formulir halaman harus dari tipe multipart/form-data
C. Formulir ini memberikan perincian kode bidang input pengunggahan: dalam formulir klien: <bentuk enctype = "multipart/form-data"/>
(Jika properti ini tidak tersedia, jalur file yang dibaca oleh server akan bervariasi tergantung pada browser)
Server servletInputStream adalah = request.getInputStream (); memperoleh konten badan permintaan dalam aliran untuk analisis lebih lanjut.
2. Rincian pengunggahan file:
(1) Mengapa mengatur jenis formulir ke: multipart/form-data. Ini untuk mengatur nilai yang dilewati oleh formulir ini yang bukan kunci = nilai. Apa yang dilewatkan adalah bytecode.
Korespondensi antara formulir dan permintaan:
Seperti yang ditunjukkan di atas, Anda dapat melihat bahwa setelah mengatur jenis formulir ke: multipart/form-data, file yang Anda pilih diinisialisasi ke dalam biner di badan permintaan HTTP, seperti yang ditunjukkan pada gambar di atas di bawah string acak di bawah cookie.
Tetapi perhatikan bahwa ada dua baris karakter khusus dalam file bytecode yang dibagi dengan file identifikasi (mis. String string acak), yaitu baris pertama header file konten dan baris baris kosong. Baris ketiga setelah itu adalah konten file biner.
Oleh karena itu, ketika server menerima file yang diunggah oleh klien, saat mendapatkan biner file dalam parameter permintaan HTTP, tiga baris pertama harus dihapus.
3. Secara manual menguraikan file txt yang diunggah:
impor java.io.bufferedReader; import java.io.ioexception; impor java.io.inputStream; import java.io.inputStreamreader; impor java.io.printwriter; import javax.servlet.servletException; impor javax.servlet.http.htp. javax.servlet.http.httpservletRequest; impor javax.servlet.http.httpservletResponse;/** * Jika jenis formulir adalah pasca dan enctype adalah multipart/-form-date * maka semua data diteruskan ke server dalam mode biner. * Jadi req.getParameter ("xxx") selalu nol. * You can only get data through req.getInputStream() and get the data of the text* * @author wangxi * */public class UpServlet extends HttpServlet { public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding("UTF-8"); String txt = req.getParameter ("txt"); // pengembaliannya adalah null system.err.println ("txt adalah:"+txt); System.err.println ("==========================================="); InputStream in = req.getInputStream (); // byte [] b = byte baru [1024]; // int len = 0; // while ((len = in.read (b))! =-1) {// string s = string baru (b, 0, len); // system.err.print (s); InputStreamReader (dalam)); String firstLine = br.readline (); // Baca baris pertama, dan baris pertama adalah simbol yang dibatasi, yaitu, string acak string fileName = br.readline (); // baris kedua informasi file, dan mencegat nama file dari fileName = fileName.substring (filename.lastindexOf ("//////fILEname. FileName.substring (0, FileName.length ()-1); while (data = br.readline ())! = null) {if (data.equals (firstline+"-")) {break; 4. Gunakan Apache-Fileupload untuk memproses unggahan file:
Kerangka kerja: Mengacu pada merangkum bisnis yang sering diproses pengguna dalam kode. Buatlah mudah bagi pengguna untuk menelepon.
Komponen (bingkai) yang saat ini mengunggah file:
Apache-fileupload-
Orialiy cos 2008 () -
JSP-SMART-Upload 200m.
Unggah file menggunakan fileupload:
Mensyaratkan mengimpor paket pihak ketiga:
Apache-Fileupload.jar File mengunggah paket inti.
Apache-commons-oo.jar Paket ini adalah paket ketergantungan untuk FileUpload. Ini juga sebuah toolkit.
Kategori Inti:
DiskFileItemFactory menetapkan ruang disk dan menyimpan file sementara. Hanya satu kelas.
ServletFileUpload - kelas inti untuk unggahan file, yang menerima permintaan dan parse reqeust.
Servletfileupload.parseRequest (request) - Daftar <FILEITEM>
Note: A FileItem is the beginning of a logo: --------243243242342 To -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Langkah 1: Impor paket:
Langkah 2: Tulis servlet untuk menyelesaikan metode dopost
/*** Dua parameter yang dibangun oleh DiskFileItemFactory* Parameter pertama: Sizethreadhold - menetapkan berapa banyak byte data untuk disimpan dalam cache (memori), standarnya adalah 10k* jika file tidak lebih besar dari 10k, Anda bisa menggunakan memori untuk menyimpannya langsung ke dalam file. * Jika suatu file lebih dari 10k, Anda perlu menyimpan file ke direktori sementara terlebih dahulu. * File parameter kedua mengacu pada lokasi direktori sementara * */kelas publik UP2Servlet memperluas httpservlet {public void dopost (httpservletRequest req, httpservletResponseponse) lemparan servletException, ioException {req.setcharacraya ("); // Dapatkan jalur jalur string proyek = getServletContext (). GetRealPath ("/up"); // Langkah pertama menyatakan Kelas Pabrik DiskfileItemFactory, yang digunakan untuk menetapkan direktori sementara pada disk, diskfileitemFactory disk = DiskfileItemFactory baru (1024*10, file baru ("/home/wang/")); // Langkah kedua: Deklarasikan ServletFileUpoload dan menerima direktori sementara di atas servletfileupload up = servletfileUpload baru (disk); // Langkah Ketiga: Permintaan Parse Coba {List <FILEITEM> DAFTAR = UP.ParSequest (Req); // jika hanya satu fileItem fileItem = list.get (0); // Dapatkan nama file dengan path string fileName = file.getName (); filename = filename.substring (filename.lastIndexof ("//")+1); // Dapatkan file jenis string filetype = file.getContentType (); // Dapatkan inputStream bytecode file di = file.getInputStream (); // Nyatakan aliran byte output outputStream out = new FileOutputStream (path+"/"+fileName); // File Copy byte [] b = byte baru [1024]; int len = 0; while ((len = in.read (b))! =-1) {out.write (b, 0, len); } out.close (); ukuran panjang = file.getInputStream (). Tersedia (); // hapus file sementara file sementara yang diunggah.delete (); // Tampilkan data resp.setContentType ("Teks/html; charset = utf-8"); Printwriter op = resp.getWriter (); op.print ("File yang diunggah dengan sukses <br/> Nama file:"+fileName); op.print ("<br/> jenis file:"+filetype); op.print ("<br/> ukuran file (bytes)"+ukuran); } catch (Exception e) {E.PrintStackTrace (); }}}5. Gunakan kerangka kerja ini untuk mengunggah banyak file:
Langkah 1: Ubah bentuk halaman menjadi beberapa tipe input = "file"
<Form Action = "<c: value url = '/up3servlet' //>" method = "post" enctype = "multipart/form-data"> file1: <input type = "file" name = "txt"> <br/> file2: <input type = "file" name = "txt"> <br/> <input type = "Submit =" file "/" txt "> <br/> <input type =" Submit "
Langkah 2: Daftar Traverse
kelas publik UP3Servlet memperluas httpservlet {public void dopost (httpservletRequest, respons httpservletResponse) melempar servletException, ioException {request.setcharacterencoding ("UTF-8"); String path = getSerVletContext (). GetRealPath ("/up"); // Deklarasi disk diskfileitemfactory = diskfileitemFactory baru (); disk.setsizethreshold (1024*1024); disk.setrepository (file baru ("d:/a")); // Deklarasikan servlet yang mem -parsing permintaan servletfileupload up = servletfileupload baru (disk); coba {// selesaikan daftar permintaan <FILEITEM> list = up.parsequest (request); // mendeklarasikan daftar <peta> merangkum data daftar file yang diunggah <peta <string, string >> ups = arraylist baru <peta <string, string >> (); untuk (fileItem file: list) {peta <string, string> mm = new HashMap <string, string> (); // dapatkan nama file string fileName = file.getName (); filename = filename.substring (filename.lastIndexof ("//")+1); String filetype = file.getContentType (); InputStream in = file.getInputStream (); ukuran int = in.available (); // Gunakan kelas alat fileutils.copyInputStreamtofile (dalam, file baru (path+"/"+nama file)); mm.put ("nama file", nama file); mm.put ("filetype", filetype); mm.put ("size", "+size); ups.add (mm); file.delete ();} request.setAttribute (" UPS ", UPS); // Forward request.getRequestDispatcher ("/jsps/show.jsp "). Forward (request, response);} catch (Exception e) {e.print.jsp").Di atas adalah metode umum untuk mengunggah file. Sekarang mari kita lihat API pencarian lain dari fileupload.
Tentukan apakah fileItem adalah objek file (type = file) atau teks (type = text | centang | radio) objek:
boolean isFormField () Jika itu teks | kotak centang | Radio | Pilih, nilainya benar.
6. Proses gambar dengan informasi deskripsi
Public Class UpdescServlet memperluas httpservlet {public void dopost (httpservletRequest, httpservletResponse response) melempar servletException, ioException {request.setcharacterencoding ("UTF-8"); // Anda bisa mendapatkan nama Chinese string string = getserv = getserv ("utf-8"); // DiskfileItemFactory disk = DiskFileItemFactory baru (); disk.setrepository (file baru ("d:/a")); coba {servletfileUpload up = servletfileupload baru (disk); Daftar <FILEITEM> DAFTAR = UP.PARSEREQUEST (permintaan); untuk (FileItem File: List) {// Langkah 1: Tentukan apakah itu adalah item formulir biasa jika (file.isFormField ()) {string filename = file.getFieldName (); // <input type = "text" name = "desc"> = desc string value = file.getString ("UTF-8"); // DATC "DATA DAFTAR System.err.println (nama file+"="+nilai); } else {// menunjukkan bahwa itu adalah file string fileName = file.getName (); filename = filename.substring (filename.lastIndexof ("//")+1); file.write (file baru (path+"/"+nama file)); System.err.println ("Nama file adalah:"+nama file); System.err.println ("Ukuran file adalah:"+file.getSize ()); file.delete (); }}} catch (Exception e) {e.printstacktrace (); }}} 7. Peningkatan kinerja unggahan file
Saat mem -parsing permintaan untuk mendapatkan koleksi FileItem, gunakan:
FileIteMIterator it = up.getItemIterator (permintaan);
Dibandingkan dengan penggunaan
Daftar <FILEITEM> DAFTAR = UP.PARSEREQUEST (permintaan);
Kinerja yang jauh lebih baik.
Kode contoh:
FastServlet kelas publik memperluas httpservlet {public void dopost (httpservletRequest, respons httpservletResponse) melempar servletException, ioException {request.setcharacterencoding ("UTF-8"); String path = getSerVletContext (). GetRealPath ("/up"); DiskfileItemFactory disk = DiskFileItemFactory baru (); disk.setrepository (file baru ("d:/a")); coba {servletfileUpload up = servletfileupload baru (disk); // Berikut ini adalah Iterator Mode FileItemIterator it = up.getIteMiterator (permintaan); while (it.hasnext ()) {fileItemStream item = it.next (); String filename = item.getName (); filename = filename.substring (filename.lastIndexof ("//")+1); Inputstream in = item.openstream (); Fileutils.copyInputStreamToFile (dalam, file baru (path+"/"+nama file)); }} catch (Exception e) {e.printstacktrace (); }}} 8. Unduh File
Itu bisa mendapatkan atau memposting.
public void dopost (httpservletrequest req, httpservletresponse resp) melempar servletException, ioException {req.setcharacterencoding ("UTF-8"); String name = req.getParameter ("name"); // Langkah 1: Atur jenis respons resp.setContentType ("aplikasi/force-download"); // path string file bacaan kedua = getSerVletContext (). GetRealPath ("/up/" name); InputStream in = new FileInputStream (path); // Atur header respons // USERT URL Pengkodean Nama File Nama = Urlencoder.encode (Nama, "UTF-8"); resp.setheader ("konten-disposisi", "lampiran; fileName ="+name); resp.setContentLength (in.available ()); // Langkah 3: Mulai file salin outputStream out = resp.getoutputStream (); byte [] b = byte baru [1024]; int len = 0; while ((len = in.read (b))! =-1) {out.write (b, 0, len); } out.close (); melampirkan(); } Saat menggunakan kerangka kerja populer J2EELebih mudah menggunakan enkapsulasi internal kerangka kerja untuk menyelesaikan unggahan dan mengunduh:
Struts2 diunggah.
Saat menggunakan Struts2 untuk pengembangan, tidak sulit untuk menemukan bahwa paket Commons-Fileupload-1.3.1.jar hadir dalam paket JAR yang diimpor. Melalui pembelajaran di atas, kami sudah dapat menggunakannya untuk mengunggah dan mengunduh file. Tetapi Struts2 sedang mengalami enkapsulasi lebih lanjut.
melihat
<Form Action = "Fileupload.action" Method = "POST" ENCTYPE = "Multipart/Form-Data"> Nama pengguna: <input type = "text" name = "username"> <br> File: <input type = "file" name = "file"> <br> <input type = "kirim" value = "kirim"> </Form
Pengontrol
FileuploadAction kelas publik memperluas ActionSupport {Private String UserName; // Perhatikan bahwa file tidak merujuk ke file itu sendiri yang diunggah oleh JSP front-end, tetapi file yang diunggah untuk menyimpan file file file pribadi di bawah folder sementara; // Nama file yang dikirimkan // Struts akan secara otomatis mencegat nama file terakhir dan menyuntikkannya ke properti ini Private String FilefileName; // Getter dan Setter disimpan saat ini untuk menyimpan spasi @Override Public String Execute () melempar Exception {// Simpan Path to Diunggah String Root = ServletActionContext.GetSerVletContext (). GetRealPath ("/Unggah"); // Dapatkan Input File Input InputStream adalah = FileInputStream baru (file); // output file outputStream os = new fileoutputStream (file baru (root, filefileName)); // Cetak nama file dari file yang diunggah System.out.println ("FileFileName:" + FileFileName); // Karena file adalah file yang disimpan dalam folder sementara, kami dapat mencetak nama file dan jalur file untuk melihat apakah itu sama dengan sistem fileFileName sebelumnya.out.println ("File:" + file.getName ()); System.out.println ("File:" + File.getPath ()); byte [] buffer = byte baru [1024]; panjang int = 0; while (-1! = (length = is.read (buffer, 0, buffer.length))) {os.write (buffer); } os.close (); is.close (); Sukses kembali; }}Pertama -tama, kita harus jelas bahwa file di sini tidak benar -benar merujuk pada file yang diunggah oleh JSP. Ketika file diunggah, Struts2 akan terlebih dahulu mencari lokasi penyimpanan yang ditentukan oleh struts.multipart.savedir (ini di default.properties) (default kosong). Kami dapat menentukan lokasi penyimpanan sementara ini di Struts2 dari proyek kami.
<name konstan = "struts.multipart.savedir" value = "/repository"/>
Jika struts.multipart.savedir tidak diatur, alamat yang ditentukan oleh javax.servlet.context.tempdir akan digunakan secara default. Nilai javax.servlet.context.tempdir ditentukan oleh server. Misalnya: Jika konteks proyek web saya adalah ABC dan server menggunakan Tomcat, maka savePath harus %tomcat_home %/work/catalina/localhost/abc_. Nama file sementara mirip dengan unggah__1a156008_1373a8615dd__8000_00000001.tmp. Nama file sementara mungkin berbeda setiap kali, tetapi kira -kira bergaya ini. Dan jika Anda menggunakan server di Eclipse untuk mengonfigurasi tomcat dan mulai, maka % tomcat_home % di alamat di atas tidak akan menjadi direktori root tomcat yang sebenarnya dalam sistem, tetapi akan menjadi alamat yang ditentukan oleh gerhana. Misalnya, alamat lokal saya adalah sebagai berikut: /home/wang/eclipsejavacode/.metadata/plugins/org.eclipse.wst.server.core/tmp0/work/catalina/localhost/abc/upload__1a156008_1373a888a88886186008_1373_1373_1373_1373_1373_13
Struts2 selesai diunduh.
Unduh file Struts2 lebih sederhana, cukup tentukan aliran input dan tulis file ke dalam aliran input. Konfigurasi kunci masih mengonfigurasinya di file konfigurasi struts.xml:
Public Class FileDOnTOloDAction memperluas ActionSupport {// jalur untuk mengunduh file di jalur string privat server; // Nama file file untuk mengunduh pribadi string downloadFileName; // Tulis Getter dan Setter Public InputStream getDownLoadFile () {return servletActionContext.GetSerVletContext (). GetResourCeAsstream (Path); } @Override Public String Execute () melempar Exception {// Tindakan saat ini adalah setDownLoadFileName (xxx); Sukses kembali; }}Tindakan hanya mendefinisikan Input Stream DownloadFile dan kemudian memberikannya metode Getter. Selanjutnya, mari kita lihat file konfigurasi struts.xml:
<action name = "fileDownload"> <result name = "download" type = "stream"> <param name = "contentDisposition"> lampiran; filename = "$ {downloadfileName}" </param> <param name = "inputName"> downloadFile </param> </result> </action>Ada beberapa tempat di mana kita perlu memperhatikan file konfigurasi struts.xml. Pertama, tipe harus didefinisikan sebagai stream type_, Tell Tindakan Ini adalah hasil dari unduhan file. Elemen hasil umumnya memiliki sub-elemen param. Ini digunakan untuk mengatur parameter saat mengunduh file. Atribut inputName adalah untuk mendapatkan aliran input file dalam tindakan. Nama harus sama dengan atribut aliran input dalam tindakan. Kemudian atribut ContentDisposition. Atribut ini umumnya digunakan untuk menentukan bagaimana kami ingin memproses file yang diunduh. Jika nilainya lampiran, kotak unduhan akan muncul, memungkinkan pengguna untuk memilih apakah akan mengunduh. Jika nilai ini tidak ditetapkan, browser akan terlebih dahulu memeriksa apakah akan membuka file yang diunduh. Jika bisa, itu akan langsung membuka file yang diunduh (tentu saja bukan itu yang kita butuhkan). Nilai lain adalah nama file, yang merupakan nama unduhan file yang diminta oleh file saat mengunduh. Setelah mengkonfigurasi informasi ini, kami dapat mengimplementasikan fungsi unduhan file.
SpringMVC Menyelesaikan Unggah:
Tampilannya persis sama dengan contoh struts2. Ini tidak tertulis.
Pengontrol:
@Controller@requestMapping (value = "FileOperate") Public Class FileOperateAction {@RequestMapping (value = "unggah") Upload string publik (httpservletrequest request,@requestParam ("File") MultipartFile Photofile) {// Path untuk Mengunggah File Simpan String Dir = " request.getSession (). getServletContext (). getRealPath ("/")+"unggah"; // Nama file asli string fileName = photofile.getoriginalFileName (); // Dapatkan string ekstensi file extName = filename.substring (filename.lastIndexof (".")); // Cegah konflik nama file, sedikit modifikasi nama fileName = filename.substring (0, filename.lastIndexof ("."))) + System.nanoTime () + extname; Fileutils.writebyTearraytofile (file baru (dir, nama file), photofile.getbytes ()); mengembalikan "kesuksesan"; }}Download Lengkap SpringMVC:
@RequestMapping ("/download") Public String Download (String FileName, permintaan httpservletRequest, respons httpservletResponse) {response.setcharacterencoding ("UTF-8"); response.setContentType ("multipart/form-data"); response.setHeader ("Disposisi Konten", "lampiran; fileName =" + nama file); coba {inputStream inputStream = new FileInputStream (file baru (jalur file); outputStream os = response.getOutputStream (); byte [] b = byte baru [2048]; int panjang; while ((length = inputStream.read (b))> 0) {os.write (b, 0, panjang); inputstream.close ();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.