มีการดาวน์โหลดเว็บไฟล์สองประเภท หนึ่งคือไฟล์อยู่ในไดเรกทอรีเว็บไซต์ คุณสามารถดาวน์โหลดได้โดยป้อนเส้นทางไฟล์โดยตรงในเบราว์เซอร์เช่น http://www.xxx.com/file.zip ประเภทอื่นคือไฟล์ไม่ได้อยู่ในไดเรกทอรีเว็บไซต์หรือไฟล์ถูกสร้างขึ้นแบบไดนามิก (รายงานการส่งออกหรือส่งออก Excel ฯลฯ ) ในกรณีนี้การดาวน์โหลดไฟล์จะต้องประสบความสำเร็จผ่าน OutputStream ของการตอบกลับ DownloadUtils เป็นคลาส Java Web File Download Tool ที่มีวิธีการคงที่ที่หลากหลายในการดาวน์โหลดไฟล์
แพ็คเกจ com.rhui.util; นำเข้า Java.io.BufferedInputStream; นำเข้า Java.io.BufferedOutputStream; นำเข้า Java.io.File; นำเข้า Java.io.FileInputStream; นำเข้า java.io.ioException; นำเข้า Java.io.InputStream; นำเข้า Java.io.OutputStream; นำเข้า java.net.urlencoder; นำเข้า Javax.servlet.http.httpservletResponse; นำเข้า org.apache.commons.lang3.Stringutils; / *** ไฟล์ดาวน์โหลดไฟล์*/ คลาสสาธารณะ DownloadUtils {/ *** การดาวน์โหลดไฟล์การเข้ารหัส* การเข้ารหัสนี้จะบอกเบราว์เซอร์วิธีการเข้ารหัสของชื่อไฟล์เพื่อป้องกันรหัสที่อ่านไม่ออกเมื่อดาวน์โหลดชื่อไฟล์ภาษาจีน / *** ดาวน์โหลดไฟล์* @param Response* @param filepath พา ธ ของไฟล์บนเซิร์ฟเวอร์รวมถึงชื่อไฟล์*/ การดาวน์โหลดโมฆะคงที่สาธารณะ (httpservletResponse Response, String filepath) {ไฟล์ไฟล์ = ไฟล์ใหม่ (filepath.toString ()); ดาวน์โหลด (การตอบสนอง, ไฟล์, null, การเข้ารหัส); } /*** ดาวน์โหลดไฟล์* @param Response* @param filepath เส้นทางของไฟล์บนเซิร์ฟเวอร์รวมถึงชื่อไฟล์* @param filename ชื่อของไฟล์ที่ดาวน์โหลดไปยังเบราว์เซอร์ หากคุณไม่ต้องการชื่อของไฟล์ที่ดาวน์โหลดโดยเบราว์เซอร์ไปยังชื่อไฟล์บนเซิร์ฟเวอร์โปรดตั้งค่าพารามิเตอร์นี้ */ ดาวน์โหลดโมฆะคงที่สาธารณะ (httpservletResponse Response, String filepath, String filename) {ไฟล์ไฟล์ = ไฟล์ใหม่ ดาวน์โหลด (การตอบกลับ, ไฟล์, ชื่อไฟล์, การเข้ารหัส); } /*** ดาวน์โหลดไฟล์* @param Response* @param filepath เส้นทางของไฟล์บนเซิร์ฟเวอร์รวมถึงชื่อไฟล์* @param filename ชื่อของไฟล์ที่ดาวน์โหลดไปยังเบราว์เซอร์ หากคุณไม่ต้องการให้ชื่อไฟล์ดาวน์โหลดโดยเบราว์เซอร์ไปยังชื่อไฟล์บนเซิร์ฟเวอร์โปรดตั้งค่าพารามิเตอร์นี้* @param การเข้ารหัสชื่อไฟล์การเข้ารหัส*/ ดาวน์โหลดโมฆะคงที่สาธารณะ ดาวน์โหลด (การตอบกลับ, ไฟล์, ชื่อไฟล์, การเข้ารหัส); } /** * ดาวน์โหลดไฟล์ * @Param Response * ไฟล์ไฟล์ @param * @param filename ชื่อของไฟล์ที่ดาวน์โหลดไปยังเบราว์เซอร์ หากคุณไม่ต้องการชื่อของไฟล์ที่ดาวน์โหลดโดยเบราว์เซอร์ไปยังชื่อไฟล์บนเซิร์ฟเวอร์โปรดตั้งค่าพารามิเตอร์นี้ */ การดาวน์โหลดโมฆะคงที่สาธารณะ (httpservletResponse การตอบกลับไฟล์ไฟล์) {ดาวน์โหลด (ตอบกลับไฟล์ null เข้ารหัส); } /*** ดาวน์โหลดไฟล์* @Param Response* ไฟล์ไฟล์ @param* @param filename ชื่อของไฟล์ที่ดาวน์โหลดไปยังเบราว์เซอร์ หากคุณไม่ต้องการชื่อของไฟล์ที่ดาวน์โหลดโดยเบราว์เซอร์ไปยังเซิร์ฟเวอร์โปรดตั้งค่าพารามิเตอร์นี้ */ การดาวน์โหลดโมฆะแบบคงที่สาธารณะ (การตอบกลับ httpservletResponse, ไฟล์ไฟล์, ชื่อไฟล์สตริง) {ดาวน์โหลด (การตอบกลับไฟล์ไฟล์ไฟล์การเข้ารหัส); } /*** ดาวน์โหลดไฟล์* @param Response* ไฟล์ไฟล์ @param* @param filename ชื่อของไฟล์ที่ดาวน์โหลดไปยังเบราว์เซอร์ หากคุณไม่ต้องการให้ชื่อไฟล์ดาวน์โหลดโดยเบราว์เซอร์ไปยังชื่อไฟล์บนเซิร์ฟเวอร์โปรดตั้งค่าพารามิเตอร์นี้* @param การเข้ารหัสชื่อไฟล์การเข้ารหัส*/ การดาวน์โหลดโมฆะคงที่สาธารณะ } // หากคุณไม่ได้ระบุชื่อของไฟล์เพื่อดาวน์โหลดไปยังเบราว์เซอร์ให้ใช้ชื่อเริ่มต้นของไฟล์ถ้า (stringUtils.isblank (ชื่อไฟล์)) {filename = file.getName (); } ลอง {inputStream คือ = ใหม่ fileInputStream (ไฟล์); ดาวน์โหลด (การตอบกลับ, คือ, ชื่อไฟล์, การเข้ารหัส); } catch (ioexception e) {e.printstacktrace (); }} / *** ดาวน์โหลดไฟล์* @param Response* @param เป็นสตรีมอินพุตไฟล์* @param ชื่อไฟล์ที่ดาวน์โหลดชื่อไฟล์* @throws ioexception* / ดาวน์โหลดโมฆะคงที่สาธารณะ } / *** ดาวน์โหลดไฟล์* @param Response* @param เป็นสตรีมอินพุตไฟล์* @param ชื่อไฟล์ที่ดาวน์โหลดชื่อไฟล์* @param การเข้ารหัสรูปแบบการเข้ารหัส* / การดาวน์โหลดโมฆะคงที่สาธารณะ } bufferedInputStream bis = null; OutputStream OS = NULL; bufferedOutputStream bos = null; ลอง {bis = ใหม่ bufferedInputStream (IS); OS = response.getOutputStream (); BOS = ใหม่ bufferedOutputStream (OS); Response.setContentType ("แอปพลิเคชัน/octet-stream; charset =" + การเข้ารหัส); Response.Setcharacterencoding (การเข้ารหัส); Response.SetheAder ("เนื้อหา-การจัดสรร", "สิ่งที่แนบมา; ชื่อไฟล์ ="+ urlencoder.encode (ชื่อไฟล์, การเข้ารหัส)); ไบต์ [] บัฟเฟอร์ = ไบต์ใหม่ [1024]; int len = bis.read (บัฟเฟอร์); ในขณะที่ (len! = -1) {bos.write (บัฟเฟอร์, 0, len); len = bis.read (บัฟเฟอร์); } bos.flush (); } catch (ioexception e) {e.printstacktrace (); } ในที่สุด {ถ้า (bis! = null) {ลอง {bis.close (); } catch (ioexception e) {}} ถ้า (คือ! = null) {ลอง {is.close (); } catch (ioexception e) {}}}} สตริงคงที่สาธารณะ getEncoding () {return encoding; } โมฆะคงที่สาธารณะ setEncoding (การเข้ารหัสสตริง) {downloadUtils.encoding = การเข้ารหัส; -หากไฟล์ถูกบันทึกในไดเรกทอรีที่ไม่ใช่ไซต์บนเซิร์ฟเวอร์
String filePath = "C: //file.zip"; downloadutils.download (การตอบสนอง, filepath);
หากไฟล์เป็นสตรีมอินพุต
// เป็นสตรีมอินพุตไฟล์ // ชื่อไฟล์คือชื่อไฟล์ที่ดาวน์โหลดโดยเบราว์เซอร์ // การเข้ารหัสเป็นชื่อไฟล์เพื่อป้องกันรหัสที่อ่านไม่ออกเมื่อมีภาษาจีนในไฟล์สตริงไฟล์ = "file.zip"; String encoding = "UTF-8"; downloadutils.download (การตอบสนอง, IS, ชื่อไฟล์, การเข้ารหัส);
ดาวน์โหลดไฟล์ใน servlet
แพ็คเกจ com.rhui.web.servlet; นำเข้า java.io.ioException; นำเข้า javax.servlet.servletexception; นำเข้า Javax.servlet.annotation.webservlet; นำเข้า Javax.servlet.http.httpservlet; นำเข้า javax.servlet.http.httpservletrequest; นำเข้า Javax.servlet.http.httpservletResponse; นำเข้า com.rhui.util.downloadutils; @webservlet ("/ดาวน์โหลด/servlet") คลาสสาธารณะดาวน์โหลด Servlet ขยาย httpservlet {ส่วนตัวคงที่สุดท้าย serialversionuid = 1l; บริการโมฆะที่ได้รับการป้องกัน (คำขอ httpservletrequest, การตอบสนอง httpservletResponse) พ่น servletexception, ioexception {String filepath = "C: //file.zip"; downloadutils.download (การตอบสนอง, filepath); - PS: การดาวน์โหลดรูปภาพ (รวมถึงฟังก์ชั่น Anti-Theft Link)
แพ็คเกจ 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 (คำขอ, การตอบสนอง); -