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.
Untuk unggahan file, browser mengirimkan file ke server dalam bentuk aliran selama proses unggah. Lebih merepotkan jika Anda secara langsung menggunakan Servlet untuk mendapatkan aliran input file yang diunggah dan kemudian menguraikan parameter permintaan di dalamnya. Oleh karena itu, umumnya dipilih untuk menggunakan Common-Fileupload, komponen unggahan file dari alat sumber terbuka Apache. Paket JAR dari komponen Upload Common-Fileupload dapat diunduh di situs web resmi Apache, atau dapat ditemukan di bawah folder Lib Struts. Fungsi unggahan struts didasarkan pada implementasi ini. Common-Fileupload tergantung pada paket Common-IO, jadi Anda juga perlu mengunduh paket ini.
1. Konstruksi Lingkungan Pengembangan
Buat Proyek FileUploadAndDownload dan tambahkan paket JAR terkait file Upload Commons Commons, seperti yang ditunjukkan pada gambar di bawah ini:
2. Menerapkan unggahan file
2.1. Halaman unggah file dan halaman prompt pesan
Kode unggahan.jsp halaman adalah sebagai berikut:
<%@ page language = "java" pageEncoding = "UTF-8"%> <! Doctype html> <html> <head> <title> unggah file </iteme> </head> <bod body> <bentuk action = "$ {pageContext.Request.contextPath}/servlet/servlet" {"{pageContext.ccty" d-doPart/levlet/levlet "{pageContext.contextpath/ligin" <input type = "text" name = "username"> <br/> unggah file 1: <input type = "file" name = "file1"> <br/> unggah file 2: <input type = "file" name = "file2"> <br/> <input type = "kirim" value = "kirim"> </bentuk> </body> html. Cetak Salin Plain? <%@ halaman bahasa = "java" pageEncoding = "UTF-8"%> <! Doctype html> <html> <head> <title> prompt pesan </iteme> </head> <body> $ {pesan} </body> </html>2.2. Memproses servlets untuk unggahan file
Kode UploadHandleServlet adalah sebagai berikut:
package me.gacl.web.controller; impor java.io.file; impor java.io.fileoutputStream; impor java.io.ioException; impor java.io.inputstream; impor java.util.list; impor javax.servlet.servletException; impor javax.servlet.http.httpservlet; impor javax.servlet.http.httpservletRequest; impor javax.servlet.http.httpservletResponse; impor org.apache.commons.fileupload.fileItem; impor org.apache.commons.fileupload.disk.diskfileItemFactory; impor org.apache.commons.fileupload.servlet.servletfileupload; public class UploadHandleServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //Get the saved directory of the uploaded file, store the uploaded file in the WEB-INF directory, and does not allow direct access from the outside world to ensure the security of the uploaded file String savePath = this.getSerVletContext (). getRealPath ("/web-inf/unggah"); File file = file baru (savePath); // menilai apakah direktori yang disimpan dari file yang diunggah ada jika (! File.exists () &&! File.isDirectory ()) {System.out.println (direktori savePath+"tidak ada, itu perlu dibuat"); // Buat direktori file.mkdir (); } // pesan meminta string message = ""; Coba {// Gunakan komponen unggahan file apache untuk menangani langkah -langkah unggahan file: // 1. Buat DiskfileItemFactory Factory DiskFileItemFactory Factory = New DiskFileItemFactory (); // 2. Buat file unggah file parser servletfileupload unggah = servletfileupload baru (pabrik); // Selesaikan unggahan yang kacau Cina. EsetHeaderencoding ("UTF-8"); // 3. Tentukan apakah data yang dikirimkan adalah data dari formulir unggahan jika (! ServletFileupload.ismultipartContent (permintaan)) {// Dapatkan pengembalian data dengan cara tradisional; } // 4. Gunakan Parser ServletFileUpload untuk menguraikan data yang diunggah. Hasil parsing mengembalikan koleksi daftar <FILEITEM>. Setiap fileItem sesuai dengan item input dari daftar formulir Formulir <FILEITEM> DAFTAR = UEDLOAD.PARSEREQUEST (permintaan); untuk (item fileitem: daftar) {// Jika data item input normal dienkapsulasi dalam fileItem if (item.isFormField ()) {string name = item.getFieldName (); // Selesaikan masalah Data Input Input Item Nilai STRING = Item.GetString ("UTF-8"); // value = string baru (value.getBytes ("iso8859-1"), "utf-8"); System.out.println (name + "=" + value); } else {// Jika item file merangkum file yang diunggah // dapatkan nama file yang diunggah, string fileName = item.getName (); System.out.println (nama file); if (fileName == null || filename.trim (). equals ("")) {lanjutan; } // Catatan: Nama file yang dikirimkan oleh browser yang berbeda berbeda. Beberapa browser mengirimkan file dengan jalur, seperti: c: /a/b/1.txt, dan beberapa hanya nama file sederhana, seperti: 1.txt // memproses bagian jalur dari nama file dari file yang diperoleh yang diunggah, hanya nama file yang dipertahankan fileName = fileName.substring (fileName.LASTINDEXOF ("/////////////////) // Dapatkan aliran input dari file yang diunggah dalam inputStream item in = item.getInputStream (); // Buat file output file output fileOutputStream out = new fileoutputStream (savePath + "//" + filename); // Buat buffer buffer byte [] = byte baru [1024]; // Identifikasi apakah data dalam aliran input telah dibaca adalah int len = 0; // Aliran input dibaca ke loop buffer, (len = in.read (buffer))> 0 berarti bahwa masih ada data di dalam while ((len = in.read (buffer))> 0) {// Gunakan aliran output FileOutStream untuk menulis data buffer (savePath + "//" + name. } // tutup aliran input di.close (); // tutup aliran output out.close (); // hapus file sementara yang dihasilkan saat memproses file unggahan item.delete (); pesan = "Upload File berhasil diunggah!"; }}}} catch (Exception e) {message = "File unggahan gagal!"; e.printstacktrace (); } request.setAttribute ("pesan", pesan); request.getRequestDispatcher ("/message.jsp"). Forward (Request, Response); } public void dopost (permintaan httpservletRequest, respons httpservletResponse) melempar servletException, ioException {doGet (permintaan, respons); }}Daftarkan UploadHandLerServlet di file web.xml
<servlet> <servlet-name> UploadHandleServlet </servlet-name> <servlet-class> me.gacl.web.controller.uploadhanderServlet </servlet-class> </servlet> <servlet> <servlet-name> unggah/servlet </servlet-name> <servlet> <servlet> </servletser/unggul </servlet-name> <ruml-pattern>
Efek operasi adalah sebagai berikut:
Setelah file berhasil diunggah, file yang diunggah disimpan di direktori unggahan di bawah direktori web-INF, seperti yang ditunjukkan pada gambar di bawah ini:
2.3. Detail Upload File
Meskipun kode di atas dapat berhasil mengunggah file ke direktori yang ditentukan di server, ada banyak detail kecil yang perlu diperhatikan dalam fungsi unggahan file. Poin -poin berikut harus diberi perhatian khusus.
1. Untuk memastikan keamanan server, unggah file harus ditempatkan di direktori yang tidak dapat diakses secara langsung oleh dunia luar, seperti di direktori web-INF.
2. Untuk mencegah file yang menimpa, nama file yang unik harus dihasilkan untuk mengunggah file.
3. Untuk mencegah terlalu banyak file muncul di bawah direktori, Anda harus menggunakan algoritma hash untuk memecah penyimpanan.
4. Nilai maksimum file yang diunggah harus dibatasi.
5. Untuk membatasi jenis file yang diunggah, saat menerima nama file yang diunggah, tentukan apakah nama akhirannya legal.
Menanggapi 5 masalah terperinci di atas, mari kita tingkatkan unggahan handleServlet. Kode yang ditingkatkan adalah sebagai berikut:
package me.gacl.web.controller; impor java.io.file; impor java.io.fileoutputStream; impor java.io.ioException; impor java.io.inputstream; impor java.util.list; impor java.util.uuid; impor javax.servlet.servletException; impor javax.servlet.http.httpservlet; impor javax.servlet.http.httpservletRequest; impor javax.servlet.http.httpservletResponse; impor org.apache.commons.fileupload.fileItem; impor org.apache.commons.fileupload.fileuploadbase; impor org.apache.commons.fileupload.progresslistener; impor org.apache.commons.fileupload.disk.diskfileItemFactory; impor org.apache.commons.fileupload.servlet.servletfileupload; /** * @ClassName: UploadHandleServlet * @Description: TODO (I use one sentence to describe the function of this class) * @author: Guarante Canglang* @date: 2015-1-3 11:35:50 pm * */ public class UploadHandleServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, ioException {// Dapatkan direktori yang disimpan dari file yang diunggah, simpan file yang diunggah di direktori web-inf, dan tidak mengizinkan akses langsung dari dunia luar untuk memastikan keamanan file yang diunggah string savePath = this.getServletContext (). GetRealPath ("/web-inf/unggahan"); // File sementara yang dihasilkan selama unggahan disimpan oleh string direktori Temppath = this.getServletContext (). GetRealPath ("/web-inf/temp"); File tmpfile = file baru (Temppath); if (! tmpFile.exists ()) {// Buat direktori sementara tmpfile.mkdir (); } // pesan tersebut meminta string message = ""; Coba {// Gunakan komponen unggahan file apache untuk menangani langkah -langkah unggahan file: // 1. Buat DiskfileItemFactory Factory DiskFileItemFactory Factory = New DiskFileItemFactory (); // Atur ukuran buffer pabrik. Ketika ukuran file yang diunggah melebihi ukuran buffer, file sementara akan dihasilkan dan disimpan dalam direktori sementara yang ditentukan. factory.setsizethreshold (1024*100); // Atur ukuran buffer ke 100kb. Jika tidak ditentukan, ukuran buffer adalah 10kb secara default. // Atur direktori penyimpanan file sementara yang dihasilkan selama mengunggah pabrik.setrepository (tmpFile); // 2. Buat file unggah file parser servletfileupload unggah = servletfileupload baru (pabrik); // Dengarkan unggahan file progress unggah.setProgressListener (progressListener baru () {public void update (long pbytesread, long pcontentLength, int arg2) {System.out.println ("Ukuran File:" + PCONTENTLENGTH + ", saat ini diproses:" + pbytesread); /* 14608, saat ini diproses: 7367 Ukuran file adalah: 14608, saat ini diproses: 11419 Ukuran file adalah: 14608, saat ini diproses: 14608 */}}); // Selesaikan unggahan yang kacau Cina. EsetHeaderencoding ("UTF-8"); // 3. Tentukan apakah data yang dikirimkan adalah data dari formulir unggahan jika (! ServletFileupload.ismultipartContent (permintaan)) {// Dapatkan pengembalian data dengan cara tradisional; } // Tetapkan nilai maksimum dari ukuran file tunggal yang diunggah, yang saat ini diatur ke 1024*1024 byte, yaitu, 1MB unggah.setFilesizeMax (1024*1024); // Atur nilai maksimum dari jumlah total file yang diunggah, nilai maksimum = jumlah ukuran maksimum beberapa file yang diunggah pada saat yang sama, yang saat ini diatur ke unggahan 10MB.setsizeMax (1024*1024*10); // 4. Gunakan Parser ServletFileUpload untuk menguraikan data yang diunggah. Hasil parsing mengembalikan daftar daftar <FILEITEM>, setiap fileItem sesuai dengan item input dari daftar formulir Formulir <FILEITEM> DAFTAR = UPLOAD.ParSerequest (permintaan); untuk (item fileItem: daftar) {// Jika fileItem merangkum data item input biasa if (item.isFormField ()) {string name = item.getFieldName (); // Memecahkan masalah Data Input Input Item Nilai Input Biasa = Item.GetString ("UTF-8"); // value = string baru (value.getBytes ("iso8859-1"), "utf-8"); System.out.println (name + "=" + value); } else {// Jika fileItem merangkum file yang diunggah // dapatkan nama file yang diunggah, string fileName = item.getName (); System.out.println (nama file); if (fileName == null || filename.trim (). equals ("")) {lanjutan; } // Catatan: Nama file yang dikirimkan oleh browser yang berbeda berbeda. Some browsers submit file names with paths, such as: c:/a/b/1.txt, while some are just simple file names, such as: 1.txt // Process the path part of the file name of the obtained uploaded file, only the file name part is retained filename = filename.substring(filename.lastIndexOf("//")+1); // Dapatkan ekstensi file string yang diunggah fileextName = filename.substring (filename.lastIndexof (".")+1); // Jika Anda perlu membatasi jenis file yang diunggah, Anda dapat menggunakan ekstensi file untuk menentukan apakah jenis file yang diunggah adalah legal system.out.println ("Perpanjangan file yang diunggah adalah:"+fileextName); // Dapatkan aliran input dari file yang diunggah dalam inputStream item in = item.getInputStream (); // Dapatkan nama file yang disimpan string saveFileName = makefileName (nama file); // Dapatkan File Simpan Direktori String RealSavEpath = MakEpath (SaveFileName, SavePath); // Buat file output file output fileOutputStream out = new fileoutputStream (realSavePath + "//" + saveFileName); // Buat buffer buffer byte [] = byte baru [1024]; // Identifikasi menentukan apakah data dalam aliran input telah dibaca adalah int len = 0; // Aliran input dibaca ke dalam buffer, (len = in.read (buffer))> 0 berarti bahwa masih ada data di dalam while ((len = in.read (buffer))> 0) {// Gunakan aliran output fileOutputStream untuk menulis data buffer ke Buffer (savePath + "//" + name) out. } // tutup aliran input di.close (); // tutup aliran output out.close (); // hapus file sementara yang dihasilkan saat memproses unggahan file //item.delete (); pesan = "Upload File berhasil diunggah!"; }}} catch (fileuploadbase.filesizelimitexededException e) {e.printstacktrace (); request.setAttribute ("pesan", "nilai maksimum satu file terlampaui !!!"); request.getRequestDispatcher ("/message.jsp"). Forward (Request, Response); kembali; } catch (FileuploadBase.sizelimitexededException e) {e.printstacktrace (); request.setAttribute ("pesan", "ukuran total file yang diunggah melebihi nilai maksimum batas !!!"); request.getRequestDispatcher ("/message.jsp"). Forward (Request, Response); kembali; } catch (Exception e) {message = "File unggahan gagal!"; e.printstacktrace (); } request.setAttribute ("pesan", pesan); request.getRequestDispatcher ("/message.jsp"). Forward (Request, Response); } /*** @method: makefilename* @description: menghasilkan nama file file yang diunggah, dengan nama file sebagai: uuid+ "_"+ nama asli file* @anthor: 发官网* @param nama file asli* @pilene ne (@return uuid+ "发官网"+ {name {@pareMile. // Untuk mencegah file yang menimpa, nama file yang unik harus dihasilkan untuk mengunggah file. Return uuid.randomuuid (). Tostring () + "_" + nama file; } / *** Untuk mencegah terlalu banyak file yang muncul di bawah direktori, Anda perlu menggunakan algoritma hash untuk memecah penyimpanan* @method: makePath* @description:* @anthor: Direktori Lone dan Arogant* @param Pathen nama penyimpanan* Direktori PRIVERURE* Hasil Storage Berdasarkan File* @param SavePath* PATHEPORY* nama file, string savePath) {// Dapatkan nilai kode hashCode dari nama file, dan apa yang Anda dapatkan adalah alamat dari nama file objek string di memori int hashcode = filename.hashcode (); int dir1 = hashcode & 0xf; // 0--15 int dir2 = (HashCode & 0xf0) >> 4; // 0-15 // Bangun Simpan Direktori Simpan Dir = SavePath + "//" + Dir1 + "//" + Dir2; // Unggah/2/3 Unggah/3/5 // File dapat mewakili file dan file direktori = file baru (dir); // Jika direktori tidak ada jika (! File.exists ()) {// Buat direktori file.mkdirs (); } return dir; } public void dopost (permintaan httpservletRequest, respons httpservletResponse) melempar servletException, ioException {doGet (permintaan, respons); }}Setelah meningkatkan lima detail kecil yang disebutkan di atas, fungsi unggahan file kami relatif lengkap.
3. Unduh File
3.1. Sebutkan sumber daya file yang disediakan untuk diunduh
Kami ingin menyediakan sumber daya file dalam sistem aplikasi web kepada pengguna untuk diunduh. Pertama, kita perlu memiliki halaman untuk mendaftar semua file di direktori file yang diunggah. Ketika pengguna mengklik pada file unduhan hyperlink, itu akan diunduh dan menulis ListFileServlet untuk mendaftarkan semua file yang diunduh dalam sistem aplikasi web.
Kode ListFileServlet adalah sebagai berikut:
package me.gacl.web.controller; impor java.io.file; impor java.io.ioException; impor java.util.hashmap; impor java.util.map; impor javax.servlet.servletException; impor javax.servlet.http.httpservlet; impor javax.servlet.http.httpservletRequest; impor javax.servlet.http.httpservletResponse; /** * @ClassName: ListFileServlet * @Description: List all downloaded files in the web system* @author: Guarante* @date: 2015-1-4 9:54:40 pm * */ public class ListFileServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// Dapatkan direktori untuk mengunggah file string unggahfilePath = this.getSerVletContext (). GetRealPath ("/web-inf/unggah"); // menyimpan nama file yang akan diunduh peta <string, string> filenamemap = new HashMap <string, string> (); //Recursively traverse all files and directories in the filepath directory, and store the file name of the file in the map collection listfile(new File(uploadFilePath),fileNameMap);//File can represent either a file or a directory//Send the Map collection to the listfile.jsp page for display request.setAttribute("fileNameMap", fileNameMap); request.getRequestDispatcher ("/listFile.jsp"). Forward (Request, Response); } /*** @method: listFile* @description: Rekursif melintasi semua file dalam direktori yang ditentukan* @anthor: 光克* @param file berarti file, dan juga mewakili file direktori* @param peta yang menyimpan nama file* /public void listFile (file file, peta <string, string> peta) { / /if no listFile public no listFile (string, string, string> { / /if no listFile public no listFile (string, string, string> { / /api { if (! File.isfile ()) {// Sebutkan semua file dan direktori di file direktori [] = file.listFiles (); // transfer file [] array untuk (file f: file) {// listfile rekursif (f, peta); }} else { /*** Proses nama file. File yang diunggah diganti namanya dalam bentuk nama UUID_FILE. Hapus bagian uuid_ dari file file file.getName (). IndexOf ("_") untuk mengambil lokasi karakter "_" dalam string. Jika nama file mirip dengan: 9349249849-88343-8344_a_fan_davi.avi, maka file.getName (). file.getName (). Substring (file.getName (). IndexOf ("_")+1); //file.getName () Mendapat nama asli file. Nama ini unik, sehingga dapat digunakan sebagai kunci. RealName adalah nama yang diproses. Itu mungkin diulang peta.put (file.getName (), realname); }} public void dopost (permintaan httpservletRequest, respons httpservletResponse) melempar servletException, ioException {doGet (permintaan, respons); }} Di sini saya secara singkat berbicara tentang metode ListFile di ListFileServlet. Metode ListFile digunakan untuk mendaftar semua file di direktori. Metode ListFile menggunakan rekursi. Dalam pengembangan aktual, kami pasti akan membuat tabel di database, yang akan menyimpan nama file yang diunggah dan direktori penyimpanan file tertentu. Kita dapat mengetahui direktori penyimpanan file spesifik dengan menanyakan tabel, dan tidak perlu menggunakan operasi rekursi. Contoh ini karena database tidak menyimpan nama file yang diunggah dan lokasi penyimpanan spesifik file, dan lokasi penyimpanan file yang diunggah digunakan untuk memecah penyimpanan, jadi diperlukan rekursi. Selama rekursi, nama file yang diperoleh disimpan dalam koleksi peta yang diteruskan dari luar ke metode ListFile, sehingga kami dapat memastikan bahwa semua file disimpan dalam koleksi peta yang sama.
Konfigurasikan ListFileServlet di file web.xml
<servlet> <servlet-name> listFileServlet </servlet-name> <servlet-class> me.gacl.web.controller.listfileServlet </servlet-class> </servlet> <servlet-Mapping> <servlet-name> ListFileServlet </servlet-name> <roRR-Pattern>
Halaman ListFile.jsp yang menampilkan file yang diunduh adalah sebagai berikut:
<%@ page language = "java" import = "java.util.*" pageEncoding = "UTF-8"%> <%@ taglib prefix = "c" uri = "http://java. Traverse Map Collection-> <c: foreach var = "me" items = "$ {filenamemap}"> <c: url value = "/servlet/downloadservlet" var = "downurl"> <c: param name = "fileName" value = "$ {me.key}"> </c: param> </c: url> $ {Me.key} "> </c: param> </c: $ {Me. href = "$ {downurl}"> unduh </a> <br/> </c: foreach> </body> </html> Dengan mengakses ListFileServlet, Anda dapat menampilkan sumber daya file yang diberikan kepada pengguna untuk diunduh di halaman ListFile.jsp, seperti yang ditunjukkan pada gambar di bawah ini:
3.2. Implementasikan Unduh File
Tulis servlet untuk memproses unduhan file. Kode untuk DownloadServlet adalah sebagai berikut:
package me.gacl.web.controller; impor java.io.file; impor java.io.fileInputStream; impor java.io.ioException; impor java.io.outputStream; impor java.net.urlencoder; impor javax.servlet.servletException; impor javax.servlet.http.httpservlet; impor javax.servlet.http.httpservletRequest; impor javax.servlet.http.httpservletResponse; Kelas Publik DownloadServlet memperluas httpservlet {public void doGet (httpservletRequest, httpservletResponse response) melempar servletException, ioException {// dapatkan nama file yang akan diunduh string filename = request.getParameter ("nama file"); //23239283-92489-Avatar.avi filename = string baru (filename.getbytes ("iso8859-1"), "UTF-8"); // File yang diunggah disimpan dalam subdirektori/Web-Inf/Unggah Direktori String FileSaverOtPath = this.getSerVletContext (). GetRealPath ("/Web-Inf/Upload"); // Cari tahu direktori di mana file tersebut berada di lokasi file string name = findFilesAvePathByFileName (nama file, fileseverOtPath); // Dapatkan file yang akan diunduh file file = file baru (path + "//" + fileName); // Jika file tidak ada jika (! File.exists ()) {request.setAttribute ("pesan", "sumber daya yang ingin Anda unduh telah dihapus !!"); request.getRequestDispatcher ("/message.jsp"). Forward (Request, Response); kembali; } // memproses nama file string realname = filename.substring (filename.indexof ("_")+1); // Atur header respons untuk mengontrol browser untuk mengunduh file response.setHeader ("konten-disposisi", "lampiran; fileName =" + urlencoder.encode (RealName, "UTF-8"))); // Baca file yang akan diunduh dan disimpan ke file input aliran fileInputStream in = new fileInputStream (path + "//" + filename); // Buat output stream outputStream out = response.getoutputStream (); // Buat buffer buffer byte [] = byte baru [1024]; int len = 0; // Loop Baca konten aliran input ke dalam buffer while ((len = in.read (buffer))> 0) {// output konten buffer ke browser untuk mewujudkan file unduhan out.write (buffer, 0, len); } // Tutup aliran input file di.close (); // tutup aliran output out.close (); } /*** @method: findFilesAvePathByFileName* @description: Temukan jalur file yang akan diunduh melalui nama file dan direktori root penyimpanan* @anthor: 发官网* @param fileName file yang akan diunduh* @param saverootpath The Root Directory untuk mengunggah file, itu, / /Web-dalam @param saveroTPath untuk mengunggah file, itu, /Web-inf-inpath* string publik findFilesAvePathByFileName (string fileName, string saverootpath) {int hashcode = filename.hashcode (); int dir1 = hashcode & 0xf; // 0--15 int dir2 = (HashCode & 0xf0) >> 4; // 0-15 string dir = saverootpath + "//" + dir1 + "//" + dir2; // unggah/2/3 unggah/3/5 file file = file baru (dir); if (! file.exists ()) {// buat direktori file.mkdirs (); } return dir; } public void dopost (permintaan httpservletRequest, respons httpservletResponse) melempar servletException, ioException {doGet (permintaan, respons); }}Mengkonfigurasi DownloadServer di file web.xml
<servlet> <servlet-name> downloadservlet </servlet-name> <servlet-class> me.gacl.web.controller.downloadServlet </servlet-class> </servlet> <servlet-Mapping> <servlet-name> DownloadServlet </servlet> <riglet-pattern>/sverlet/downloadservet </servlet> <rerl-pattern>/servlet/downloadservet </servlet> <rerl-pattern>/servlet/unduhan
Klik hyperlink [download], kirimkan permintaan ke DownloadServlet dan prosesnya untuk mencapai unduhan file. Efek operasi ditunjukkan pada gambar di bawah ini:
Dari hasil yang sedang berjalan, kita dapat melihat bahwa fungsi unduhan file kami dapat mengunduh file secara normal.
Di atas adalah penjelasan yang paling rinci dari unggahan file dan contoh unduhan yang diperkenalkan oleh editor (disarankan). Saya harap ini akan membantu semua orang. Jika Anda memiliki pertanyaan, silakan tinggalkan saya pesan dan editor akan membalas semua orang tepat waktu. Terima kasih banyak atas dukungan Anda ke situs web Wulin.com!