การอัปโหลดไฟล์คืออะไร?
การอัปโหลดไฟล์คือการบันทึกข้อมูลผู้ใช้
ทำไมฉันต้องอัปโหลดไฟล์?
เมื่อผู้ใช้ลงทะเบียนผู้ใช้อาจต้องส่งรูปภาพ จากนั้นรูปภาพนี้ควรได้รับการบันทึก
อัปโหลดส่วนประกอบ (เครื่องมือ) ทำไมเราต้องใช้เครื่องมืออัปโหลด
ทำไมเราต้องอัปโหลดส่วนประกอบ? เมื่อเราต้องการรับข้อมูลของลูกค้าเรามักจะได้รับมันผ่านวิธี getParameter ()
ข้อมูลไฟล์ที่อัปโหลดถูกหารด้วยโปรโตคอล MIME และแบบฟอร์มจะถูกห่อหุ้มในไบนารี กล่าวอีกนัยหนึ่ง: getParameter () ไม่สามารถรับข้อมูลของไฟล์ที่อัปโหลดได้
ก่อนอื่นให้ดูว่าการอัปโหลดไฟล์ HTTP นำข้อมูลมาด้วยกันอย่างไร
หน้า JSP, แบบฟอร์มต้องระบุ Enctype: Multipart/Form-Data
<form action = "$ {pageContext.request.contextpath}/servlet/uploadservlet1" enctype = "multipart/form-data" method = "post"> upload user: <input type = "text" name = "username"> <br/> ไฟล์ 1: name = "file2"> <br/> <input type = "submit" value = "ส่ง"> </form>แพ็คเกจ http คว้า
ลองรับข้อมูลโดยใช้ getParameter () บน servlet
String SS = request.getParameter ("ชื่อผู้ใช้"); System.out.println (SS);คุณไม่สามารถรับข้อมูลได้โดยใช้ GetParameter โดยตรง
แล้วเราควรทำอย่างไร? - - - วัตถุคำขอจัดเตรียมสตรีม servletInputStream เพื่ออ่านข้อมูลให้เรา
เราพยายามอ่านไฟล์
servletInputStream inputStream = request.getInputStream (); ไบต์ [] ไบต์ = ไบต์ใหม่ [1024]; int len = 0; ในขณะที่ ((len = inputstream.read (ไบต์))> 0) {system.out.println (สตริงใหม่ (ไบต์, 0, len)); -เพิ่มการควบคุมอินพุตเพิ่มเติมในหน้า JSP
<input type = "text" name = "รหัสผ่าน">
ไฟล์ข้อความที่ฉันอัปโหลดคือ 111111 และเอฟเฟกต์การอ่านมีดังนี้:
ตอนนี้เราสามารถอ่านข้อมูลการอัปโหลดไฟล์ แต่ตอนนี้คำถามคือ: จะแยกข้อมูลที่อัปโหลดของไฟล์ออกจากข้อมูลที่ส่งไปยังเซิร์ฟเวอร์ได้อย่างไร? - - เราได้เห็นด้านบนในภาพพวกเขาผสมกัน
เป็นการยากที่จะแยกจากกันตามการปฏิบัติตามปกติของเราดังนั้นเราต้องอัปโหลดส่วนประกอบ
FilePloads มีสองประเภทที่อัปโหลดส่วนประกอบ [การดำเนินการเพิ่มเติม] samrtupload [การดำเนินการเพิ่มเติม] fileupload
ในการใช้ส่วนประกอบ fileupload คุณต้องนำเข้าแพ็คเกจสองขวด
ขั้นตอนการพัฒนาคอมมอนมอนส์-โออิโอ-ฟิลด์อฟไลท์สร้างวัตถุโรงงาน Parser [diskfileitemfactory] สร้างตัวแยกวิเคราะห์ผ่านโรงงาน Parser [servletfileupload] เรียกวิธีการแยกวิเคราะห์เพื่อแยกวัตถุคำขอรับเนื้อหาที่อัปโหลดทั้งหมด หากเป็นฟิลด์ฟอร์มปกติให้รับชื่อฟิลด์และค่าฟิลด์ หากเป็นไฟล์ที่อัปโหลดให้เรียกใช้เมธอดอินพุตเพื่อรับกระแสอินพุตอ่านข้อมูลที่อัปโหลดอย่างรวดเร็ว
ลอง {// 1 รับ Parser Factory DiskFileItemFactory Factory = ใหม่ DiskFileItemFactory (); // 2. รับ parser servletfileupload upload = ใหม่ servletFileUpload (โรงงาน); // 3. กำหนดประเภทของแบบฟอร์มการอัปโหลดถ้า (! upload.ismultipartContent (คำขอ)) {// อัปโหลดแบบฟอร์มเป็นแบบฟอร์มปกติจากนั้นรับข้อมูลในวิธีการส่งคืนแบบดั้งเดิม } // ในการอัปโหลดแบบฟอร์มให้โทรแยกวิเคราะห์เพื่อแยกวิเคราะห์รายการข้อมูลที่อัปโหลด <fileItem> list = upload.parserequest (คำขอ); // fileItem // transFuse รายการและรับวัตถุ fileItem ที่ใช้ในการห่อหุ้มวัตถุข้อมูลอินพุตรายการข้อมูลการอัปโหลดครั้งแรกสำหรับ (fileItem item: list) {ถ้า (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]; String savePath = this.getServletContext (). getRealPath ("/อัปโหลด"); fileOutputStream out = new fileOutputStream (savepath + "//" + ชื่อไฟล์); // เขียนไฟล์ไปยังไดเรกทอรีอัปโหลดในขณะที่ ((len = in.read (บัฟเฟอร์))> 0) {out.write (บัฟเฟอร์, 0, len); } in.close (); out.close (); }}} catch (exception e) {e.printstacktrace (); -การทดสอบว่าทั้งสองฟิลด์และไฟล์ที่อัปโหลดสามารถอ่านและรับได้!
smartupload
ในการใช้ส่วนประกอบ smartupload คุณต้องนำเข้าแพ็คเกจการพัฒนา smartupload.jar
เริ่มต้นอย่างรวดเร็ว
// ส่วนประกอบอินสแตนซ์ SmartUpload smartUpload = new SmartUpload (); // เริ่มต้นการดำเนินการอัปโหลด smartupload.initialize (this.getServletConfig (), คำขอ, การตอบสนอง); ลอง {// อัปโหลด SmartUpload.upload (); // สำหรับข้อมูลทั่วไปมันง่ายมากที่วัตถุคำขอไม่สามารถรับพารามิเตอร์ที่ส่งได้ นอกจากนี้คุณต้องพึ่งพา SmartUpload String Password = SmartUpload.getRequest (). getParameter ("รหัสผ่าน"); System.out.println (รหัสผ่าน); // อัปโหลดไปยังโฟลเดอร์ uploadfile smartupload.save ("uploadfile"); } catch (smartuploadexception e) {e.printstacktrace (); -ทดสอบ
ในทำนองเดียวกันเราสามารถอัปโหลดไฟล์ไปยังโฟลเดอร์ UploadFile จำนวนรหัสลดลงมาก!
คุณยังสามารถรับพารามิเตอร์ของฟิลด์ปกติ
ฉันเปลี่ยนชื่อไฟล์เป็นรหัสที่อ่านไม่ออกภาษาจีนและรหัสภาษาจีนที่อ่านไม่ออกสำหรับการอัปโหลดข้อมูลและเป็นรหัสที่อ่านไม่ออก:
ข้อมูลภาษาจีนที่ส่งโดยแบบฟอร์มนั้นอ่านไม่ออก
ดังที่ได้กล่าวไว้ข้างต้นรูปแบบของการอัปโหลดข้อมูลไฟล์ถูกห่อหุ้มในไบนารีดังนั้นการใช้คำขอเพื่อเข้ารหัสข้อมูลจะไม่ทำงานสำหรับข้อมูลที่ส่งโดยแบบฟอร์ม!
fileupload แก้ปัญหารหัสที่อ่านไม่ออก
การใช้ fileupload เพื่อแก้ปัญหาที่อ่านไม่ออกเป็นเรื่องง่ายมาก
แก้ชื่อไฟล์ภาษาจีนที่อ่านไม่ออก หลังจากได้รับตัวแยกวิเคราะห์เพียงแค่ตั้งค่าการเข้ารหัสของตัวแยกวิเคราะห์เป็น UTF-8!
// ตั้งค่าการเข้ารหัสการอัปโหลด fileupload.setheaderencoding ("UTF-8");แก้ไขข้อมูลแบบฟอร์มที่อ่านไม่ออก เมื่อได้รับค่าฟอร์มให้ใช้การเข้ารหัส UTF-8 เพื่อให้ได้มา
ค่าสตริง = fileItem.getString ("UTF-8");ผล:
SmartUpload แก้ปัญหารหัสที่อ่านไม่ออก
ส่วนประกอบนี้ค่อนข้างลำบากในการแก้ปัญหาของรหัสที่อ่านไม่ออก ฉันพบโซลูชันที่หลากหลายทางออนไลน์ แต่ไม่พบง่าย ...
ดังนั้นหากข้อมูลไม่เกี่ยวข้องกับภาษาจีนให้ใช้ส่วนประกอบ smartupload และหากเกี่ยวข้องกับข้อมูลภาษาจีนให้ใช้องค์ประกอบ FilePload!
อัปโหลดหลายไฟล์เพิ่มการควบคุมการอัปโหลดแบบไดนามิก
สมมติว่าฉันมีหลายไฟล์ที่จะอัปโหลดตอนนี้และจำนวนไฟล์ที่จะอัปโหลดไม่แน่นอน แล้วเราควรทำอย่างไร? - -
เป็นไปไม่ได้ที่เราจะแสดงรายการตัวควบคุมจำนวนมากสำหรับการอัปโหลดไฟล์บนหน้าซึ่งไม่สวยงาม หากผู้ใช้ไม่สามารถใช้การควบคุมจำนวนมากได้
ดังนั้นเราต้องการเพิ่มการควบคุมแบบไดนามิกสำหรับการอัปโหลดไฟล์ หากผู้ใช้ต้องการอัปโหลดไฟล์เขาต้องสร้างการควบคุมแบบไดนามิกเท่านั้น!
วิเคราะห์
ในการสร้างการควบคุมแบบไดนามิกบนหน้านั้นไม่มีอะไรมากไปกว่าการใช้รหัส JavaScript
แล้วเราจะทำอย่างไร? -
มาทำเช่นนี้: เมื่อผู้ใช้ต้องการอัปโหลดไฟล์คลิกปุ่มและปุ่มจะเชื่อมโยงเหตุการณ์เพื่อสร้างการควบคุมการอัปโหลดไฟล์
เพื่อที่จะทำอย่างสมบูรณ์แบบเมื่อใดก็ตามที่มีการสร้างการควบคุมการอัปโหลดไฟล์จะมีการลบปุ่มลบเพื่อลบการควบคุม!
เราควรใช้ DIV เพื่อโหลดการควบคุมและลบปุ่มที่เราต้องการสร้าง เมื่อผู้ใช้คลิกเพื่อลบพวกเขาควรซ่อนปุ่มลบและการควบคุมการอัปโหลดไฟล์ด้วยกัน ดังนั้นจึงเป็นการดีที่สุดที่จะใช้ Divs ซ้อนกัน!
รหัสหน้ารหัส:
<table> <tr> <td> อัปโหลดผู้ใช้: </td> <td> <อินพุต type = "text" name = "ชื่อผู้ใช้"> </td> </tr> <tr> <td> เพิ่มไฟล์อัปโหลด </td> <td> <อินพุต = "t/td> <td> </tr> </table>
รหัส JavaScript
<script type = "text/javascript"> ฟังก์ชั่น adduploadfile () {// สร้างไฟล์อัปโหลดตัวควบคุม var input = document.createElement ("อินพุต"); input.type = 'ไฟล์'; input.name = 'ชื่อไฟล์'; // สร้างปุ่มลบ var del = document.createElement ("อินพุต"); del.type = 'ปุ่ม'; del.Value = 'ลบ'; // สร้าง div ภายใน var innerdiv = document.createelement ("div"); // ผูกสองตัวควบคุมกับ innerDiv.AppendChild (อินพุต); InnerDiv.AppendChild (del); // รับการควบคุม DIV ภายนอกและผูก DIV ภายในกับ div ภายนอก var outterdiv = document.getElementById ("ไฟล์"); Outterdiv.AppendChild (InnerDiv); // ผูกเหตุการณ์ del.onclick = function delete () {// การเรียกใช้วิธีการลบของ div ภายนอกเพื่อฆ่า div ภายใน this.parentnode.parentnode.removeChild (this.parentNode); }} </script>รายละเอียดการอัปโหลดไฟล์หากขนาดของไฟล์ที่อัปโหลดมากกว่าขนาดของไฟล์ที่เราตั้งค่าไฟล์จะใช้ไฟล์ชั่วคราวเพื่อบันทึกข้อมูลที่อัปโหลดเมื่ออัปโหลด หลังจากอัปโหลดเราควรลบไฟล์ชั่วคราว ตำแหน่งที่ไฟล์อัปโหลดไม่สามารถจัดการได้โดยเว็บเซิร์ฟเวอร์มิฉะนั้นอาจทำให้เกิดปัญหาด้านความปลอดภัย [อื่น ๆ อาจแก้ไขไฟล์อัปโหลดผ่านวิธีการ] หากชื่อไฟล์อัปโหลดเหมือนกันไฟล์อัปโหลดต้นฉบับจะถูกเขียนทับ เราต้องการสร้างชื่อไฟล์ที่ไม่ซ้ำกัน หากจำนวนผู้ใช้มีขนาดใหญ่มีการอัปโหลดไฟล์จำนวนมาก จากนั้นเราไม่ควรบันทึกไฟล์อัปโหลดทั้งหมดในไดเรกทอรีเดียวซึ่งน่าจะทำให้ดิสก์ขัดข้อง ดังนั้นเราต้องกระจายไฟล์ที่อัปโหลดไปยังไดเรกทอรีที่แตกต่างกัน วิเคราะห์
ปัญหาของการลบไฟล์ชั่วคราวนั้นง่ายมาก คุณจะต้องโทรไปที่วิธีการ DELETE () ของ FileItem หลังจากการดำเนินการทั้งหมดเสร็จสิ้น
เพื่อป้องกันไม่ให้ไฟล์ที่อัปโหลดจากเว็บเซิร์ฟเวอร์จัดการเราสามารถวางตำแหน่งไฟล์ที่อัปโหลดใน Web-Inf/ Directory!
สำหรับชื่อไฟล์เดียวกันเราสามารถใช้ชื่อไฟล์ UUID+ ที่อัปโหลดโดยผู้ใช้เป็นชื่อไฟล์ที่เราบันทึกไว้ ชื่อไฟล์ดังกล่าวไม่ซ้ำกัน
ในการแยกไฟล์ที่อัปโหลดเราจำเป็นต้องใช้อัลกอริทึม HashCode เพื่อเลิกกัน
บิตสี่บิตที่ต่ำกว่าสร้างไดเรกทอรีระดับแรก 5-8 บิตสร้างรหัสไดเรกทอรีระดับที่สอง
มาเขียนรหัสไฟล์อัปโหลดที่ค่อนข้างสมบูรณ์
ใช้อัลกอริทึม HashCode เพื่อแยกไดเรกทอรีที่บันทึกไว้
สตริงส่วนตัว makedirpath (ชื่อไฟล์สตริง, เส้นทางสตริง) {// คำนวณไดเรกทอรีหลักและรองผ่านชื่อไฟล์ int hashCode = filename.hashCode (); int dir1 = hashcode & 0xf; int dir2 = (hashcode & 0xf0) >> 4; String dir = path + "//" + dir1 + "//" + dir2; // หากไดเรกทอรีไม่มีอยู่ให้สร้างไฟล์ไดเรกทอรีไฟล์ = ไฟล์ใหม่ (dir); if (! file.exists ()) {file.mkdirs (); } // ส่งคืนเส้นทางการส่งคืนแบบเต็ม; -สร้างชื่อไฟล์ที่ไม่ซ้ำกัน
สตริงส่วนตัว makefilename (ชื่อสตริงไฟล์) {// ใช้ขีดล่างเพื่อแยก UUID และชื่อไฟล์และชื่อไฟล์อาจถูกแยกวิเคราะห์ในภายหลัง return uuid.randomuuid (). toString () + "_" + ชื่อไฟล์; -รหัสที่อัปโหลด
// สร้างโรงงาน diskfileitemfactory โรงงาน = ใหม่ diskfileitemfactory (); // สร้างตัวแยกวิเคราะห์ผ่านโรงงาน servletFilePilePileLoad fileUpload = ใหม่ servletFileUpload (โรงงาน); // ตั้งค่ารหัสของการอัปโหลด fileupload.setheaderencoding ("UTF-8"); // ตัดสินประเภทของแบบฟอร์มอัปโหลดถ้า (! fileupload.ismultipartContent (คำขอ)) {// อัปโหลดแบบฟอร์มเป็นแบบฟอร์มปกติจากนั้นรับข้อมูลในวิธีการส่งคืนแบบดั้งเดิม } ลอง {// แยกวิเคราะห์วัตถุคำขอเพื่อรับรายการ [โหลดเนื้อหาที่อัปโหลดทั้งหมด] รายการ <fileItem> list = fileupload.parserequest (คำขอ); // เดินทางผ่านรายการเพื่อตรวจสอบว่าเนื้อหาที่โหลดเป็นฟิลด์ปกติหรือไฟล์อัปโหลดสำหรับ (fileitem fileitem: รายการ) {// ถ้าเป็นรายการอินพุตปกติถ้า (fileitem.isformfield ()) {// รับชื่อและค่าของชื่อสตริงรายการอินพุต = fileItem.getFieldName (); ค่าสตริง = fileItem.getString ("UTF-8"); System.out.println (ชื่อ + "=" + ค่า); } else {// ถ้าเป็นไฟล์อัปโหลด // รับชื่ออัปโหลด [รวมถึงชื่อพา ธ ] สตริงชื่อ filename = fileItem.getName (); // สกัดกั้นชื่อไฟล์ชื่อไฟล์ = filename.substring (filename.lastindexof ("//") + 1); // สร้างชื่อไฟล์ชื่อไฟล์ที่ไม่ซ้ำกัน = makefilename (ชื่อไฟล์); inputStream inputStream = fileItem.getInputStream (); // รับเส้นทางโครงการและเขียนไฟล์ที่อัปโหลดไปยัง Project String Path = this.getServletContext (). getRealPath ("/web-inf/uploadFile"); // รับสายไดเรกทอรีที่กระจัดกระจาย realpath = makedirpath (ชื่อไฟล์, เส้นทาง); fileOutputStream outputStream = ใหม่ fileOutputStream (RealPath + "//" + ชื่อไฟล์); ไบต์ [] ไบต์ = ไบต์ใหม่ [1024]; int len = 0; ในขณะที่ ((len = inputstream.read (ไบต์))> 0) {outputStream.write (ไบต์, 0, len); } inputStream.close (); outputstream.close (); // ลบข้อมูลของไฟล์ชั่วคราว fileitem.delete (); }}} catch (fileuploadexception e) {e.printstacktrace (); -เอฟเฟกต์: ไดเรกทอรีถูกทำลายได้สำเร็จและชื่อไฟล์ไม่ซ้ำกัน
แสดงรายการไฟล์ในไดเรกทอรีที่อัปโหลดและให้การดาวน์โหลด
เมื่ออธิบายวัตถุการตอบสนองการดาวน์โหลดไฟล์ได้รับการอธิบาย เวลานี้เราจะเขียนเคสเล็ก ๆ เพื่อรวมการดาวน์โหลดไฟล์
มี 3 ไฟล์ในไดเรกทอรีอัปโหลด
วิเคราะห์
ขั้นแรกให้แสดงรายการไฟล์ทั้งหมดในไดเรกทอรี เนื่องจากเราจำเป็นต้องดาวน์โหลดไฟล์ตามชื่อไฟล์ในภายหลังเราจึงใช้คอลเลกชันแผนที่เพื่อบันทึกไฟล์ทั้งหมด
ส่วนการดาวน์โหลดนั้นง่ายมาก ค้นหาไฟล์ที่เกี่ยวข้องตามชื่อไฟล์และอัปโหลดตำแหน่งไฟล์อ่านและเขียนแล้วแก้ไขส่วนหัวข้อความเพื่อให้ได้การดาวน์โหลด
รับพา ธ เพื่อโหลดและอัปโหลดไฟล์ค้นหาไฟล์ทั้งหมดโดยการเรียกซ้ำ (ตัดสินว่าเป็นไฟล์หรือเป็นทางออกแบบเรียกซ้ำ) โหลดลงในคอลเลกชันแผนที่และส่งผ่านคอลเลกชันแผนที่ไปยังแผนกต้อนรับด้านหน้าเพื่อแสดงเมื่อผู้ใช้คลิกเพื่อดาวน์โหลดแล้วรับเส้นทางสัมบูรณ์ตามชื่อเดิม หากมีทรัพยากรอยู่ผู้ใช้จะได้รับอนุญาตให้ดาวน์โหลดรหัสและใส่ไฟล์ทั้งหมดที่เก็บไว้ใน Web-Inf/ Directory ในคอลเลกชันแผนที่
ได้รับการป้องกันโมฆะ dopost (คำขอ httpservletrequest, การตอบสนอง httpservletResponse) พ่น servletexception, ioexception {// รับไดเรกทอรีที่ไฟล์ที่อัปโหลดคือสตริง filepath = this.getServletContext () getRealPath ("/web-inf/uploadfile"); แผนที่แผนที่ = ใหม่ hashmap (); // ใช้การเรียกซ้ำเพื่อรับไฟล์ทั้งหมดและเพิ่มลงในคอลเลกชันแผนที่ getAllfiles (ไฟล์ใหม่ (filePath), แผนที่); request.setAttribute ("แผนที่", แผนที่); request.getRequestDispatcher ("/listfile.jsp"). forward (คำขอ, การตอบกลับ); } โมฆะส่วนตัว getAllfiles (ไฟล์ filePath, แผนที่แผนที่) {// ถ้าไม่ใช่ไฟล์แล้วมันเป็นโฟลเดอร์ถ้า (! filePath.isfile ()) {// รายการไฟล์ทั้งหมดในโฟลเดอร์ (อาจเป็นไฟล์อาจเป็นโฟลเดอร์) ไฟล์ [] ไฟล์ = filePath.ListFiles สำหรับ (ไฟล์ไฟล์: ไฟล์) {// ตัดสินไฟล์ที่ได้รับ (หรือโฟลเดอร์) และ getAllFiles (ไฟล์, แผนที่); }} else {// ป้อนคำสั่งอื่นจะต้องเป็นไฟล์ // รับชื่อสตริงชื่อไฟล์ filename = filepath.getName (). substring (filepath.getName (). lastIndexof ("_") + 1); // เราบันทึกชื่อเต็มของไฟล์เป็นคีย์และชื่อไฟล์เป็นค่าใน MAP Collection Map.put (filepath.getName (), ชื่อไฟล์); -แสดงไฟล์ที่ดาวน์โหลดได้ในหน้า JSP
<c: foreach items = "$ {map}" var = "me"> <c: url var = "url" value = "/downfileservlet"> <c: param name = "filename" value = "$ {me.key}"> </c: param> </c: url> $ {me.value} </a> <br> </c: foreach>ใช้ servlet ที่ดาวน์โหลด
ได้รับการป้องกันโมฆะ dopost (คำขอ httpservletrequest, การตอบสนอง httpservletResponse) พ่น servletexception, ioexception {// รับชื่อเต็มของไฟล์สตริงไฟล์ = request.getParameter ("filename"); // ถ้าเป็นข้อมูลภาษาจีนจำเป็นต้องใช้การแปลงรหัส filename = สตริงใหม่ (filename.getBytes ("ISO8859-1"), "UTF-8"); // รับตำแหน่งที่ไฟล์ถูกบันทึก path String = this.getServletContext (). getRealPath ("/web-inf/uploadfile"); // ไฟล์จะถูกบันทึกผ่านชื่อไฟล์โดย HashCode และไฟล์จะได้รับผ่านสตริงชื่อไฟล์ filerEalPath = MakeFilePath (ชื่อไฟล์, พา ธ ); System.out.println (filerealpath); // ตัดสินว่าไฟล์มีอยู่ไฟล์ = ไฟล์ใหม่ (FilerEalPath); if (! file.exists ()) {request.setAttribute ("ข้อความ", "ทรัพยากรที่คุณต้องการดาวน์โหลดไม่มีอยู่!"); request.getRequestDispatcher ("/message.jsp") ส่งต่อ (คำขอ, การตอบกลับ); กลับ ; } // มีอยู่ // อ่านไฟล์และเขียนข้อมูลไปยังเบราว์เซอร์ fileInputStream inputStream = new FileInputStream (filerEalPath); ไบต์ [] ไบต์ = ไบต์ใหม่ [1024]; int len = 0; ในขณะที่ ((len = inputstream.read (ไบต์))> 0) {response.getOutputStream (). เขียน (ไบต์, 0, len); } inputStream.close (); // ตั้งส่วนหัวข้อความเพื่อบอกเบราว์เซอร์ว่านี่คือชื่อสตริงไฟล์ที่ดาวน์โหลด = filename.substring (filename.lastindexof ("_") + 1); Response.SetheAder ("เนื้อหา-การจัดสรร", "เอกสารแนบ; filename =" + urlencoder.encode (ชื่อ, "UTF-8")); } สตริงส่วนตัว makeFilePath (ชื่อสตริง, เส้นทางสตริง) {int hashCode = filename.hashCode (); int dir1 = hashcode & 0xf; int dir2 = (hashcode & 0xf0) >> 4; String dir = path + "//" + dir1 + "//" + dir2 + "//" + ชื่อไฟล์; กลับ Dir; -ผล
หากมีข้อผิดพลาดใด ๆ ในบทความโปรดแก้ไขฉันและทุกคนจะสื่อสารกัน ขอบคุณสำหรับการสนับสนุน Wulin.com