ก่อนอื่นให้ฉันแนะนำ เทคโนโลยี ที่เกี่ยวข้อง:
พารามิเตอร์สำคัญสองประการในวิธีการบริการ
ServletRequest ใช้เพื่อรับคำขอของผู้ใช้ และฟังก์ชั่นของมันคือ:
หนึ่งใน subinterfaces: javax.servlet.http.httpservletrequest
ServletResponse ใช้เพื่อส่งคืนข้อมูลไปยังผู้ใช้
หนึ่งใน subinterfaces: javax.servlet.http.httpservletResponse
เทคโนโลยีดาวน์โหลดไฟล์:
เทคโนโลยีดาวน์โหลดไฟล์ค่อนข้างง่ายในการอัปโหลดเทคโนโลยี มาดาวน์โหลดรูปภาพเป็นตัวอย่าง:
เรียกดูรูปภาพก่อนแล้วดาวน์โหลด
1. รหัสส่วนหน้า:
<span style = "ตัวอักษรขนาด: 14px;"> <a href = "img"> ค้นหารูปภาพทั้งหมดภายใต้โฟลเดอร์ </a> <br/> </span>
แผนกต้อนรับสามารถทำได้ในหนึ่งประโยค ค้นหาโปรแกรมพื้นหลังโดยตรงผ่าน web.xml
2. รหัสการแสดงผลพื้นหลัง:
<span style = "ตัวอักษรขนาด: 14px;"> คลาสสาธารณะ showimg ขยาย httpservlet {โมฆะสาธารณะ doget (คำขอ httpservletrequest, httpservletresponse ตอบสนอง) t servletexception, ioexception {<span style = "space สีขาว: dopost (คำขอ, การตอบสนอง); // เพื่อป้องกันข้อยกเว้นให้เชื่อมต่อ doget และ dopost เข้าด้วยกัน} </span> <span style = "ตัวอักษรขนาด: 14px;"> โมฆะสาธารณะ dopost (httpservletrequest คำขอ, htt pservletresponse response) ioexception {request.setcharacterencoding ("UTF-8"); "> <span style =" Font-Size: 14px; "> // <span style =" White-Space: Pre "> </span> โทรออก ServletContext แน่นอนคุณสามารถเรียกได้โดยตรง --- เมื่อระบุทีละหนึ่งเส้นทางที่แน่นอนไปยังไฟล์จะต้องใช้เมื่อใช้รูปภาพ </span> servletContext context = getServletContext (); String path = context.getRealPath ("/imgs"); // ค้นหาเส้นทางสัมบูรณ์ของไฟล์โฟลเดอร์ไฟล์ = ไฟล์ใหม่ (พา ธ ); <span style = "font-s ize: 14px; "> // <span style =" space สีขาว: pre "> </span> หลังจากค้นหาโฟลเดอร์ให้แสดงรายการรูปภาพทั้งหมดสำหรับผู้ใช้เพื่อเรียกดูไฟล์สตริง [] = file.list (); สำหรับ (String fn: ไฟล์) {</span> <pre name = "code"> <span style = "Font-Size: 14px;"> // แสดงทั้งหมด </span> string img = "<img src = 'imgs/"+fn+"'/>";
// out.print ("<a href = imgs/'"+fn+"'> ดาวน์โหลดรูปภาพ </a>"); string str = "<a href = 'down? name = imgs/"+fn+"'> ดาวน์โหลดรูปภาพ </a> "; // ให้ดาวน์โหลดไฮเปอร์ลิงก์ส่งผ่านพารามิเตอร์ --- ถ่ายโอนชื่อไฟล์ไปยังเนื้อหาลิงค์ผู้ใช้และเขียนออกมา PRINT (STR); out.print (img+" <br/> ");}}
3. การดาวน์โหลดไฟล์เฉพาะ
ขั้นแรกต้องตั้งค่าโปรโตคอลที่เกี่ยวข้อง โปรโตคอลดาวน์โหลดต้องตั้งค่าส่วนหัวดาวน์โหลดที่เกี่ยวข้อง
<span style = "พื้นที่สีขาว: pre"> </span> <span style = "font-size: 18px;"> <strong> response.setContentType ("แอปพลิเคชัน/แรง-ลง" </strong>); /ตั้งส่วนหัวที่เกี่ยวข้อง </span> เมื่อดาวน์โหลดคุณต้องแสดงชื่อไฟล์ของรูปภาพปัจจุบัน
<span style = "ตัวอักษรขนาด: 18px;"> <span style = "space white-space: pre"> </span> outputstream out = response.getOutputStream (); // รับสตริงสตรีมเอาท์พุท = Reque st. getParameter ("ชื่อ"); // ชื่อพารามิเตอร์ที่ส่งผ่านจากบริการไคลเอนต์คือ int num = name.lastindexof ("/"); "UTF- 8"); // ถ้าจีนจำเป็นต้องได้รับการบันทึกใหม่ // system.out.println (aa); strong> attachment; ทำการดาวน์โหลดเฉพาะ
<span style = "ตัวอักษรขนาด: 18px;"> string filename = this.getServletContext (). getRealPath (ชื่อ); // รับเส้นทางสัมบูรณ์ผ่านชื่อไฟล์และในเวลาเดียวกัน สามารถรับได้และคุณสามารถอ่านมันได้ใน = ใหม่ FileInputStream (ชื่อไฟล์); {out.write (b, 0, len); ภาพการทำซ้ำ:
การเรนเดอร์หลังจากคลิก:
ชื่อไฟล์แตกต่างกัน
เทคโนโลยีอัปโหลดไฟล์
มันจะลำบากมากในการอัปโหลดไฟล์ด้วยตัวเองดังนั้นเราสามารถใช้แพ็คเกจของคนอื่นเพื่อดาวน์โหลดลิงค์และคลิกเพื่อเปิดแบบฟอร์มลิงค์:
ไคลเอนต์ต้องใช้ประเภทข้อมูลแบบหลายส่วน/ฟอร์ม-ข้อมูลเพื่อแสดงประเภทข้อมูลคอมโพสิตเมื่อส่ง HTTP
นั่นคือ: <form enctype = "multipart/form-data">
ใช้ <อินพุต type = "file" name = "somename"/> html แท็กในรูปแบบ
ต้องใช้แพ็คเกจ:
Commons-fileupload.jar เครื่องมือการอัปโหลดไฟล์หลักอยู่ในแพ็คเกจนี้
แพ็คเกจ Commons-io.jar จำเป็นต้องอัปโหลดไฟล์
คำอธิบายโดยละเอียด:
DiskFileItemFactory - สร้างไดเรกทอรีไฟล์การตรวจสอบเวลาซึ่งหมายถึงขนาดพื้นที่แคช
ServletFileUpload ใช้เพื่อแยกวิเคราะห์ httpservletrequest ส่งคืนชุดวัตถุไฟล์
FileItem แสดงวัตถุแต่ละไฟล์ที่อัพโหลดโดยผู้ใช้
กระบวนการหลัก:
ไฟล์ f = ไฟล์ใหม่ ("f:/ex/temp"); // ระบุตำแหน่งที่เก็บไฟล์ชั่วคราว
diskfileitemfactory ff = ใหม่ diskfileitemfactory (1024*1024*5, f); // ขนาดและตำแหน่งที่เก็บของไฟล์ชั่วคราว
ServletFileUpload SF = ใหม่ servletFilePilePload (FF);
list <fileItem> list = sf.parserequest (คำขอ); // เริ่มการแยกวิเคราะห์
สำหรับ (fileitem it: list) {// รับชื่อไฟล์ และใช้ UUID เพื่อแก้ปัญหาของชื่อที่ซ้ำกัน
fileutils.copyInputStreamTofile (it.getInputStream (), ไฟล์ใหม่ (path+"/"+ชื่อไฟล์)); // ในโฟลเดอร์ที่ระบุ
-
1. รหัสแผนกต้อนรับ:
<span style = "font-size: 18px;"> <h2> ไฟล์อัปโหลด </h2> <form action = "upfile" method = "post" <span style = "color:#ff0000;"> enctype = "multipart /form-data "</span>> // ต้องเขียนมิฉะนั้นสถานีไม่สามารถรับข้อมูล <!-enctype =" multipart/form-data "---> file1 <อินพุต type =" ไฟล์ "< span style = "สี:#ff6666;"> ชื่อ </span> = "ไฟล์"/> <br/> โปรดป้อนชื่อ: <อินพุต type = "text" <span style = "color:#ff6666;"> ชื่อ </span> = "desc"/> <br/> file2 <อินพุต type = "ไฟล์" <span style = "สี:#ff6666;"> name </span> = "ไฟล์"/> <br/> โปรดป้อนชื่อ: <อินพุต type = "text" <span style = "สี:#ff0000;"> ชื่อ </span> = "desc"/> <br/> <อินพุต type = "ส่ง" value = "ส่ง "/> </form> </span>
2. รหัสพื้นหลัง:
2-1 แรกสร้างโรงงานที่ใช้ฮาร์ดดิสก์เพื่อจัดเก็บไฟล์ชั่วคราว
// ระบุไฟล์ตำแหน่งที่เก็บชั่วคราว f = ไฟล์ใหม่ ("f:/ex/temp"); // ระบุตำแหน่งที่เก็บชั่วคราว diskfileitemfactory ff = ใหม่ diskfileitemfactory (1024*1024*5, f); ไฟล์ชั่วคราวและตำแหน่งที่เก็บข้อมูล2-2 สร้างวัตถุ ServletFileUpload และตั้งค่าขนาดไฟล์เพื่อเพิ่มการถ่ายโอนไฟล์ให้สูงสุด
// สร้างวัตถุสำหรับการแยกวิเคราะห์ servletfileupload sf = ใหม่ servletfileupload (ff); sf.setfilesizeMax (1024*1024*10); *20); // ค่าสูงสุดของไฟล์ทั้งหมดคือ 20m String Path = this.getServletContext (). getRealPath ("/imgs"); 2-3 เริ่มแยกวิเคราะห์วัตถุ
<span style = "space white: pre"> </span> list <fileitem> list = sf.parserequest (คำขอ); // รับข้อมูลทั้งหมดที่ส่งจากแผนกต้อนรับส่วนหน้าต้องเติมเต็ม enctype = "multipart /form- data "for (fileitem it: list) {it0 = it; // <span style =" space สีขาว: pre "> </span> หากเป็นวัตถุรูปแบบปกติ-คุณสามารถตัดสินได้โดยตรงว่า ( it.isformfield ()) {// เป็นรายการรูปแบบปกติเช่น type = ชื่อข้อความชื่อสตริงชื่อ = it.getString ("UTF-8"); +ชื่อ); // ด้านล่างชื่อของคำอธิบายที่เขียน} else {<span style = "white-space: pre"> </span> // นี่คือชื่อไฟล์ที่เลือกโดยชื่อสตริงโต๊ะทำงานด้านหน้า = it.getName (); // พา ธ ไฟล์เฉพาะ--Absolute Path // string str = it.getString (); // เนื้อหาในไฟล์ // system.out.println ("str"+str); .getContentType (); <name pre name = "code" style = "font- size: 18px;"> // <span style = "space white-space: pre"> </span> ชื่อไฟล์ทรัพยากรทางฝั่งเซิร์ฟเวอร์ไม่สามารถอยู่ในภาษาจีนได้ เบราว์เซอร์จะเข้ารหัสโดยอัตโนมัติ ----------------------------------------- ------------------------------------------------------ ------------------------------------------------------ ------------------------------------------------------ ------------ ชื่อไฟล์ที่อัปโหลดถูกแปลงเป็นชื่อที่ไม่มีที่เก็บข้อมูลภาษาจีน ต้องจัดเก็บชื่อการแมปแล้วแปลงกลับเมื่อผู้ใช้ดาวน์โหลด // ชื่อแผนที่สตริง id = uuid.randomuuid (). toString (). แทนที่ ("-", ""); // UUID เดียวของโลกที่ใช้สำหรับ // ชื่อสตริงไฟล์ LastName = name.SubString (ชื่อ LastIndexof (".")); // รูปแบบไฟล์ // รูปแบบไฟล์ชื่อทั้งหมดพบ --- ชุดค่ารวมสตริง filename = id+นามสกุล; // ชื่อไฟล์ใหม่ // คัดลอกสตรีม ให้มันเขียนไปยังตำแหน่งที่สอดคล้องกัน fileutils.copyInputStreamTofile (it.getInputStream (), ไฟล์ใหม่ (เส้นทาง+"/"+ชื่อไฟล์)); // พา ธ เป็นเส้นทางสัมบูรณ์ของที่เก็บข้อมูล-กำหนดก่อนหน้า}
สิ่งนี้สามารถอัพโหลดได้อย่างง่าย แต่การอัปโหลดแบบนี้ไม่ปลอดภัยเลย รหัสที่สมบูรณ์นั้นแนบมาพร้อมกับปัญหาเล็กน้อยเพื่อป้องกันปัญหาทั่วไป
หลังจากเลือกไฟล์
ตรวจสอบไฟล์ในเว็บเซิร์ฟเวอร์ IMG ไฟล์ถูกอัปโหลดไปยังหน้า "ชื่อไฟล์ที่สร้างโดย UUID"
ซอร์สโค้ดอัพโหลดไฟล์:
<span style = "ตัวอักษรขนาด: 14px;"> แพ็คเกจ cn.hncu.upfile; นำเข้า Java.io.file; java. util.list; .APACHE .COMMONS.FILEUPLOAD.FILEITEM; Apache.Commons .IO.FileUtils; MyUpFile ชั้นเรียนสาธารณะขยาย HTTPSERVLET {<span style = "space สีขาว: pre;"> </span> // detg ป้องกันไม่ให้ผู้คนป้อนที่อยู่ในคอลัมน์ผู้ใช้ ไม่มีการตอบสนอง <span style = "space สีขาว: pre;"> </span> @Override <span style = "space white-space: pre;"> </span> void doget ที่ได้รับการป้องกัน span style = "space สีขาว: pre;"> </span> โยน servletexception, ioexception {<span style = "space สีขาว: pre;"> </span> resp.setContentType ("UTF-8"); span style = "space สีขาว: pre;"> </span> writer wr = resp.getWriter (); <span style = "space สีขาว: pre;"> </span> วิธีการที่รองรับ แต่อัปโหลด "); <span style =" space สีขาว: pre; "> </span>} <span style =" space สีขาว: pre; "> </span> <span style =" พื้นที่สีขาว : pre; "> </span> โมฆะสาธารณะ dopost (คำขอ httpservletRequest, การตอบสนอง httpservletResponse) <span style =" พื้นที่สีขาว: pre; "> </span> โยน servletexception, ioexception {<span style =" พื้นที่สีขาว: พื้นที่สีขาว: ก่อน; "); <span style =" space สีขาว: pre; "> </span> printwriter out = response.getWriter (); <span style =" space สีขาว: pre; "> </span> // ปกป้อง วิธีการอัปโหลดแบบฟอร์มปกติ 1: <span style = "space สีขาว: pre;"> </span> // ค่าคืนได้รับ (null) post1 (apllication/x-form-urlencoded, รูปแบบปกติ) post2 (ไฟล์: multipart/ แบบฟอร์ม-ฟอร์มการอัปโหลดไฟล์) // <span style = "space สีขาว: pre;"> </span> ประเภทสตริง = request.getContentType (); > </span>if( !!! ของรูปแบบปกติ 2 "); // <span style =" space สีขาว: pre; "> </span> return; // <span style =" space สีขาว: pre; "> </span>} <span style = "space สีขาว: pre;"> </span> // วิธีการ 2 <span style = "space สีขาว: pre;"> </span> boolean boo = servletfileupload.ismultipartcontent (คำขอ); "White- space: pre;"> </span> ถ้า (boo == false) {<span style = "space สีขาว: pre;"> </span> out.print ("อัปโหลด 1 ของรูปแบบปกติไม่ใช่ รองรับ "); <span style =" space สีขาว: pre; "> </span> <span style =" space สีขาว: pre; "> </span>} <span style =" พื้นที่สีขาว: pre; "> </span>} span> <span style =" space สีขาว: pre; "> </span> // ระบุตำแหน่งที่เก็บชั่วคราว <span style =" space สีขาว: pre; "> </span> ไฟล์ f = ไฟล์ใหม่ ("f:/ex/temp"); // ระบุตำแหน่งที่เก็บไฟล์ชั่วคราว <span style = "space สีขาว: pre;"> </span> diskfileitemfactory ff = ใหม่ diskfileitemfactory (1024*1024* 5, f); // ขนาดไฟล์ชั่วคราวและตำแหน่งที่เก็บ <span style = "space สีขาว: pre;"> </span> <span style = "space สีขาว: pre;"> </span> // สร้าง วัตถุสำหรับการแยกวิเคราะห์ <span style = "space สีขาว: pre;"> </span> servletfileupload sf = ใหม่ servletfileupload (ff); (1024*1024*10); // ค่าสูงสุดของตำแหน่งที่เก็บเดียวเท่านั้นคือ 10m <span style = "space white-space: pre;"> </span> sf.setsizemax (1024*1024*20); /ค่าสูงสุดของไฟล์ทั้งหมดคือ 20m <span style = "space สีขาว: pre;"> </span> path String = this.getServletContext (). getRealPath ("/imgs"); พื้นที่: pre; "> </span> system.out.println (" เส้นทางการจัดเก็บ: "+path); <span style =" space สีขาว: pre; "> </span> // เริ่มการแยกวิเคราะห์ <span style = "White-Space: Pre;"> </span> fileItem it0 = null; // ใช้เพื่อลบไฟล์ชั่วคราวในที่สุด <span style = "space สีขาว: pre;"> </span> ลอง {<span style = "White-Space: pre;"> </span> รายการ <fileitem> list = sf.parserequest (คำขอ); // รับข้อมูลทั้งหมดที่ส่งจากแผนกต้อนรับส่วนหน้าต้องเติมเต็ม enctype = "multipart/form- data "<span style =" Space- Space: pre; "> </span> สำหรับ (fileitem it: list) {<span style =" space สีขาว: pre; "> </span> it0 = it; <span; style = "space สีขาว: pre;"> </span> ถ้า (it.isformfield ()) {// เป็นรายการรูปแบบปกติเช่น type = ค่าข้อความของชื่อ <span style = "Space White-space: Pre ; "> </span> ชื่อสตริง = it.getString (" UTF-8 "); <span style =" space สีขาว: pre; "> </span> system.out.println (" ชื่อรายการพื้นฐาน: "+ชื่อ); // เขียนไว้ด้านล่างชื่อของคำอธิบายคือ <span style =" space สีขาว: pre; "> </span>} else {<span style =" space white-space: pre; "> </</ span> string name = it.getName ();//path ไฟล์เฉพาะ // <span style = "White-space: pre;"> </span> สตริง n1 = it.getfieldName (); "White-Space: pre;"> </span> string str = it.getString (); // เนื้อหาในไฟล์ // <span style = "space สีขาว: pre;"> </span> out.println ("str"+str); -space: pre; "> </span> สตริง contentType = it.getContentType (); <span style =" space สีขาว: pre; "> </span> ขนาดยาว = it.getSize (); <span style = "Space White: pre;"> </span> // ป้องกันไฟล์จากว่าง <span style = "White-space: pre;"> </span> ถ้า (size == 0) {<span style = " Space White: pre; "> </span> ดำเนินการต่อ; // ไฟล์ว่างเปล่าส่งคืนโดยตรง; <span style =" space white-space: pre; "> </span>} <span style =" space สีขาว : pre; "> </span> // ชื่อผู้ใช้ คุณต้องเติม <span style = "space สีขาว: pre;"> </span> if (name == null || name.trim () == "") {<span style = "Space White-Space: Pre ; "> </span> ดำเนินการต่อ; <span style =" space สีขาว: pre; "> </span>} <span style =" space สีขาว: pre; "> </span> // <span style = "Space White: Pre;"> </span> system.out.println (ชื่อ+","+contentType+","+size); / ชื่อไฟล์ทรัพยากรทางฝั่งเซิร์ฟเวอร์ไม่สามารถเป็นภาษาจีนได้เบราว์เซอร์จะเข้ารหัสโดยอัตโนมัติ ------------------------------------------ ------------------------------------------------------ ------------------------------------------------------ ------------------------------------------------------ ------------------------------------------------------ ------> </span> // เพื่อให้ผู้ใช้สามารถกู้คืนชื่อเดิมเมื่อดาวน์โหลดพวกเขาจะต้องจัดเก็บการติดต่อระหว่างชื่อไฟล์ต้นฉบับและชื่อการแมปและแปลงกลับเมื่อผู้ใช้ดาวน์โหลด pre; "> </span> // ชื่อการแมป <span style =" space white-space: pre; "> </span> string id = uuid.randomuuid (). toString (). แทนที่ ("-"," " . ("."); </span> string filename = id+นามสกุล; <span style = "space สีขาว: pre;"> </span> // คัดลอกสตรีม ปล่อยให้มันเขียนไปยังตำแหน่งที่สอดคล้องกัน <span style = "White-space: pre;"> </span> fileutils.copyInputStreamTofile (it.getInputStream (), ไฟล์ใหม่ (เส้นทาง+"/"+ชื่อไฟล์)); = "White-space: pre;"> </span>}} catch (fileuploadexception e) {<span style = "space white-space: pre;"> </span> โยน runtimeException ใหม่ ( + e); <span style = "space สีขาว: pre;"> </span>} ในที่สุด {<span style = "space สีขาว: pre;"> </span> ถ้า (it0 == null) {< span style = "space สีขาว: pre;"> </span> it0.delete (); // ลบไฟล์ชั่วคราว <span style = "space สีขาว: pre;"> </span>}} out.close ( );}} </span> <span style = "font-size: 18px;"> </span> ไฟล์แหล่งดาวน์โหลดไฟล์: [html] ดู plaincopyprint? <span style = "ตัวอักษรขนาด: 14px;"> แพ็คเกจ CN .HNCU.DOWNIMG; . การตอบสนอง letresponse) โยน ServleTexcepti ON, IOException {DOPOST (คำขอ, การตอบสนอง); ส่งชื่อผู้ใช้ไปยังแผนกต้อนรับ/*โอนสตริงชื่อผู้ใช้ที่คงที่ aa = "1.jpg"; // ถ้าเป็นภาษาจีนคุณจะต้องเข้ารหัส aa = urlencoder.encode (AA, "UTF-8"); Response.SetheAder ("เนื้อหา-การจัดสรร", "เอกสารแนบ; filename = '"+aa+"'"); ////////////////////////////////////////////////////////////ttttant getOutputStream (); // รับสตริงสตรีมเอาต์พุต = คำขอ Substring (NUM+1); การจัดการ "," ไฟล์แนบ; filename = '"+aa+"' "); // รับชื่อไฟล์ที่ส่งผ่านจากที่นั่นเพื่อให้สามารถดาวน์โหลดได้เมื่อจัดเก็บชื่อไฟล์สตริง = this.getServletContext (). getRealPath (ชื่อ); รับ Path Path InputStream ใน = ใหม่ FileInputStream (ชื่อไฟล์); เขียน (b, 0, len);}}} </span> <span style = "ตัวอักษรขนาด: 18px;"> </span>ข้างต้นเป็นเรื่องเกี่ยวกับบทความนี้ฉันหวังว่ามันจะเป็นประโยชน์กับการเรียนรู้ของทุกคน