ในการพัฒนาระบบเว็บแอปพลิเคชันฟังก์ชั่นการอัปโหลดและดาวน์โหลดไฟล์เป็นฟังก์ชั่นที่ใช้กันทั่วไป วันนี้มาพูดคุยเกี่ยวกับการใช้งานฟังก์ชั่นการอัปโหลดและดาวน์โหลดไฟล์ใน Javaweb
1. อัปโหลดตัวอย่างง่ายๆ
JSP
<%@ page language = "java" import = "java.util.*" pageencoding = "utf-8"%> <! doctype html สาธารณะ "-// w3c // dtd xhtml 1.0 transitional // en"> <html> charset = utf-8 "/> <title> ไฟล์อัพโหลดและดาวน์โหลด </title> </head> <body> <form action =" $ {pageContext.request.ContextPath}/uploadServlet "enctype =" multipart/form-data name = "file1" /> <br /> upload ไฟล์ 2: <อินพุต type = "file" name = "file2" /> <br /> <อินพุต type = "submit" value = "upload" /> < /form> <br /> $ {requestscope.message}เซล็ต
โมฆะสาธารณะ DOGET (คำขอ httpservletRequest, การตอบสนอง httpservletResponse) พ่น servletexception, ioexception {ลอง {// 1 รับ Parser Factory DiskFileItemFactory Factory = ใหม่ DiskFileItemFactory (); // 2. รับ parser servletfileupload upload = ใหม่ servletFileUpload (โรงงาน); // 3. กำหนดประเภทของแบบฟอร์มการอัปโหลดถ้า (! upload.ismultipartContent (คำขอ)) {// อัปโหลดแบบฟอร์มเป็นรูปแบบปกติจากนั้นรับข้อมูลในแบบดั้งเดิมและส่งคืน; } // ในการอัปโหลดแบบฟอร์มตัวแยกวิเคราะห์จะถูกเรียกให้แยกวิเคราะห์รายการข้อมูลอัปโหลด <fileItem> list = upload.parserequest (คำขอ); // fileItem // transipulate รายการที่จะได้รับวัตถุข้อมูลอินพุตรายการข้อมูลการอัปโหลดครั้งแรกวัตถุสำหรับ (รายการ fileItem: รายการ) {ถ้า (item.isformfield ()) {// สิ่งที่คุณได้รับคือชื่อสตริงรายการอินพุตปกติ = item.getFieldName (); // รับชื่อของค่าสตริงรายการอินพุต = item.getString (); System.out.println (ชื่อ + "=" + ค่า); } else {// รับ upload item item item filename = item.getName (); // รับชื่อไฟล์ที่อัปโหลด C:/เอกสารและการตั้งค่า/ThinkPad/Desktop/1.txt filename = filename.substring (filename.lastindexof ("//")+1); inputStream ใน = item.getInputStream (); // รับข้อมูลอัปโหลด int len = 0; บัฟเฟอร์ไบต์ [] = ไบต์ใหม่ [1024]; // ไดเรกทอรีที่ใช้ในการบันทึกไฟล์ที่อัปโหลดควรห้ามไม่ให้โลกภายนอกเข้าถึงสตริง savepath = this.getServletContext (). getRealPath ("/web-inf/upload"); System.out.println (SavePath); fileOutputStream out = new fileOutputStream (savepath + "/" + ชื่อไฟล์); // เขียนไฟล์ไปยังไดเรกทอรีอัปโหลดในขณะที่ ((len = in.read (บัฟเฟอร์))> 0) {out.write (บัฟเฟอร์, 0, len); } in.close (); out.close (); request.setAttribute ("ข้อความ", "อัปโหลดความสำเร็จ"); }}}} catch (Exception e) {request.setAttribute ("ข้อความ", "อัปโหลดล้มเหลว"); E.PrintStackTrace (); }}2. ฟังก์ชั่นการอัปโหลดที่แก้ไขแล้ว:
หมายเหตุ:
1. รหัสภาษาจีนที่อ่านไม่ออกสำหรับการอัปโหลดชื่อไฟล์และรหัสที่เล่นได้ภาษาจีนสำหรับการอัปโหลดข้อมูล
Upload.Setheaderencoding ("UTF-8"); // แก้รหัสภาษาจีนที่อ่านไม่ออกสำหรับการอัปโหลดชื่อไฟล์
// แบบฟอร์มถูกอัปโหลดสำหรับไฟล์การเข้ารหัสคำขอไม่ถูกต้องและสามารถแปลงได้ด้วยตนเอง
1.1 value = สตริงใหม่ (value.getBytes ("ISO8859-1"), "UTF-8");
1.2 ค่าสตริง = item.getString ("UTF-8");
2. เพื่อให้แน่ใจว่าความปลอดภัยของเซิร์ฟเวอร์ควรอัปโหลดไฟล์ในไดเรกทอรีที่ไม่สามารถเข้าถึงได้โดยตรงจากโลกภายนอก
3. เพื่อป้องกันการเขียนทับไฟล์ต้องสร้างชื่อไฟล์ที่ไม่ซ้ำกันสำหรับการอัปโหลดไฟล์
4. เพื่อป้องกันไม่ให้ไฟล์มากเกินไปปรากฏภายใต้ไดเรกทอรีคุณต้องใช้อัลกอริทึมแฮชเพื่อแยกพื้นที่เก็บข้อมูล
5. ในการ จำกัด ค่าสูงสุดของไฟล์ที่อัปโหลดคุณสามารถใช้: วิธีการ: servletFileUpload.setFilesizeMax (1024) และการจับภาพ:
fileuploadbase.filesizeLimitexceedeDexception ยกเว้นเพื่อให้พรอมต์ที่ใช้งานง่าย
6. หากคุณต้องการตรวจสอบให้แน่ใจว่าไฟล์ชั่วคราวถูกลบคุณต้องโทรหาวิธีการจัดรายการรายการหลังจากประมวลผลไฟล์อัปโหลด
7. หากต้องการ จำกัด ประเภทของไฟล์ที่อัปโหลด: เมื่อได้รับชื่อไฟล์ที่อัปโหลดให้พิจารณาว่าชื่อต่อท้ายนั้นถูกกฎหมายหรือไม่
8. ฟังความคืบหน้าการอัปโหลดไฟล์:
ServletFileUpload Upload = ใหม่ servletFilePilePload (โรงงาน); upload.setProgressListener (ใหม่ ProgressListener () {การอัปเดตโมฆะสาธารณะ (ยาว pbytesread, pcontentlength ยาว, int arg2) {system.out.println ("ขนาดไฟล์คือ:" + pcontentlength + ", ประมวลผลในปัจจุบัน:" + pbytesread);}}); 9. เพิ่มรายการอินพุตอัพโหลดไฟล์แบบไดนามิกในหน้าเว็บ
ฟังก์ชั่น addInput () {var div = document.getElementById ("ไฟล์"); var input = document.createElement ("input"); input.type = "ไฟล์"; input.name = "ชื่อไฟล์"; var del = document.createElement ("อินพุต"); del.type = "ปุ่ม"; del.Value = "ลบ"; del.onclick = function d () {this.parentNode.parentNode.removeChild (this.parentNode); } var innerDiv = document.createElement ("div"); InnerDiv.AppendChild (อินพุต); InnerDiv.AppendChild (del); Div.AppendChild (InnerDiv); -อัปโหลด JSP:
<%@ page language = "java" import = "java.util.*" pageencoding = "utf-8"%> <! doctype html public "-// w3c // dtd html 4.01 transitional // en"> <html> addInput () {var div = document.getElementById ("ไฟล์"); var input = document.createElement ("input"); input.type = "ไฟล์"; input.name = "ชื่อไฟล์"; var del = document.createElement ("อินพุต"); del.type = "ปุ่ม"; del.Value = "ลบ"; del.onclick = function d () {this.parentNode.parentNode.removeChild (this.parentNode); } var innerDiv = document.createElement ("div"); InnerDiv.AppendChild (อินพุต); InnerDiv.AppendChild (del); Div.AppendChild (InnerDiv); } </script> </head> <body> <form action = "" enctype = "mutlipart/form-data"> </form> <table> <tr> <td> อัปโหลดผู้ใช้: </td> <td> <อินพุตประเภท = "text" ชื่อ " อัปโหลดไฟล์ "onclick =" addInput () "> </td> </tr> <tr> <td> </td> <td> <div id =" ไฟล์ "> </div> </td> </td> </tr> </table>อัปโหลด servlet
ระดับสาธารณะ UploadServlet1 ขยาย HTTPSERVLET {โมฆะสาธารณะ DOGE (HTTPSERVLETREQUEST, การตอบสนอง httpservletResponse) พ่น Servletexception, iOexception {//request.getParameter("username "); // **** คำขอข้อผิดพลาด Setcharacterencoding ("UTF-8"); // แบบฟอร์มถูกอัปโหลดสำหรับไฟล์และการเข้ารหัสคำขอไม่ถูกต้อง // รับไฟล์ที่อัปโหลด savepath = this.getServletContext (). getRealPath ("/web-inf/upload"); ลอง {diskfileitemfactory Factory = ใหม่ diskfileitemfactory (); Factory.SetRepository (ไฟล์ใหม่ (this.getServletContext (). getRealPath ("/web-inf/temp"))); ServletFileUpload Upload = ใหม่ servletFilePilePload (โรงงาน); /*Upload.setProgressListener( ใหม่ ProgressListener () {การอัปเดตโมฆะสาธารณะ (ยาว pbytesread, pcontentlength ยาว, int arg2) {system.out.println ("ขนาดไฟล์คือ:" + pcontentlength + ", การประมวลผลในปัจจุบัน:" + pbytesread);}}); // แก้รหัสการอัพโหลดชื่อไฟล์ของจีนหาก (! upload.ismultipartContent (คำขอ)) {// รับข้อมูลในวิธีการส่งคืนแบบดั้งเดิม } /*upload.setFilesizeMax(1024); upload.setSizemax (1024*10);*/ list <fileItem> list = upload.parserequest (คำขอ); สำหรับ (FileItem item: list) {if (item.isformfield ()) {// ข้อมูลของรายการอินพุตทั่วไปถูกห่อหุ้มในชื่อสตริง fileitem = item.getfieldName (); ค่าสตริง = item.getString ("UTF-8"); // value = สตริงใหม่ (value.getBytes ("ISO8859-1"), "UTF-8"); System.out.println (ชื่อ + "=" + ค่า); } else {// ไฟล์อัปโหลดถูกห่อหุ้มในไฟล์ fileTem string filename = item.getName (); // ไฟล์ที่ส่งโดยเบราว์เซอร์ที่แตกต่างกันนั้นแตกต่างกัน c: /a/b/1.txt 1.txt system.out.println (ชื่อไฟล์); if (filename == null || filename.trim (). เท่ากับ ("")) {ดำเนินการต่อ; } filename = filename.substring (filename.lastindexof ("//")+1); inputStream ใน = item.getInputStream (); String saveFiLEname = makeFilename (ชื่อไฟล์); // รับชื่อของไฟล์ที่บันทึกไว้ realsavepath = makepath (savefilename, savepath); // รับไฟล์บันทึกไดเรกทอรี fileOutputStream = ใหม่ fileOutputStream (RealSavePath + "//" + saveFileName); บัฟเฟอร์ไบต์ [] = ไบต์ใหม่ [1024]; int len = 0; ในขณะที่ ((len = in.read (บัฟเฟอร์))> 0) {out.write (บัฟเฟอร์, 0, len); } in.close (); out.close (); item.delete (); // ลบไฟล์ชั่วคราว}}} catch (fileuploadbase.filesizeLimitexceedEdException e) {e.printStackTrace (); request.setAttribute ("ข้อความ", "ไฟล์เกินค่าสูงสุด!!"); request.getRequestDispatcher ("/message.jsp") ส่งต่อ (คำขอ, การตอบกลับ); กลับ; } catch (exception e) {e.printstacktrace (); }} สตริงสาธารณะ makefilename (ชื่อสตริงไฟล์) {//2.jpg return uuid.randomuuid (). toString () + "_" + ชื่อไฟล์; } Public String MakePath (ชื่อ FileName String, String SavePath) {int hashCode = filename.hashCode (); int dir1 = hashcode & 0xf; // 0--15 int dir2 = (hashcode & 0xf0) >> 4; // 0-15 String dir = savepath + "//" + dir1 + "//" + dir2; // อัปโหลด/2/3 อัปโหลด/3/5 ไฟล์ไฟล์ = ไฟล์ใหม่ (dir); if (! file.exists ()) {file.mkdirs (); } return dir; } โมฆะสาธารณะ dopost (คำขอ httpservletrequest, httpservletResponse การตอบสนอง) พ่น servletexception, ioexception {doget (คำขอ, การตอบสนอง); -3. ฟังก์ชั่นดาวน์โหลด
// แสดงรายการไฟล์ดาวน์โหลดทั้งหมดในเว็บไซต์สาธารณะคลาสสาธารณะ ListFilesERVLET ขยาย HTTPSERVLET {โมฆะสาธารณะ doGET (คำขอ httpservletRequest, การตอบสนอง httpservletResponse) โยน servletexception, ioexception แผนที่แผนที่ = ใหม่ hashmap (); ListFile (ไฟล์ใหม่ (FilePath), แผนที่); request.setAttribute ("แผนที่", แผนที่); request.getRequestDispatcher ("/listfile.jsp"). forward (คำขอ, การตอบกลับ); } โมฆะสาธารณะ ListFile (ไฟล์ไฟล์แผนที่) {ถ้า (! file.isfile ()) {ไฟล์ไฟล์ [] = file.listfiles (); สำหรับ (ไฟล์ f: ไฟล์) {listfile (f, แผนที่); }} else {string realname = file.getName (). substring (file.getName (). indexof ("_")+1); //9349249849-88343-8344_A_FAN_DAVI.avi map.put (file.getName (), realName); }} โมฆะสาธารณะ dopost (คำขอ httpservletrequest, การตอบสนอง httpservletResponse) พ่น servletexception, ioexception {doget (คำขอ, การตอบกลับ); -จอแสดงผล JSP
<%@ page language = "java" import = "java.util.*" pageencoding = "utf-8"%> <%@ taglib คำนำหน้า = "c" uri = "http://java.sun.com/jsp/jstl/core"%> transitional // en "> <html> <head> <title> jsp 'listfile.jsp' ของฉันหน้าเริ่มต้น </title> </head> <body> <c: foreach var =" me "items =" $ {map} "> <c: c: c: c: c: c: c: c: c: c: c: c: c: c: c: c: c: c: c: c value = "$ {me.key}"> </c: param> </c: url> $ {me.value} <a href = "$ {downurl}"> ดาวน์โหลด </a> <br/> </c: foreach> </body> </html>ดาวน์โหลดการประมวลผล servlet
Public Class DownloadServlet ขยาย HTTPSERVLET {โมฆะสาธารณะ DOGET (คำขอ HTTPSERVLETREQUEST, การตอบสนอง httpServletResponse) พ่น servletexception, ioexception {สตริง filename = request.getParameter ("filename"); //23239283-92489-avatar.avi filename = สตริงใหม่ (filename.getBytes ("ISO8859-1"), "UTF-8"); String Path = MakePath (ชื่อไฟล์ this.getServletContext (). getRealPath ("/web-inf/upload")); ไฟล์ไฟล์ = ไฟล์ใหม่ (path + "//" + ชื่อไฟล์); if (! file.exists ()) {request.setAttribute ("ข้อความ", "ทรัพยากรที่คุณต้องการดาวน์โหลดถูกลบไปแล้ว !!"); request.getRequestDispatcher ("/message.jsp") ส่งต่อ (คำขอ, การตอบกลับ); กลับ; } string realname = filename.substring (filename.indexof ("_")+1); Response.SetheAder ("เนื้อหา-การจัดสรร", "สิ่งที่แนบมา; ชื่อไฟล์ =" + urlencoder.encode (realname, "UTF-8")); FileInputStream ใน = ใหม่ FileInputStream (พา ธ + "//" + ชื่อไฟล์); outputStream out = response.getOutputStream (); บัฟเฟอร์ไบต์ [] = ไบต์ใหม่ [1024]; int len = 0; ในขณะที่ ((len = in.read (บัฟเฟอร์))> 0) {out.write (บัฟเฟอร์, 0, len); } in.close (); out.close (); } Public String MakePath (ชื่อ FileName String, String SavePath) {int hashCode = filename.hashCode (); int dir1 = hashcode & 0xf; // 0--15 int dir2 = (hashcode & 0xf0) >> 4; // 0-15 String dir = savepath + "//" + dir1 + "//" + dir2; // อัปโหลด/2/3 อัปโหลด/3/5 ไฟล์ไฟล์ = ไฟล์ใหม่ (dir); if (! file.exists ()) {file.mkdirs (); } return dir; } โมฆะสาธารณะ dopost (คำขอ httpservletrequest, httpservletResponse การตอบสนอง) พ่น servletexception, ioexception {doget (คำขอ, การตอบสนอง); -ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น