มาดูตัวอย่างการดาวน์โหลดไฟล์ที่ง่ายที่สุดกันก่อน:
คัดลอกรหัสรหัสดังต่อไปนี้:
แพ็คเกจ com.yyz.response;
นำเข้า java.io.FileInputStream;
นำเข้า java.io.IOException;
นำเข้า java.io.OutputStream;
นำเข้า javax.servlet.ServletException;
นำเข้า javax.servlet.http.HttpServlet;
นำเข้า javax.servlet.http.HttpServletRequest;
นำเข้า javax.servlet.http.HttpServletResponse;
//ดาวน์โหลดไฟล์
ResponseDemo คลาสสาธารณะขยาย HttpServlet {
โมฆะสาธารณะ doGet (คำขอ HttpServletRequest, การตอบสนอง HttpServletResponse)
พ่น ServletException, IOException {
สตริง realpath = this.getServletContext().getRealPath("/download/1.gif");
ชื่อไฟล์สตริง = realpath.substring(realpath.lastIndexOf("//")+1);
response.setHeader("การจัดการเนื้อหา", "ไฟล์แนบ; filename="+filename);
//เซิร์ฟเวอร์ใช้ส่วนหัวนี้เพื่อบอกให้เบราว์เซอร์เปิดข้อมูลในโหมดดาวน์โหลด
FileInputStream ใน = FileInputStream ใหม่ (realpath);
อินท์เลน = 0;
ไบต์บัฟเฟอร์ [] = ไบต์ใหม่ [1024];
OutputStream out = response.getOutputStream();
ในขณะที่ ((len = in.read (บัฟเฟอร์))>0){
out.write (บัฟเฟอร์, 0, len);
-
ใน.ปิด();
//ไม่จำเป็นต้องปิดเมื่อการตอบกลับถูกทำลาย เซิร์ฟเวอร์จะปิดสตรีมที่เกี่ยวข้องกับการตอบกลับโดยอัตโนมัติ
-
โมฆะสาธารณะ doPost (คำขอ HttpServletRequest, การตอบสนอง HttpServletResponse)
พ่น ServletException, IOException {
doGet(ร้องขอ, ตอบกลับ);
-
-
ฟังก์ชั่นของรหัสนี้คือการดาวน์โหลดรูปภาพ 1.png จากเซิร์ฟเวอร์ โครงสร้างไดเร็กทอรีจะแสดงดังต่อไปนี้โดยใช้ package explorer ของ MyEclipse:
มาทำให้ยากขึ้นอีกหน่อย ไฟล์ที่เราต้องการดาวน์โหลดเป็นไฟล์ชื่อภาษาจีน เนื่องจากสิ่งต่าง ๆ ในไฟล์ส่วนหัวในโปรโตคอล http สามารถเป็นอักขระ ASCII เท่านั้น วิธีการข้างต้น (เปลี่ยนโดยตรง String realpath = this.getServletContext().getRealPath("/download/1.gif"); เป็น String realpath = this getServletContext().getRealPath("/download/picture.gif");) รับไฟล์โดยตรง
จะมีปัญหารหัสอ่านไม่ออก สิ่งที่แนบมาเป็นผลการทดสอบ:
เมื่อต้องการแก้ไขปัญหานี้ ให้ใช้วิธีการเข้ารหัสของคลาส URLEncoder:
คัดลอกรหัสรหัสดังต่อไปนี้:
แพ็คเกจ com.yyz.response;
นำเข้า java.io.FileInputStream;
นำเข้า java.io.IOException;
นำเข้า java.io.OutputStream;
นำเข้า java.net.URLEncoder;
นำเข้า javax.servlet.ServletException;
นำเข้า javax.servlet.http.HttpServlet;
นำเข้า javax.servlet.http.HttpServletRequest;
นำเข้า javax.servlet.http.HttpServletResponse;
//เมื่อดาวน์โหลดไฟล์ภาษาจีน ชื่อไฟล์ภาษาจีนจะต้องเข้ารหัส URL
ResponseDemo คลาสสาธารณะขยาย HttpServlet {
โมฆะสาธารณะ doGet (คำขอ HttpServletRequest, การตอบสนอง HttpServletResponse)
พ่น ServletException, IOException {
สตริง realpath = this.getServletContext().getRealPath("/download/picture.gif");
ชื่อไฟล์สตริง = realpath.substring(realpath.lastIndexOf("//")+1);
response.setHeader("content-disposition", "attachment;filename="+URLEncoder.encode(ชื่อไฟล์,"UTF-8"));
//ฟังก์ชันนี้เข้ารหัสสตริงเป็น URL
FileInputStream ใน = FileInputStream ใหม่ (realpath);
อินท์เลน = 0;
ไบต์บัฟเฟอร์ [] = ไบต์ใหม่ [1024];
OutputStream out = response.getOutputStream();
ในขณะที่ ((len = in.read (บัฟเฟอร์))>0){
out.write (บัฟเฟอร์, 0, len);
-
ใน.ปิด();
-
โมฆะสาธารณะ doPost (คำขอ HttpServletRequest, การตอบสนอง HttpServletResponse)
พ่น ServletException, IOException {
doGet(ร้องขอ, ตอบกลับ);
-
-
สิ่งที่แนบมาเป็นผลการทดสอบ:
นอกจากนี้ยังมีรายละเอียดเล็กๆ น้อยๆ ที่ทุกคนต้องใส่ใจ:
ไม่สามารถใช้ FileReader แทน FileInputStream ได้ ข้อมูลจะหายไปเมื่อใช้ FileReader เหตุผลก็คือ FileReader เป็นสตรีมอักขระ และข้อมูล เช่น รูปภาพและไฟล์มีเดียจะถูกจัดเก็บในรูปแบบ 01 เมื่ออ่านด้วย FileReader คุณจะต้องศึกษาตารางการเข้ารหัส หากมี ไม่ได้ระบุการเข้ารหัส จะใช้การเข้ารหัสเริ่มต้นสำหรับแพลตฟอร์มที่เกี่ยวข้อง เช่น คอมพิวเตอร์ในจีนจะตรวจสอบ GB2312 เมื่ออ่านรหัสที่ไม่มีอยู่ในตารางรหัส GB2312 ข้อมูลจะถูกเข้ารหัสเป็น '? ' ข้อมูลจะกลายเป็นภาษาจีนและ '? 'ผสม. หลังจากส่งไปยังไคลเอนต์แล้ว ให้ตรวจสอบตารางโค้ดอีกครั้งเมื่อแสดง และแทนที่ '?' ทั้งหมดด้วยโค้ด '?' และข้อมูลจะสูญหาย เพียงจำสิ่งหนึ่งเกี่ยวกับรายละเอียดนี้: ไบต์สตรีมสามารถจัดการข้อมูลประเภทใดก็ได้ สตรีมอักขระสามารถจัดการได้เฉพาะข้อมูลอักขระเท่านั้น