การอัปโหลดและดาวน์โหลดไฟล์เป็นปัญหาทั่วไปที่พบในการพัฒนาเว็บ ในช่วงไม่กี่วันที่ผ่านมาการดาวน์โหลดไฟล์ถูกใช้ในโครงการ ฉันเคยจดบันทึกบางอย่างในลักษณะที่กระจัดกระจายมาก่อน วันนี้ฉันจะจัดระเบียบ การอัปโหลดไฟล์ต้องการการทดสอบเพิ่มเติมให้พูดคุยเกี่ยวกับการดาวน์โหลดไฟล์ก่อน
1. กระบวนการประมวลผลดาวน์โหลดไฟล์
กระบวนการดาวน์โหลดไฟล์นั้นชัดเจนมากนั่นคือ:
1. ค้นหาไฟล์ตามชื่อไฟล์หรือเส้นทางไฟล์ กลยุทธ์เฉพาะส่วนใหญ่ขึ้นอยู่กับความต้องการของคุณเอง ในระยะสั้นเส้นทางเต็มของไฟล์ที่ระบบสามารถค้นหาได้
2. รับสตรีมอินพุตและรับกระแสอินพุตจากไฟล์เป้าหมาย
3. รับกระแสเอาต์พุตและรับกระแสเอาต์พุตจากการตอบกลับ
4. อ่านไฟล์จากสตรีมอินพุตและส่งออกไฟล์ผ่านสตรีมเอาต์พุต นี่คือกระบวนการดำเนินการดาวน์โหลดจริง
5. ปิดสตรีม IO
นี่คือกระบวนการหลักและมีการตั้งค่าแอตทริบิวต์ที่จำเป็นบางอย่างเช่นประเภทเนื้อหาที่สำคัญกว่าของไฟล์การตั้งค่า ฯลฯ
2. อย่าพูดอีกต่อไปเพิ่มรหัส
ฉันทำกับ SpringMVC แต่อันที่จริงแล้วสิ่งเดียวกันก็เป็นจริงสำหรับสิ่งอื่น ๆ ฉันต้องการวัตถุ HTTPSERVLETRESSESSONSE และไฟล์เป้าหมายที่ถูกต้อง
1. รหัสแผนกต้อนรับส่วนหน้า
/** ดาวน์โหลดไฟล์ที่อัปโหลด*/ฟังก์ชั่นดาวน์โหลด fromupload (ชื่อไฟล์) {window.location.href = path + "/ดาวน์โหลด? dir = upload & filename =" + encodeuri (encodeuri (ชื่อไฟล์)); "/ดาวน์โหลด? dir = download & filename ="+encodeuri (encodeuri (ชื่อไฟล์));}2. รหัสคอนโทรลเลอร์
/*** ดาวน์โหลดไฟล์ (ดาวน์โหลดจากเส้นทางการอัปโหลด)** @param Request* @param Response* @throws ioexception*/ @responsebody @requestmapping (value = "/download") โมฆะ public ดาวน์โหลดไฟล์ "UTF-8");/** จำกัด เฉพาะไฟล์ในโฟลเดอร์อัปโหลดและดาวน์โหลดสามารถดาวน์โหลดได้*/string folderName = "ดาวน์โหลด"; ถ้า (! stringUtils.isEmpty (model.getDir ()) && model.getDir (). equals ("upload")) {folderName = "upload" request.getSession (). getServletContext (). getRealPath ("/")+ "/web-inf/"+ folderName+ "/"+ filename; filetools.downloadfile (คำขอ, การตอบสนอง (request.getSession (). getAttribute ("ชื่อผู้ใช้")) + ", ไฟล์ดาวน์โหลด:" + fileAbsolutePath);}ตรรกะการดาวน์โหลดที่นี่คือแผนกต้อนรับจะต้องร้องขอ/ดาวน์โหลดเท่านั้นและให้พารามิเตอร์ชื่อไฟล์ เพื่อหลีกเลี่ยงรหัสภาษาจีนที่อ่านไม่ออกเมื่อชื่อไฟล์เบื้องหน้าถูกใช้เป็นพารามิเตอร์จะใช้ encodeuri ของ JS () เพื่อเปลี่ยนเป็นรหัส Unicode แล้วถอดรหัสเป็นภาษาจีน นอกจากนี้เนื่องจากลักษณะพิเศษของโครงการไฟล์ที่ฉันต้องการดาวน์โหลดที่นี่อาจอยู่ในโฟลเดอร์อัปโหลดและดาวน์โหลดดังนั้นจึงมีส่วนหนึ่งของตรรกะการตัดสินที่นี่ นอกจากนี้ฉันห่อหุ้มทั้งชื่อไฟล์และชื่อโฟลเดอร์ที่ร้องขอใน FileModel
3. ดาวน์โหลดการใช้งานลอจิก
ไม่มีบริการที่นี่ แต่มีการใช้งานโดยตรงโดยใช้วิธีการคงที่
/*** ระบุชื่อดาวน์โหลดเมื่อดาวน์โหลดไฟล์** @param คำขอ* httpservletRequest* @param Response* httpservletResponse* @param filepath* เส้นทางเต็มของไฟล์* @param filename* ระบุชื่อไฟล์ที่แสดงเมื่อไคลเอนต์ดาวน์โหลด* @throws สตริง filepath, ชื่อไฟล์สตริง) พ่น IOException {bufferedInputStream bis = null; bufferedOutputStream bos = null; bis = ใหม่ bufferedInputStream (ใหม่ fileInputStream ไฟล์ (filepath) .length (); Response.Setcharacterencoding ("UTF-8"); Response.SetContentType ("Multipart/Form-Data");/** แก้ปัญหาภาษาจีนที่อ่านไม่ออกของเบราว์เซอร์แต่ละตัว filename.getBytes (): filename.getBytes ("UTF-8"); // filename.getBytes ("UTF-8") จัดการปัญหารหัสสัญญาณรบกวนใน Safari filename = สตริงใหม่ (ไบต์, "ISO-8859-1"); // เบราว์เซอร์ทั้งหมดสนับสนุนการตอบสนองการเข้ารหัส ISO.SetheAder ("เนื้อหา-การจัดสรร", string.format ("สิ่งที่แนบมา; ชื่อไฟล์ =/"%s/"", ชื่อไฟล์); response.Setheader ("ความยาวเนื้อหา", string.valueof (filelength)); bis.read (buff, 0, buff.length))) {bos.write (buff, 0, bytesRead);} bis.close (); bos.close ();}/*** ชื่อไฟล์ดาวน์โหลดไม่ได้ระบุเมื่อดาวน์โหลดไฟล์***************************************** iOexception*/โมฆะคงที่สาธารณะดาวน์โหลดไฟล์ (คำขอ httpservletrequest, การตอบกลับ httpservletResponse, สตริง filepath) พ่น IOException {ไฟล์ไฟล์ = ไฟล์ใหม่ (filePath); downloadfileนี่คือวิธีการดาวน์โหลดที่โอเวอร์โหลดเพื่อแก้ปัญหาบางครั้งจำเป็นต้องระบุชื่อไฟล์ที่ดาวน์โหลดโดยไคลเอนต์
3. สิ่งที่ควรทราบ
1. เกี่ยวกับการเลือกประเภท MIME
ฉันไม่เคยรู้อะไรเกี่ยวกับประเภท MIME มาก่อน แต่ฉันพบว่ามีรหัสแหล่งดาวน์โหลดมากมายบนอินเทอร์เน็ตที่มีการตั้งค่าที่แตกต่างกัน นั่นคือประโยคนี้
Response.SetContentType ("Multipart/Form-Data");ฉันตรวจสอบว่าหนึ่งในฟังก์ชั่นของการตั้งค่าประเภท MIME ที่นี่คือการบอกเบราว์เซอร์ไคลเอ็นต์ให้ประมวลผลไฟล์ที่จะดาวน์โหลดในรูปแบบใด มีคำอธิบายมากมายเกี่ยวกับเว็บไซต์ที่เกี่ยวข้องเฉพาะ หากคลาสประเภทนี้ที่ฉันตั้งไว้ในรูปแบบนี้รูปแบบโดยทั่วไปจะถูกจับคู่โดยอัตโนมัติ
2. ระบุชื่อไฟล์ดาวน์โหลดไคลเอนต์
บางครั้งเราอาจต้องระบุชื่อไฟล์เมื่อไคลเอนต์ดาวน์โหลดไฟล์นั่นคือรหัสนี้
Response.SetheAder ("เนื้อหา-การจัดสรร", string.format ("เอกสารแนบ; filename =/"%s/"", ชื่อไฟล์));
ชื่อไฟล์ในนั้นสามารถปรับแต่งได้ ส่วนหน้าไม่ควรย้าย
3. แก้ปัญหาของภาษาจีนที่อ่านไม่ออก
เป็นเรื่องธรรมดาเกินไปที่ไฟล์จีนจะอ่านไม่ออก เมื่อสถาปัตยกรรมระบบโครงการถูกสร้างขึ้นครั้งแรกการเข้ารหัสภาษาจีนทั้งหมดควรได้รับการรวมเป็นหนึ่งเดียวรวมถึงในโปรแกรมแก้ไขหน้าและฐานข้อมูล แนะนำให้เข้ารหัส UTF-8 หากคุณใช้สปริงคุณสามารถกำหนดค่าตัวกรองชุดอักขระของสปริงเพื่อหลีกเลี่ยงรหัสภาษาจีนที่อ่านไม่ออก
(1) ชื่อไฟล์ของกระบวนการขอดาวน์โหลดไคลเอนต์นั้นอ่านไม่ออก
บางครั้งเราก็พบมัน เมื่อหน้าแผนกต้อนรับแสดงรายการดาวน์โหลดชื่อไฟล์ภาษาจีนเป็นเรื่องปกติ แต่เมื่อเราไปที่พื้นหลังเราพบว่าชื่อไฟล์ในคำขอนั้นอ่านไม่ออก ในเวลานี้เราสามารถใช้ encodeuri ที่กล่าวถึงข้างต้นเพื่อแก้ปัญหา
(2) ชื่อไฟล์อ่านไม่ออกเมื่อไคลเอนต์ดาวน์โหลดและดำเนินการ
ในการทดสอบที่เกิดขึ้นจริงพบว่าเมื่อเบราว์เซอร์อื่นสามารถดำเนินการชื่อไฟล์ภาษาจีนภายใต้ IE อาจปรากฏอ่านไม่ออก ฉันเห็นรหัสชิ้นหนึ่งออนไลน์ หลังจากการทดสอบมันแก้ไขปัญหาของจีนที่อ่านไม่ออกในเบราว์เซอร์ที่แตกต่างกัน
/** แก้ปัญหาที่อ่านไม่ออกภาษาจีนของแต่ละเบราว์เซอร์*/string useragent = request.getheader ("user-agent"); byte [] bytes = useragent.contains ("msie")? filename.getBytes (): filename.getBytes ("UTF-8"); // filename.getBytes ("UTF-8") จัดการกับปัญหาที่อ่านไม่ออกของ Safari filename = สตริงใหม่ (ไบต์, "ISO-8859-1"); // เบราว์เซอร์ทั้งหมดรองรับการเข้ารหัสการเข้ารหัส ISO.SetheAder ("Content-Disposition", string.format ("ไฟล์แนบ; ชื่อไฟล์ =/"%s/"", ชื่อไฟล์));(3) ไฟล์อ่านไม่ออกบนเซิร์ฟเวอร์
เซิร์ฟเวอร์ที่แตกต่างกันอาจแตกต่างกันไปขึ้นอยู่กับแพลตฟอร์มดังนั้นคุณต้องให้ความสนใจกับที่นี่ สำหรับโซลูชันเฉพาะโปรดดูบทความที่ฉันเขียนไว้ก่อนหน้านี้: การประมวลผลภาษาจีนที่อ่านไม่ออกระหว่างการดาวน์โหลดไฟล์
ข้างต้นคือการดาวน์โหลดไฟล์การใช้งาน Java Web และวิธีการประมวลผลที่อ่านไม่ออกแนะนำให้คุณรู้จักโดย Editor ฉันหวังว่ามันจะเป็นประโยชน์กับคุณ หากคุณมีคำถามใด ๆ โปรดฝากข้อความถึงฉันและบรรณาธิการจะตอบกลับคุณทันเวลา ขอบคุณมากสำหรับการสนับสนุนเว็บไซต์ Wulin.com!