แนวคิดพื้นฐาน:
แนวคิดก่อนหน้านี้คือการปรากฏกล่องเพื่อถามผู้ใช้ว่าเขาต้องการจัดเก็บไฟล์ที่ไหนและจากนั้นฉันก็สร้างไฟล์อื่นและวางไว้ที่นั่น อย่างไรก็ตามความคิดของฉันไม่ประสบความสำเร็จ
วิธีการดาวน์โหลดไฟล์นั้นง่ายมากในการคลิกที่ลิงค์ พื้นหลังส่งออกสตรีมไฟล์และตระหนักถึงฟังก์ชั่นการดาวน์โหลดผ่านเบราว์เซอร์รวมถึงการสอบถามเกี่ยวกับตำแหน่งและที่เก็บไฟล์ เบราว์เซอร์ส่วนใหญ่จะกำหนดค่าตำแหน่งคงที่และอาจไม่ถามทุกครั้ง
front-end นั้นง่ายมากแท็ก <a>, href = "ที่อยู่วิธีแบ็กเอนด์" หากความต้องการของคุณไม่สามารถใช้โดยตรงในไฮเปอร์ลิงก์ได้คุณสามารถเขียนได้ใน JS
window.location.href = "ที่อยู่วิธีแบ็กเอนด์"
หลังจากกระโดดไปยังวิธีพื้นหลัง
String filePath = this.getClass (). getClassLoader (). getResource (""). touri (). getPath () + "/exportpdf.pdf"; // พา ธ ของไฟล์ในไฟล์โครงการ outfile = ไฟล์ใหม่ (FilePath); String filename = outfile.getName (); // รับชื่อไฟล์ InputStream FIS = ใหม่ bufferedInputStream (ใหม่ FileInputStream (FilePath)); ไบต์ [] บัฟเฟอร์ = ไบต์ใหม่ [fis.available ()]; fis.read (บัฟเฟอร์); // อ่านสตรีมไฟล์ fis.close (); Response.reset (); // รีเซ็ตชุดผลลัพธ์ Response.AddHeader ("เนื้อหา-การจัดสรร", "เอกสารแนบ; filename =" + สตริงใหม่ (filename.replaceall ("", "") .getBytes ("UTF-8"), "iso8859-1")); // ส่งคืนชื่อไฟล์ส่วนหัว Response.addHeader ("ความยาวเนื้อหา", "" + outfile.length ()); // ส่งคืนการตอบสนองขนาดไฟล์ส่วนหัว SetContentType ("Application/Octet-Stream"); // ตั้งค่าประเภทข้อมูล // รับเอาต์พุตเอาต์พุตเอาต์พุต outputstream os = new bufferedOutputStream (response.getOutputStream ()); OS.WRITE (บัฟเฟอร์); // ไฟล์เอาต์พุต os.flush (); os.close (); เบราว์เซอร์จะจดจำเอาต์พุตไฟล์รูปแบบนี้โดยตรงและกล่องโต้ตอบจะปรากฏขึ้น
โปรดทราบว่าวิธีนี้จะต้องปรับในพื้นหลังโดยใช้วิธีการเชื่อมโยง มันเป็นไปไม่ได้ที่จะใช้วิธี AJAX และ XMLHTTPREQUEST ด้วยวิธีนี้สตรีมไฟล์ที่ส่งคืนจะถูกส่งกลับไปยังฟังก์ชันการโทรกลับของวิธี แน่นอนถ้าคุณต้องการรับไฟล์ใน JS สิ่งนี้จะใช้งานได้
ตัวอย่าง
แพ็คเกจ cn.itcast.day06.web.servlet; นำเข้า java.io.ioException; นำเข้า java.io.InputStream; นำเข้า java.io.OutputStream; นำเข้า Java.net.urlencoder; นำเข้า Javax.servlet.servletContext; นำเข้า Javax.servlet.servletexception; นำเข้า Javax.servlet.http.httpservlet; นำเข้า Javax.servlet.http.httpservletRequest; Public Class DownloadServlet ขยาย HTTPSERVLET {โมฆะสาธารณะ DOGET (HTTPSERVLETREQUEST Request, HTTPSERVLETRESSESSENSESS) พ่น ServleTexception, iOException {// ใช้ฟังก์ชั่น anti-theft chain // รับส่วนหัวอ้างอิงเพื่ออธิบายว่า if (referer == null ||! referer.startswith ("http: // localhost")) {// มันเป็นลิงค์การตอบสนองขโมย กลับ ; } // แก้ปัญหาการตอบสนองการตอบสนองการตอบสนองที่อ่านไม่ออกของจีน // ตั้งค่าการเข้ารหัสของข้อความข้อความ // ส่วนหัวข้อความตอบกลับ HTTP ที่ส่งผ่านโปรโตคอล HTTP ไม่สามารถปรากฏเป็นภาษาจีนจีน, จีนต้องเป็นชื่อสตริงที่เข้ารหัส URL = urlencoder.encode ("beauty.jpg", "UTF-8"); // แจ้งเบราว์เซอร์ให้อ่านการตอบสนองของทรัพยากร Setheader ("เนื้อหา-การจัดสรร", "สิ่งที่แนบมา; filename ="+ชื่อไฟล์); // อ่านข้อมูลภาพและส่งไปยังสตริงเบราว์เซอร์ IE WebPath = "/download/beauty.jpg"; // เทียบเท่ากับเส้นทางของเว็บแอปพลิเคชันปัจจุบัน ServletContext ServletContext = super.getServletContext (); inputStream ใน = servletContext.getResourceasstream (WebPath); outputStream out = response.getOutputStream (); int len; ไบต์ [] บัฟเฟอร์ = ไบต์ใหม่ [1024]; ในขณะที่ ((len = in.read (บัฟเฟอร์))! =-1) out.write (บัฟเฟอร์, 0, len); } โมฆะสาธารณะ dopost (คำขอ httpservletrequest, httpservletResponse การตอบสนอง) พ่น servletexception, ioexception {doget (คำขอ, การตอบสนอง); -