บทความนี้แบ่งปันรหัสเฉพาะสำหรับ Javaweb Multi-File Upload และ Zip Packaging และการดาวน์โหลดสำหรับการอ้างอิงของคุณ เนื้อหาเฉพาะมีดังนี้
ฟังก์ชั่นการอัปโหลดและดาวน์โหลดไฟล์มักใช้ในโครงการ บทความนี้สรุปฉากในสภาพแวดล้อม Javaweb, การอัปโหลดแบบหลายไฟล์และฟังก์ชั่นบรรจุภัณฑ์และการดาวน์โหลดแบบแบทช์รวมถึงส่วนหน้าและส่วนแบ็กเอนด์
ก่อนอื่นมาทำให้ชัดเจน:
หน้าไม่สามารถรีเฟรชคำขอ AJAX ได้โดยตรงและไม่สามารถส่งคำขอและอัปโหลดคำขอได้ การอัปโหลดและการดาวน์โหลดจะต้องดำเนินการตามคำขอทั้งหมดของหน้า ฟังก์ชั่นนี้ทำได้โดยทั่วไปโดยรูปแบบการสร้างแบบฟอร์มในโครงการ
1. อัปโหลดหลายไฟล์
ข้อกำหนดของโครงการคือการตระหนักถึงฟังก์ชั่นการอัปโหลดหลายภาพ หลังจากอ้างถึงวิธีการปลั๊กอินมากมายที่พบบนอินเทอร์เน็ตฉันตัดสินใจเลือกโซลูชันการอัปโหลด jQuery ดั้งเดิม ทำตามขั้นตอนด้านล่างเพื่อโพสต์รหัสเฉพาะ
1. ส่วน HTML (สามารถละเว้นเพื่อสร้างด้วย JS)
<form id = "uploadform" method = "post" enctype = "multipart/form-data"> <input type = "file" name hidden = "fileimage" หลาย/> <a href = "JavaScript: void (0);" rel = "ภายนอก nofollow" rel = "external nofollow" id = "filesubmit" onclick = "uploadFileMulti ()"> อัปโหลดข้อมูล </a> </form>
มีคำอธิบายเล็กน้อย:
1. Enctype = "multipart/form-data" ในรูปแบบ
2. ในตัวอย่างให้ใช้แท็กเพื่อสร้างการส่ง
2. JS PART
var formData = new FormData ($ ("#uploadform") [0]); formData.Append ("foldName", "datumList"); // ตั้งค่าชื่อโฟลเดอร์พาเรนต์ FormData.Append ("OderCode", SelforderCode); formData.Append ("datumType", datumType); $. ajax ({type: "post", data: formdata, url: "order contructions" if (results.success) {// ล้างเนื้อหาในกล่อง $ ("#fileimage") Val (""); }, ข้อผิดพลาด: function () {batherRortoast ('คำขอล้มเหลว!')}}); มีคำอธิบายเล็กน้อยข้างต้น:
1. var formData = new FormData ($ ("#uploadform") [0]);
2. ใช้ formData.Append ("OderCode", SelforderCode); เพื่อเพิ่มพารามิเตอร์อื่น ๆ
แบ็กเอนด์ Java
multiparthttpservletRequest mrequest = (multiparthttpservletRequest) คำขอ; รายการ <multipartFile> ไฟล์ = mrequest.getFiles ("fileimage");มีคำอธิบายเล็กน้อยข้างต้น:
1. รับ multiparthttpservletrequest ซึ่งสอดคล้องกับชื่อของแท็กไฟล์
2. การดาวน์โหลดชุดไฟล์
ในโครงการนี้ข้อกำหนดคือการดาวน์โหลดชุดไฟล์ในแบทช์ ใช้ zip เพื่อบีบอัดไฟล์บนเซิร์ฟเวอร์แล้วดาวน์โหลดไฟล์ไปยังไคลเอนต์
สำหรับการสืบค้นออนไลน์การใช้คลาสเอาต์พุตไฟล์ของ Java ไม่สามารถแก้ปัญหาชื่อไฟล์ที่อ่านไม่ออกในไฟล์บีบอัดได้ วิธีแก้ปัญหา: ใช้แพ็คเกจ ant.jar เมื่อสร้างไฟล์บีบอัดคุณสามารถตั้งค่ารูปแบบการเข้ารหัสของไฟล์และปัญหาของชื่อไฟล์ที่อ่านไม่ออกจะได้รับการแก้ไข
ส่วน HTML (สามารถละเว้นเพื่อสร้างด้วย JS)
<form id = "uploadform" method = "post" enctype = "multipart/form-data"> <div> <input type = "hidden" name = "OrderCode"/> <อินพุตประเภท = "hidden" name = "datumType"/> <a href = "javascript: void (0);" rel = "external nofollow" rel = "ภายนอก nofollow" onclick = "batchDatumListDownload ()"> batchDown </a> </div> </form>
ส่วน JS
// batch download function batchDatumListDownload () {var param = {}; param.datumType = $ ("#datumTypeq"). val (); if (param.datumType == -1) {param.datumType = null; // QUERY all} param.orderCode = SelForDerCode; $ ("#uploadform input [name = orderCode]"). val (param.orderCode); $ ("#uploadform input [name = datumType]"). val (param.datumtype); var form = $ ("#uploadform") [0]; form.action = "order/datumlist/batchdownloaddatumlist"; Form.method = "Post"; form.submit (); // ฟอร์มส่ง}ส่วนแบ็กเอนด์
โมฆะสาธารณะ batchdownloadDatumList (datumlistvo datumlistvo, httpservletResponse การตอบสนอง) {ลอง {// รายการไฟล์สอบถามรายการไฟล์ <DatumListVo> volist = datumListService.QueryDatumLists (datumListVo); // บีบอัดรายการไฟล์ <file> files = new ArrayList <> (); สำหรับ (datumlistvo: volist) {file file = ไฟล์ใหม่ (vo.getDatumurl ()); files.add (ไฟล์); } string filename = datumlistvo.getOrderCode () + "_" + datumlistvo.getDatumtype () + ".zip"; // สร้างไฟล์ชั่วคราวสำหรับการดาวน์โหลดแบบแพคเกจบนสตริงฝั่งเซิร์ฟเวอร์ globalUploadPath = ""; string osname = system.getProperty ("os.name"); if (osname.toLowerCase (). indexof ("windows")> = 0) {globalUploadPath = globalkeys.getString (globalkeys.windows_upload_path); } else if (osname.toLowerCase (). indexof ("linux")> = 0 || osname.toLowerCase (). indexof ("mac")> = 0) {globaluploadpath = globalkeys.getString (globalkeys.linux_upload_path); } string outfilePath = globalUploadPath + file.Sparator + ชื่อไฟล์; ไฟล์ไฟล์ = ไฟล์ใหม่ (outfilePath); // ไฟล์ส่งออกไฟล์ fileOutputStream outstream = ใหม่ fileOutputStream (ไฟล์); // บีบอัดสตรีม zipoutputStream toClient = new ZipOutputStream (Outstream); // ตั้งค่าการเข้ารหัสอักขระในไฟล์ที่ถูกบีบอัดมิฉะนั้นจะกลายเป็น toClient.setEncoding ("GBK") ziputil.zipfile (ไฟล์, toclient); toClient.close (); Outstream.close (); ziputil.downloadzip (ไฟล์, การตอบสนอง); } catch (exception e) {e.printstacktrace (); -ในหมู่พวกเขา ziputil.java
/** * ไฟล์ในรายการไฟล์ที่บีบอัด * * @param ไฟล์ * @param outputStream * @throws ioexception */โมฆะสาธารณะคงที่ zipfile (ไฟล์รายการ, zipootputstream outputstream) โยน ioexception, servletexception {ลอง {int size.size // ไฟล์ในรายการบีบอัดสำหรับ (int i = 0; i <size; i ++) {ไฟล์ไฟล์ = (ไฟล์) files.get (i); ลอง {zipfile (ไฟล์, outputStream); } catch (Exception e) {ดำเนินการต่อ; }}} catch (Exception e) {throw e; }}/** * เขียนไฟล์ไปยังไฟล์ zip * * @param inputfile * @param outputstream * @throws ยกเว้น */โมฆะคงที่ zipfile (ไฟล์อินพุตไฟล์, zipoutputstream outputstream throwsiisk (new) FileInputStream (InputFile); bufferedInputStream binstream = ใหม่ bufferedInputStream (stream); zipentry entry = new Zipentry (inputFile.getName ()); OutputStream.putNextEntry (รายการ); int สุดท้าย max_byte = 10 * 1024 * 1024; // สตรีมสูงสุดคือ streamtotal ยาว 10 ม. = 0; // ความจุของสตรีมที่ยอมรับสตรีม int streamnum = 0; // จำนวนสตรีมที่ต้องแยก Int LaveTete = 0; // จำนวนอักขระที่เหลืออยู่ในไฟล์ไบต์ [] inoutbyte; // byte array ยอมรับข้อมูลของไฟล์ streamtotal = binstream.available (); // จำนวนอักขระสูงสุดของสตรีมได้รับผ่านวิธีการที่มีอยู่ StreamNum = (int) Math.Floor (Streamtotal /Max_Byte); // จำนวนอักขระที่เหลืออยู่ที่จะคั่นเพื่อรับไฟล์สตรีมออกจาก bybyte = (int) streamtotal % max_byte; // หลังจากแยกไฟล์หมายเลขที่เหลือถ้า (Streamnum> 0) {สำหรับ (int j = 0; j <streamnum; ++ j) {inoutbyte = ไบต์ใหม่ [max_byte]; // อ่านในสตรีมและบันทึกในอาร์เรย์ไบต์ binstream.read (inoutbyte, 0, max_byte); outputStream.write (inoutbyte, 0, max_byte); // เขียนสตรีม}} // เขียนข้อมูลสตรีมที่เหลืออยู่ inoutbyte = ไบต์ใหม่ [leavebyte]; binstream.read (inoutbyte, 0, leadbyte); outputStream.write (inoutbyte); outputstream.closeentry (); // ปิดรายการ zip ปัจจุบันและวางตำแหน่งสตรีมสำหรับการเขียนรายการถัดไป binstream.close (); // close instream.close (); }} else {โยน servletexception ใหม่ ("ไฟล์ไม่มีอยู่!"); }} catch (ioexception e) {โยน e; }}/** * ดาวน์โหลดไฟล์แพคเกจ * * ไฟล์ @param * @param Response */public Static void downloadzip (ไฟล์ไฟล์, การตอบกลับ httpservletResponse) {ลอง {// ดาวน์โหลดไฟล์เป็นสตรีม BufferedInputStream FIS = ใหม่ bufferedInputStream (ใหม่ FileInputStream (file.getPath ())); ไบต์ [] บัฟเฟอร์ = ไบต์ใหม่ [fis.available ()]; fis.read (บัฟเฟอร์); fis.close (); // การตอบสนองการตอบสนองที่ชัดเจน Response.reset (); OutputStream toClient = ใหม่ bufferedOutputStream (response.getOutputStream ()); Response.SetContentType ("แอปพลิเคชัน/octet-stream"); Response.SetheAder ("เนื้อหา-การจัดสรร", "ไฟล์แนบ; filename =" + file.getName ()); toClient.write (บัฟเฟอร์); toClient.flush (); toClient.close (); file.delete (); // ลบไฟล์ฝั่งเซิร์ฟเวอร์ที่สร้างขึ้น} catch (iOexception ex) {ex.printStackTrace (); - โดยทั่วไปตรงตามข้อกำหนดสำหรับการอัปโหลดและดาวน์โหลดไฟล์
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น