Dalam pengembangan sistem aplikasi web, fungsi unggahan dan unduhan file adalah fungsi yang sangat umum digunakan. Hari ini, mari kita bicara tentang implementasi fungsi unggahan dan unduhan file di Javaweb.
Tinjauan Upload File
1. Fungsi unggahan file
Misalnya, hard drive jaringan! Ini digunakan untuk mengunggah dan mengunduh file.
Untuk mengisi resume lengkap pada perekrutan Zhilian, Anda juga perlu mengunggah foto.
2. Persyaratan untuk mengunggah halaman
Ada banyak persyaratan untuk mengunggah file, harap diingat:
Formulir harus digunakan, bukan metode bentuk hyperlink harus posting, bukan get
Enctype dari formulir harus multipart/bentuk-data
Tambahkan bidang Formulir File dalam formulir, mis. <Input type = "file" name = "xxx"/>
<Form Action = "$ {pageContext.Request.contextPath}/FileuploadServlet" Method = "POST" ENCTYPE = "Multipart/Form-Data"> Nama pengguna: <input type = "Teks" name = "username"/> <br/> File 1: <input type = "file" name = "" file "=" file "<br/> <br/> file 1: <input type =" file "name =" "" "" file "" name = "file2"/> <br/> <input type = "kirim" value = "kirim"/> </form>3. Bandingkan perbedaan antara formulir unggahan file dan formulir teks normal
Lihat perbedaan antara "Formulir Upload File" dan "Formulir Teks Normal" melalui httpwatch.
Enctype dari formulir unggahan file = "multipart/form-data", yang mewakili data formulir multi-bagian;
Bentuk teks normal dapat diatur tanpa mengatur atribut enctype:
Saat metode = "Posting", nilai default enctype adalah aplikasi/X-www-form-urlencoded, yang berarti bahwa ketika metode = "get" digunakan, nilai default enctype adalah nol dan tidak ada teks, jadi tidak perlu menguji formulir teks normal:
<form action="${pageContext.request.contextPath }/FileUploadServlet" method="post"> Username: <input type="text" name="username"/><br/> File 1: <input type="file" name="file1"/><br/> File 2: <input type="file" name="file2"/><br/> <input type = "kirim" value = "kirim"/> </form>Melalui pengujian httpwatch, melihat badan data permintaan formulir, kami menemukan bahwa hanya ada nama file dalam permintaan, tetapi tidak ada konten file. Artinya, ketika enctype formulir bukan multipart/form-data, permintaan tidak berisi konten file, tetapi hanya nama file, yang berarti bahwa tidak ada perbedaan antara input: file dan input: teks dalam formulir teks normal.
Menguji Formulir Unggah File:
<Form Action = "$ {pageContext.Request.contextPath}/FileuploadServlet" Method = "POST" ENCTYPE = "Multipart/Form-Data"> Nama pengguna: <input type = "Teks" name = "username"/> <br/> File 1: <input type = "file" name = "" file "=" file "<br/> <br/> file 1: <input type =" file "name =" "" "" file "" name = "file2"/> <br/> <input type = "kirim" value = "kirim"/> </form>Melalui tes httpwatch, kami melihat bagian tubuh dari data permintaan formulir dan menemukan bahwa bagian tubuh terdiri dari beberapa komponen, masing -masing komponen sesuai dengan bidang formulir, dan setiap komponen memiliki informasi header sendiri. Di bawah informasi header adalah garis kosong, dan di bawah garis kosong adalah bagian tubuh dari lapangan. Beberapa bagian dipisahkan oleh pembagi yang dihasilkan secara acak.
Informasi header bidang teks hanya berisi satu informasi header, yaitu disposisi konten. Nilai informasi header ini memiliki dua bagian. Bagian pertama adalah tetap, yaitu data formulir, dan bagian kedua adalah nama lapangan. Di belakang garis kosong adalah bagian utama, dan bagian utamanya adalah konten yang diisi dalam kotak teks.
Informasi header bidang file berisi dua header, disposisi konten dan tipe konten. Ada nama file tambahan dalam disposisi konten, yang menentukan nama file yang diunggah. Tipe konten menentukan jenis file yang diunggah. Bagian utama dari bidang file adalah konten file.
Harap dicatat bahwa karena file yang kami unggah adalah semua file teks normal, mis. File txt, mereka dapat ditampilkan secara normal di httpwatch. Jika file yang diunggah adalah exe, mp3, dll., Maka apa yang Anda lihat di httpwatch kacau.
4. Persyaratan untuk servlet saat mengunggah file
Ketika formulir yang dikirimkan adalah formulir unggahan file, ada juga persyaratan untuk servlet.
Pertama -tama, kita perlu yakin bahwa data formulir unggahan file juga dienkapsulasi ke dalam objek permintaan.
Metode request.getParameter (String) mendapatkan konten karakter bidang formulir yang ditentukan, tetapi formulir unggahan file tidak lagi konten karakter, tetapi konten byte, sehingga tidak valid.
Pada saat ini, Anda dapat menggunakan metode permintaan getInputStream () untuk mendapatkan objek servletInputStream. Ini adalah subclass dari Inputstream. Objek ServletInputStream ini sesuai dengan bagian tubuh dari seluruh bentuk (mulai dari pembagi pertama hingga akhir), yang menunjukkan data dalam aliran parsing yang kita butuhkan. Tentu saja, parsing itu adalah hal yang sangat merepotkan, dan Apache telah memberi kami alat untuk menguraikannya:
Anda dapat mencoba untuk mencetak konten dari streaming.getInputStream () stream dan membandingkan data permintaan di httpwatch.
public void dopost (permintaan httpservletRequest, respons httpservletResponse) melempar servletException, ioException {inputStream in = request.getInputStream (); String s = ioutils.tostring (in); System.out.println (s);}----------------------------- 7DDD3370AB2Content-Disposisi: Formulir-Data; name = "nama pengguna" halo ----------------------------- 7DDD3370AB2Content-Disposisi: Formulir-Data; name = "file1"; FileName = "a.txt" tipe konten: Teks/Plainaaa ----------------------------- 7DDD3370AB2Content-Disposisi: Formulir-Data; name = "file2"; FileName = "b.txt" tipe konten: teks/polosbbb ----------------------------- 7ddd3370ab2--
Commons-Fileupload
Mengapa Menggunakan Fileupload:
Ada banyak persyaratan untuk mengunggah file, harap diingat:
Harus berupa formulir pos;
Enctype dari bentuk harus multipart/form-data;
Tambahkan bidang Formulir File ke formulir, mis.
Persyaratan Servlet:
Anda tidak dapat lagi menggunakan request.getParameter () untuk mendapatkan data formulir. Anda dapat menggunakan request.getInputStream () untuk mendapatkan semua data formulir, alih -alih data item formulir. Ini berarti Anda tidak menggunakan fileupload, kami perlu menguraikan konten request.getInputStream () sendiri.
1. Fileupload Ikhtisar
Fileupload adalah komponen unggahan yang disediakan oleh komponen Commons Apache. Tugas utamanya adalah membantu kami parse request.getInputStream ()
Paket JAR yang diperlukan oleh komponen Fileupload adalah:
Commons-Fileupload.jar, Paket Inti
commons-io.jar, paket ketergantungan
2. Aplikasi Fileupload Sederhana
Kelas inti FileUpload adalah: DiskFileItemFactory, ServletFileupload, FileItem
Langkah -langkah untuk menggunakan komponen fileupload adalah sebagai berikut:
// 1. Buat Kelas Pabrik DiskfileItemFactory Object DiskFileItemFactory Factory = New DiskFileItemFactory (); // 2. Buat Objek Parser Menggunakan Factory ServletFileUpload Fileupload = New ServletFileUpload (pabrik); // 3. Gunakan parser untuk parse daftar objek permintaan <FILEITEM> list = fileupload.parsequest (permintaan);
DiskFileItemFactory File Item Factory Class
DiskfileItemFactory publik (int sizethreshold, file repositori)
Saat membangun pabrik, tentukan ukuran buffer memori dan lokasi penyimpanan file sementara.
public void setsizethreshold (int sizethreshold)
Atur ukuran buffer memori, default 10K
public void setRepository (File Repository)
Atur lokasi penyimpanan file sementara, default system.getProperty ("java.io.tmpdir").
Buffer memori: Saat mengunggah file, konten file yang diunggah disimpan di buffer memori terlebih dahulu. Ketika ukuran file yang diunggah melebihi ukuran buffer, file sementara akan dihasilkan di sisi server.
Lokasi Penyimpanan File Sementara: Unggah file yang melebihi ukuran buffer memori untuk menghasilkan file sementara. File sementara dapat dihapus melalui metode FileItem's Delete ()
FileItem mewakili setiap bagian data dalam formulir unggahan file
Kami akan memperkenalkan kelas FileItem dengan sungguh -sungguh, yang merupakan hasil akhir yang kami inginkan. Objek FileItem sesuai dengan item formulir (bidang formulir). Bidang file dan bidang normal ada dalam formulir. Anda dapat menggunakan metode IsFormField () kelas FileItem untuk menentukan apakah bidang formulir adalah bidang normal. Jika bukan bidang normal, maka itu adalah bidang file.
CATATAN: Karena formulir unggahan file dikodekan menggunakan multipart/form-data, berbeda dari pengkodean URL tradisional, semua metode getParameter () tidak dapat menggunakan setCharacterencoding () tidak dapat menyelesaikan masalah yang dikocok dari item input.
SERVLETFILEUPLOAD Kelas inti unggah file
3. Contoh Upload Sederhana
Tulis contoh unggahan sederhana:
Formulir berisi bidang nama pengguna dan bidang file;
Servlet menyimpan file yang diunggah ke direktori unggahan, menampilkan nama pengguna, nama file, ukuran file, jenis file.
Langkah Pertama:
Untuk melengkapi index.jsp, hanya satu formulir yang diperlukan. Perhatikan bahwa formulir harus diposting, dan enctype harus mulitpart/form-data
<Form Action = "$ {pageContext.Request.ContextPath}/FileuploadServlet" Method = "POST" ENCTYPE = "Multipart/Form-Data"> Nama pengguna: <input type = "Teks" nama = "nama pengguna"/> <br/> file 1: <input type = "file" name = "" file "" value = "Kirim"/> </form>Langkah 2: Lengkapi FileuploadServlet
public void dopost (permintaan httpservletRequest, respons httpservletResponse) melempar servletException, ioException {// karena Anda ingin mencetak dengan respons, atur respons encoding.setContentType ("Text/html; charset = UTF-8"); // Buat DiskfileItemFactory DFIF = New DiskFileItemFactory (); // Buat objek parser menggunakan factory servletFileUpload fileupload = new servletfileUpload (dfif); Coba {// Gunakan objek parser untuk parse permintaan dan dapatkan daftar daftar fileItem <FILEItEM> Daftar = FileUpload.ParSerequest (permintaan); // Traverse semua item Formulir untuk (FileItem FileItem: List) {// Jika item formulir saat ini adalah item formulir normal jika (fileitem.isFormField ()) {// Dapatkan nama bidang dari item formulir saat ini string fieldName = fileItem.getFieldName (); // Jika nama bidang dari item formulir saat ini adalah nama pengguna if (fieldname.equals ("username")) {// cetak konten item formulir saat ini, yaitu, konten yang dimasukkan oleh formulir pengguna response.getWriter (). Cetak ("nama pengguna:" + fileitem.getString () + "<br/>"); }} else {// Jika item formulir saat ini bukan item formulir normal, itu berarti bidang file string name = fileitem.getName (); // Dapatkan nama file yang diunggah // Jika nama file yang diunggah kosong, tidak ada file yang diunggah ditentukan jika (name == null || name.isempty ()) {lanjutan; } // Dapatkan jalur yang sebenarnya, sesuai dengan $ {Project Directory}/unggah. Tentu saja, direktori ini harus memiliki string savePath = this.getServletContext (). GetRealPath ("/unggah"); // Buat objek File melalui direktori unggahan dan file nama file file = file baru (savePath, name); // Simpan file unggah ke fileItem.write lokasi yang ditentukan (file); // cetak nama unggahan file response.getWriter (). Print ("Unggah nama file:" + name + "<br/>"); // cetak ukuran unggahan file response.getWriter (). Print ("Usaha ukuran file:" + fileitem.getsize () + "<br/>"); // Cetak jenis file response.getWriter (). Print ("Jenis File Unggah:" + FileItem.GetContentType () + "<br/>"); }}} catch (Exception e) {lempar servletException baru (e); }}Detail Unggah File
1. Masukkan file yang diunggah di direktori web-inf
Jika file yang diunggah oleh pengguna tidak disimpan di direktori Web-INF, pengguna dapat secara langsung mengakses file yang diunggah melalui browser, yang sangat berbahaya.
Jika pengguna mengunggah file A.JSP dan kemudian pengguna mengakses file A.JSP melalui browser, maka konten di A.JSP akan dieksekusi. Jika ada pernyataan berikut di A.JSP: runtime.getRuntime (). Exec ("Shutdown st 1"); Maka Anda akan ...
Biasanya kami akan membuat direktori unggahan di direktori web-INF untuk menyimpan file yang diunggah. Untuk menemukan direktori ini di servlet, kita perlu menggunakan metode GetRealPath (String) dari ServletContext. Misalnya, ada pernyataan berikut dalam proyek Upload1 saya:
ServletContext servletContext = this.getSerVletContext (); string savePath = servletContext.getRealPath ("/web-inf/unggah");SavePath adalah: f:/tomcat6_1/webapps/unggah1/web-inf/unggah.
2. Nama file (jalur lengkap, nama file)
Nama file yang diunggah mungkin jalur lengkap:
Nama file unggahan yang diperoleh oleh IE6 adalah jalur lengkap, sedangkan nama file unggahan yang diperoleh oleh browser lain hanyalah nama file. Kita masih perlu menangani masalah perbedaan browser
String name = file1fileItem.getName (); response.getWriter (). Print (name);
Menggunakan browser yang berbeda untuk diuji, IE6 akan mengembalikan jalur lengkap untuk mengunggah file. Saya tidak tahu apa yang dilakukan IE6, yang membawa kita banyak masalah, yaitu menangani masalah ini.
Ini juga sangat sederhana untuk menangani masalah ini. Apakah itu jalur yang lengkap atau tidak, kami baru saja mencegat konten setelah "/" terakhir
String name = File1fileItem.getName (); int lastIndex = name.LastIndexof ("//"); // Dapatkan posisi yang terakhir "/" if (lastIndex! = -1) {// Perhatikan bahwa jika itu bukan jalur lengkap, maka tidak akan ada "/". name = name.substring (lastIndex + 1); // Dapatkan nama file} response.getWriter (). Print (name);3. Masalah Berbani Cina
Nama file yang diunggah berisi bahasa Mandarin:
Ketika nama yang diunggah berisi bahasa Cina, Anda perlu mengatur penyandian. Komponen Commons-Fileupload memberi kami dua cara untuk mengatur pengkodean:
request.setcharacterencoding (string): Metode ini adalah cara yang paling akrab kita.
Fileupload.setHeaderencdoing (String): Metode ini memiliki prioritas lebih tinggi dari yang sebelumnya
Konten file dari file yang diunggah berisi Cina:
Biasanya kami tidak perlu peduli dengan konten mengunggah file, karena kami akan menyimpan file yang diunggah ke hard drive! Dengan kata lain, seperti apa file itu dan seperti apa di server!
Tetapi jika Anda memiliki persyaratan seperti itu dan harus menampilkan konten file yang diunggah pada konsol, maka Anda dapat menggunakan fileitem.getString ("UTF-8") untuk menangani pengkodean encoding
Konten file teks dan konten item bentuk normal GetString ("UTF-8") dari kelas FileItem untuk menangani pengkodean.
4. Masalah Mengunggah file dengan nama yang sama (File Renaming)
Biasanya kami menyimpan file yang diunggah oleh pengguna ke direktori unggahan, tetapi bagaimana jika pengguna mengunggah file dengan nama yang sama? Ini akan menyebabkan cakupan. Metode untuk menangani masalah ini adalah dengan menggunakan UUID untuk menghasilkan nama yang unik, dan kemudian menggunakan "_" untuk menghubungkan nama asli yang diunggah oleh file.
Misalnya, file yang diunggah oleh pengguna adalah "My One Inch Photo.jpg". Setelah diproses, nama file adalah: "891b3881395f4175b969256a3f7b6e10_my satu inci photo.jpg". Metode ini tidak akan menyebabkan file kehilangan ekstensi. Karena keunikan UUID, file yang diunggah memiliki nama yang sama, tetapi tidak akan ada masalah dengan nama yang sama di sisi server.
public void dopost (permintaan httpservletRequest, respons httpservletResponse) melempar servletException, ioException {request.setcharacterencoding ("UTF-8"); DISKFILEITEMFACTORY DFIF = DISKFILEITEMFACTORY BARU (); Servletfileupload fileupload = servletfileupload baru (dfif); coba {list <fileitem> list = fileupload.parserequest (request); // Dapatkan item Formulir Kedua, karena item formulir pertama adalah nama pengguna, yang kedua adalah file Form Form FileItem fileItem = list.get (1); String name = FileItem.getName (); // Dapatkan nama file // Jika klien menggunakan IE6, maka Anda perlu mendapatkan nama file dari jalur lengkap int lastIndex = name.LastIndexof ("//"); if (lastIndex! = -1) {name = name.substring (lastIndex + 1); } // Dapatkan file yang diunggah savePath = this.getSerVletContext (). GetRealPath ("/web-inf/unggah"); String uuid = commonutils.uuid (); // menghasilkan uuid string fileName = uuid + "_" + nama; // Nama file baru adalah file uuid + underscore + nama asli // membuat file yang baru, dan file yang diunggah, yang diunggah ke file yang ditentukan oleh file ini // savePath, yaitu, unggahan yang diunggah ke dalam unggahan/unggahan yang ditentukan oleh file // savePath ini, yaitu, unggahan yang diunggah di unggahan yang diunggah/saveLEka ini/. nama file); // Simpan file item.write (file); } catch (Exception e) {lempar servletException baru (e); }}5. Direktori tidak dapat menyimpan terlalu banyak file (Store Directory untuk putus)
Seharusnya tidak ada terlalu banyak file yang disimpan di direktori. Secara umum, 1.000 file disimpan dalam direktori, dan jika ada banyak, itu akan sangat "retak" saat membuka direktori. Anda dapat mencoba mencetak direktori C:/Windows/System32, Anda akan merasakannya
Artinya, kita perlu memasukkan file yang diunggah ke dalam direktori yang berbeda. Namun, satu direktori tidak dapat digunakan untuk setiap file yang diunggah, karena metode ini akan menyebabkan terlalu banyak direktori. Jadi kita harus menggunakan beberapa algoritma untuk "putus"!
Ada banyak cara untuk memecahnya, seperti menggunakan tanggal untuk memecahnya, menghasilkan direktori setiap hari. Anda juga dapat menggunakan huruf pertama dari nama file untuk menghasilkan direktori, dan file dengan huruf awal yang sama ditempatkan di direktori yang sama.
Algoritma pemecahan tanggal: Jika ada terlalu banyak file yang diunggah pada hari tertentu, akan ada terlalu banyak file direktori;
Algoritma untuk melanggar huruf pertama: jika nama file dalam bahasa Cina, karena ada terlalu banyak orang Cina, itu akan menyebabkan terlalu banyak direktori.
Kami menggunakan algoritma hash di sini untuk memecahnya:
Dapatkan kode hash dari nama file: int hcode = name.hashcode ()
Dapatkan hcode 4 bit yang lebih rendah, lalu ubah menjadi karakter heksadesimal untuk mendapatkan 5 bit hcode 5 ~ 8, kemudian mengubahnya menjadi karakter heksadesimal untuk menghasilkan rantai direktori menggunakan dua karakter heksadesimal ini. Misalnya, karakter 4-bit yang lebih rendah adalah "5"
Keuntungan dari algoritma ini adalah bahwa maksimum 16 direktori dihasilkan di direktori unggahan, dan maksimum 16 direktori dihasilkan di setiap direktori, yaitu 256 direktori, dan semua file yang diunggah ditempatkan di 256 direktori ini. Jika jumlah maksimum setiap direktori adalah 1000 file, total 256.000 file dapat disimpan.
Misalnya, nama file unggah adalah: dokumen teks baru.txt, kemudian dapatkan kode hash "new Text Document.txt", dan kemudian dapatkan 4 digit lebih rendah dari kode hash, dan 5 hingga 8 digit. Jika 4 bit yang lebih rendah adalah: 9, dan 5 ~ 8 bit adalah 1, maka jalur penyimpanan file adalah unggahan/9/1/
int hcode = name.hashCode (); // Dapatkan kode hashcode dari nama file // Dapatkan 4 bit hcode rendah dan ubah menjadi hexadecimal string dir1 = integer.toHexstring (hcode & 0xf);/mendapatkan string hcode 5 ~ 8 bit hcode dan converte menjadi rendah ke dalam hcode ke dalam hcode. >>> 4 & 0xf); // Sambungkan jalur simpan file ke jalur lengkap savePath = savePath + "/" + dir1 + "/" + dir2; // karena jalur ini mungkin tidak ada, buatlah sebagai objek file, dan kemudian buat rantai direktori untuk memastikan bahwa direktori sudah ada baru sebelum menyimpan file file (savePath).
6. Batas ukuran untuk file yang diunggah individu
Sangat sederhana untuk membatasi ukuran file yang diunggah, cukup setFilesizeMax (Long) dari kelas ServletFileUpload. Parameter adalah batas batas atas byte dari file yang diunggah. Misalnya, servletfileupload.setFilesizeMax (1024*10) berarti bahwa batas atas adalah 10kb.
Setelah file yang diunggah melebihi batas atas, fileuploadbase.filesizelimiteExedEccedException akan dilemparkan. Kita bisa mendapatkan pengecualian ini di servlet dan output "file yang diunggah melebihi batas" ke halaman.
public void dopost (permintaan httpservletRequest, respons httpservletResponse) melempar servletException, ioException {request.setcharacterencoding ("UTF-8"); DISKFILEITEMFACTORY DFIF = DISKFILEITEMFACTORY BARU (); Servletfileupload fileupload = servletfileupload baru (dfif); // Atur batas atas file tunggal yang diunggah ke 10kb fileupload.setFilesizeMax (1024 * 10); coba {list <fileitem> list = fileupload.parserequest (request); // Dapatkan item Formulir Kedua, karena item formulir pertama adalah nama pengguna, yang kedua adalah file Form Form FileItem = list.get (1); String name = FileItem.getName (); // Dapatkan nama file // Jika klien menggunakan IE6, maka Anda perlu mendapatkan nama file dari jalur lengkap int lastIndex = name.LastIndexof ("//"); if (lastIndex! = -1) {name = name.substring (lastIndex + 1); } // Dapatkan file yang diunggah savePath = this.getSerVletContext (). GetRealPath ("/web-inf/unggah"); String uuid = commonutils.uuid (); // menghasilkan uuid string filename = uuid + "_" + name; // Nama file baru adalah UUID + underscore + nama asli int hcode = name.hashCode (); // Dapatkan kode hasheMe dari nama file // get 4 bits hcode (); Integer.tohexstring (hcode & 0xf); // Dapatkan hcode 5 ~ 8 bit yang lebih rendah dan konversinya menjadi string hexadecimal string dir2 = integer.tohexstring (hcode >>> 4 & 0xf); // Sambungkan file simpan file ke jalur lengkap savePath = savePath + "/" + dir1 + "/" + dir2; // Karena jalur ini mungkin tidak ada, buat objek file, dan kemudian buat rantai direktori untuk memastikan bahwa direktori sudah ada sebelum menyimpan file file baru (savePath) .mkdirs (); // Buat objek file, dan file yang diunggah akan disimpan ke jalur yang ditentukan oleh file ini // savePath, yaitu, file simpan file yang diunggah // fileName, nama file, nama file; // simpan fileitem.write (file); } catch (Exception e) {// Tentukan apakah jenis pengecualian yang dilemparkan adalah fileuploadbase.filesizelimitexededException // jika demikian, itu berarti batas terlampaui saat mengunggah file. if (e instanceof fileuploadbase.filesizelimitexededException) {// Simpan pesan kesalahan dalam permintaan permintaan.setAttribute ("msg", "Unggah gagal! File yang diunggah melebihi 10kb!"); // Maju ke halaman index.jsp! Di halaman index.jsp, Anda perlu menggunakan $ {msg} untuk menampilkan permintaan pesan kesalahan.getRequestDispatcher ("/index.jsp"). Maju (permintaan, respons); kembali; } lempar servletException baru (e); }}7. Batas ukuran total untuk mengunggah file
Formulir untuk mengunggah file dapat memungkinkan beberapa file diunggah, misalnya:
Terkadang kita perlu membatasi ukuran permintaan. Dengan kata lain, jumlah maksimum byte untuk permintaan ini (jumlah semua item formulir)! Menerapkan fungsi ini juga sangat sederhana. Anda hanya perlu memanggil metode setSizeMax (Long) dari kelas ServletFileUpload.
Misalnya, fileupload.setsizeMax (1024 * 10) ;, Batas atas untuk seluruh permintaan adalah 10kb. Ketika ukuran permintaan melebihi 10kb, metode parserequest () dari kelas servletFileUpload akan melempar pengecualian exception file.
8. Ukuran cache dan direktori sementara
Pikirkan tentang hal ini, jika saya mengunggah film Blu-ray, simpan film ke memori terlebih dahulu, lalu salin ke server hard disk melalui memori, lalu bisakah memori Anda dimakan?
Oleh karena itu, komponen fileupload tidak dapat menyimpan semua file dalam memori. Fileupload akan menentukan apakah ukuran file melebihi 10kb. Jika demikian, simpan file ke hard disk. Jika tidak melebihi, simpan dalam memori.
10KB adalah nilai default dari Fileupload, kami dapat mengaturnya.
Saat file disimpan ke hard disk, Fileupload menyimpan file ke direktori sementara sistem. Tentu saja, Anda juga dapat mengatur direktori sementara
public void dopost (permintaan httpservletRequest, respons httpservletResponse) melempar servletException, ioException {request.setcharacterencoding ("UTF-8"); DISKFILEITEMFACTORY DFIF = DISKFILEITEMFACTORY BARU (1024*20, file baru ("f: // temp")); Servletfileupload fileupload = servletfileupload baru (dfif); coba {list <fileitem> list = fileupload.parserequest (request); FileItem fileItem = list.get (1); String name = fileitem.getName (); String savePath = this.getSerVletContext (). GetRealPath ("/web-inf/unggah"); // Simpan FileItem.write (path (path (savePath, name));} catch (Exception e) {throw servletException baru (e);}} path file private (string savePath, string filename) {// dapatkan nama file int dari path lengkap lastIndex = filename.lastindexof ("//"); FileName.substring (LastIndex + 1); Dir2;Unduh File
1. Unduh 1 Melalui Servlet
Sumber daya yang diunduh harus ditempatkan di direktori web-INF (tidak apa-apa selama pengguna tidak dapat mengakses langsung melalui browser), dan kemudian mengunduhnya melalui servlet.
Berikan hyperlink di halaman JSP, tautan ke DownloadServlet, dan berikan nama file untuk diunduh. Kemudian DownloadServlet mendapatkan jalur nyata dari file dan menulis file ke stream response.getoutputStream ().
download.jsp
<body> Ini adalah halaman JSP saya. <br> <a href = "<c: nilai url = '/downloadservlet? path = a.avi' //>"> A.avi </a> <br/> <a href = "<c: nilai url = '/downloadservlet? Path = A.Jpg' ///>"> a.jpg </a> <br/r/> <jpg = "<c: a: c: a. jpg </a> <br/a> <br/a." value = '/downloadservlet? path = a.txt' ////> "> a.txt </a> <br/> </body>
Downloadservlet.java
public void doGet (permintaan httpservletRequest, respons httpservletResponse) melempar servletException, ioException {string filename = request.getParameter ("path"); String filePath = this.getSerVletContext (). GetRealPath ("/web-inf/unggah/" + nama file); File file = file baru (filepath); if (! file.exists ()) {response.getWriter (). print ("File yang ingin Anda unduh tidak ada!"); kembali; } Ioutils.copy (FileInputStream baru (file), response.getoutputStream ());}Kode di atas memiliki masalah berikut:
1. Anda dapat mengunduh A.Avi, tetapi nama file di kotak unduhan adalah unduhan;
2. Anda tidak dapat mengunduh A.JPG dan A.TXT, tetapi menampilkannya di halaman.
2. Unduh 2 Melalui Servlet
Mari berurusan dengan masalah dalam contoh sebelumnya, sehingga kotak unduhan dapat menampilkan nama file yang benar, dan Anda dapat mengunduh file a.jpg dan a.txt
Tangani masalah di atas dengan menambahkan header disposisi konten. Saat header disposisi konten diatur, browser akan memunculkan kotak unduhan
Dan Anda juga dapat menentukan nama file yang diunduh melalui header konten-disposisi!
String filename = request.getParameter ("path"); String filePath = this.getSerVletContext (). GetRealPath ("/web-inf/unggah/" + nama file); File file = file baru (filepath); if (! file.exists ()) {response.getWriter (). print ("File yang ingin Anda unduh tidak ada!"); kembali; } response.addheader ("Disposisi konten", "lampiran; fileName =" + nama file); Ioutils.copy (FileInputStream baru (file), response.getoutputStream ());Meskipun kode di atas sudah dapat menangani pengunduhan file seperti txt dan jpg, dan juga menangani masalah menampilkan nama file di kotak unduhan, jika nama file yang diunduh dalam bahasa Cina, maka masih tidak bisa
3. Unduh 3 Melalui Servlet
Di bawah ini adalah masalah penanganan tampilan Cina di kotak unduhan!
Bahkan, pertanyaan ini sangat sederhana. Anda hanya perlu menyandikan bahasa Mandarin melalui URL!
download.jsp
<a href = "<c: nilai url = '/downloadservlet? path = pembunuh ini tidak terlalu dingin.avi' //>"> pembunuh ini tidak terlalu dingin. href = "<c: nilai url = '/downloadservlet? path = description.txt'/>"> description.txt </a> <br/>
Downloadservlet.java
String filename = request.getParameter ("path"); // Dalam permintaan GET, parameter Cina berisi orang Cina dan perlu dikonversi sendiri. // Tentu saja, jika Anda menggunakan "Filter Pengkodean Global", maka Anda tidak perlu menghadapinya di sini fileName = string baru (filename.getbytes ("ISO-8859-1"), "UTF-8"); string FilePath = this.getServletContext (). GetRealPath ("/Web-Inf/unggahan/" + " +" + " +" + " +" File (filepath); if (! File.exists ()) {response.getWriter (). Print ("File yang ingin Anda unduh tidak ada!"); return;} // Semua browser akan menggunakan pengkodean lokal, yaitu, sistem operasi Cina menggunakan GBK // setelah browser menerima nama file ini, itu akan menggunakan ISO-8859-1 untuk mendekode filename = string baru (filename.addead ("gbk"), "iso-8859-1"); response.addhead ("gbk"), "iso-8859-1"); response.addhead ("gbk"), "iso-8859-1"); response. nama file); ioutils.copy (FileInputStream baru (file), response.getoutputStream ());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.