ตัวอย่างในบทความนี้แบ่งปันรหัสสำหรับการดาวน์โหลดจุดพัก Java สำหรับการอ้างอิงของคุณ เนื้อหาเฉพาะมีดังนี้
1. รหัส Java
// ใช้ไฟล์ downloadfile () {file dir = ไฟล์ใหม่ (filepath); // รับพา ธ ไฟล์ถ้า (! dir.exists ()) {system.out.println ("ข้อผิดพลาดของพา ธ ไฟล์") log.debug ("ข้อผิดพลาดเส้นทางไฟล์"); ส่งคืน "ล้มเหลว"; // ทิศทางไม่ว่าจะเป็นไฟล์หรือโฟลเดอร์ที่มีอยู่} ไฟล์ดาวน์โหลดไฟล์ = ไฟล์ใหม่ (dir, filename); // ค้นหาไฟล์ถ้า (! dir.isfile ())) {system.out.println ("ไฟล์ไม่มีอยู่"); log.debug ("ไฟล์ไม่มีอยู่"); ส่งคืน "ล้มเหลว"; // พิจารณาว่าไฟล์หรือโฟลเดอร์มีอยู่} ลอง {downloadfileranges (ดาวน์โหลดไฟล์); } catch (clientabortexception e) {system.out.println ("การเชื่อมต่อสิ้นสุด"); log.debug ("การเชื่อมต่อสิ้นสุด"); } catch (ioexception e) {e.printstacktrace (); } return null; } private void downloadfileranges (ไฟล์ดาวน์โหลดไฟล์) พ่น IOException {// ขนาดไฟล์ที่จะดาวน์โหลด Long Filelength = downloadFile.Length (); // ขนาดไฟล์ดาวน์โหลดความยาวผ่านยาว = 0; // ไม่ว่าจะดาวน์โหลดรถไฟด่วนมิฉะนั้นจะเป็นฟ้าร้องหรือบูลีนอื่น ๆ isflashget = true; // ใช้เพื่อบันทึกจำนวนไบต์สิ้นสุดที่ต้องดาวน์โหลด (Thunder หรือดาวน์โหลดอื่น ๆ ) Long Lenend = 0; // ใช้เพื่อบันทึกสตริงช่วงข้อมูลที่ลูกค้าต้องการเพื่อดาวน์โหลดสตริง rangeBytes = request.getheader ("ช่วง"); // ใช้ในการอ่านและเขียนไฟล์แบบสุ่ม ApplerAccessFile RAF = NULL; OutputStream OS = NULL; เอาท์พุทเอาท์พุท = null; ไบต์ b [] = ไบต์ใหม่ [1024]; // หากคำขอดาวน์โหลดไคลเอ็นต์มีช่วงถ้า (null! = rangeBytes) {// return code 206 response.setStatus (httpservletResponse.sc_partial_content); rangeBytes = request.getheader ("range"). replaceall ("bytes =", ""); // ตัดสินโหมดสตริงช่วงถ้า (rangeBytes.indexof (' -') == rangeBytes.length () - 1) {// ไม่มีหมายเลขไบต์สิ้นสุด, fast isflashget = true; rangeBytes = rangeBytes.substring (0, rangeBytes.indexof ('-')); PastLength = long.parselong (rangeBytes.trim ()); } else {// Thunder ดาวน์โหลด isflashget = false; String startBytes = rangeBytes.substring (0, rangeBytes.indexof ('-')); String endbytes = rangeBytes.substring (rangeBytes.indexof ('-') + 1, rangeBytes.length ()); // ไฟล์ที่ดาวน์โหลดมาในส่วนที่มีความยาว = long.parselong (startbytes.trim ()); // จำนวนไบต์ไฟล์ที่จำเป็นต้องดาวน์โหลด (เริ่มต้นจากเซ็กเมนต์ไฟล์ที่ดาวน์โหลด) Lenend = long.parselong (endbytes); }} // แจ้งให้ไคลเอนต์อนุญาตให้มีการส่งจุดพักอย่างต่อเนื่องรูปแบบการตอบกลับคือ: ยอมรับช่วง: การตอบสนองของไบต์ Setheader ("ยอมรับช่วง", "ไบต์"); // response.reset (); // หากเป็นการดาวน์โหลดครั้งแรกสถานะเริ่มต้นเป็น 200 และรูปแบบการตอบกลับคือ: http/1.1 200 ตกลงถ้า (0! = ความยาว pastLength) {// สตริงช่วงเนื้อหาสตริง contentRange = ""; // รูปแบบการตอบสนอง // เนื้อหาช่วง: ไบต์ [เริ่มต้นไบต์ของบล็อกไฟล์]-[ขนาดรวมของไฟล์ -1] || [ขนาดทั้งหมดของไฟล์] ถ้า (iSflashget) {contentRange = ใหม่สตริงบัฟเฟอร์ ("ไบต์"). .Append ("/"). ผนวก (ใหม่ยาว (Filelength) .toString ()) .tostring (); } else {contentRange = new StringBuffer (RangeBytes) .Append ("/") .Append (ใหม่ยาว (Filelength) .toString ()). ToString (); } Response.SetheAder ("ช่วงเนื้อหา", ContentRange); } string filename = getdownloadchinesefilename (ชื่อไฟล์); Response.SetheAder ("เนื้อหา-การจัดสรร", "เอกสารแนบ; filename =" + filename + ""); // รูปแบบของการตอบกลับคือ: response.setContentType ("แอปพลิเคชัน/octet-stream"); response.addheader ("ความยาวเนื้อหา", string.valueof (filelength)); ลอง {os = response.getOutputStream (); เอาต์พุต = ใหม่ bufferedOutputStream (OS); raf = new randomaccessFile (downloadfile, "r"); // ข้ามดาวน์โหลด Bytes Raf.seek (PastLength); if (iSflashget) {// express ฯลฯ int n = 0; ในขณะที่ ((n = raf.read (b, 0, 1024))! = -1) {output.write (b, 0, n); }} else {// Thunder ฯลฯ ในขณะที่ (raf.getFilePointer () <lenend) {output.write (raf.read ()); }} output.flush (); } catch (ioexception e) { /*** เมื่อเขียนข้อมูลข้อยกเว้นเช่น ClientAbortException* ถูกโยนลงเนื่องจากไคลเอนต์ยกเลิกการดาวน์โหลดและเซิร์ฟเวอร์ยังคงเขียนข้อมูลไปยังเบราว์เซอร์ นี่เป็นเรื่องปกติ โดยเฉพาะอย่างยิ่งสำหรับซอฟต์แวร์ลูกค้าดูดเลือดเช่น Thunder * เห็นได้ชัดว่ามีเธรดอ่านไบต์ = 1275856879-1275877358 * หากการอ่านไม่เสร็จสมบูรณ์ในช่วงเวลาสั้น ๆ ทันเดอร์จะเริ่มต้นครั้งที่สองและสามอีกครั้ง - - เธรดจะอ่านส่วนไบต์เดียวกันจนกระทั่งหนึ่งเธรดเสร็จสิ้นการอ่าน Thunder จะฆ่า * เธรดอื่น ๆ ที่กำลังดาวน์โหลดส่วนไบต์เดียวกันโดยใช้การอ่านไบต์โดยใช้การอ่านไบต์ทำให้เซิร์ฟเวอร์โยน clientAbortException * ดังนั้นเราจะละเว้นข้อยกเว้นนี้*/} ในที่สุด {ถ้า (เอาต์พุต! = null) {output.close (); } if (raf! = null) {raf.close (); }}} สตริงส่วนตัว getdownloadchinesefilename (สตริง paramname) {สตริงดาวน์โหลด chinesefilename = ""; ลอง {downloadchinesefilename = new String (paramname.getBytes ("GBK"), "ISO8859-1"); } catch (unsupportencodingexception e) {e.printstacktrace (); } return downloadchinesefilename; } สตริงสาธารณะ getFilePath () {return filepath; } โมฆะสาธารณะ setFilePath (String filePath) {this.filePath = filePath; } สตริงสาธารณะ getFilename () {return filename; } โมฆะสาธารณะ setFileName (ชื่อไฟล์สตริง) {this.filename = filename; } สาธารณะ httpservletRequest getRequest () {คำขอส่งคืน; } public httpservletResponse getResponse () {return response; - 2. ส่วน struts <br /> คัดลอกรหัสดังต่อไปนี้: <action name = "downloadFile" method = "downloadFile">
<ชื่อผลลัพธ์ = "ล้มเหลว" type = "redirectaction"> ShowdownloadFilenamelist </result>
</action>
3. JSP ชิ้นส่วน
การคัดลอกรหัสมีดังนี้: <td> <a href = "downloadfile? filename = $ {filemap.key} && filepath = $ {filemap.value}"> ไฟล์ดาวน์โหลด </a> </td>