บทความนี้แชร์รหัสเฉพาะสำหรับการดาวน์โหลดแบตช์แบ็กแบ็กแบตช์ Java และการบีบอัดลงในการดาวน์โหลด zip สำหรับการอ้างอิงของคุณ เนื้อหาเฉพาะมีดังนี้
เนื่องจากความต้องการของโครงการไฟล์รูปภาพบนเซิร์ฟเวอร์จะถูกบีบอัดและบรรจุและดาวน์โหลดไปยังเดสก์ท็อปท้องถิ่น
อันดับแรก JS front-end:
ฟังก์ชั่น doquerypic () {var picsdate = $ ("#picsdate"). val (); var pianodate = $ ("#picdate"). val (); var picinst = $ ("#pic_inst"). comboTree ("getValue"); var svrcode = $ ("#pic_svr_code"). val (); var picstime = $ ("#pic_stime"). val (); var pianotime = $ ("#pic_etime"). val (); if (svrcode == null) {$ .messager.alert ('คำใบ้', "โปรดป้อนรหัสสอบถามธุรกรรม"); กลับ; } else {$ .ajax ({type: "post", url: 'querypic.translog.action', ข้อมูล: {f_brno: picinst, f_sdate: picsdate, f_edate: picdate, f_svr_code: svrcode, f_stime: picstime if (rcdata.success) {var rows = rcdata.picinfo; ทั้งหมด </th> <th style = 'ความกว้าง: 10%; text-allign: center'> วันที่ </th> <th style = 'width: 10%; text-allign: center'> วันที่ </th> <th style = 'width: 10%; text-align: center'> มีภาพหรือไม่ 10%; Text-Align: Center '> สถานะการซื้อขาย </th> <th style =' ความกว้าง: 12%; text-allign: center '> หมายเลขอุปกรณ์ </th> <th style =' ความกว้าง: 10%; text-dorign: center '> รหัสการซื้อขาย </th> <th style =' ความกว้าง: 10%; เวลา </th> </tr> </thead> <tbody> "; สำหรับ (var i = 0; i <rows.length; i ++) {detailhtml = detailhtml +" <tr> <td align = 'center'> <อินพุตประเภท = /> </td> <td> " + แถว [i] .f_date +" </td> <td> " + แถว [i] .ishasimg +" </td> <td> " + แถว [i] .f_tx_name +" </td> <td> " แถว [i] .f_dev_id + "</td> <td>" + แถว [i] .f_svr_code + "</td> <td>" + แถว [i] .f_svr_code + "</td> <td>" "</td> </tr>"; - -รหัสด้านบนจะแสดงบนอินเทอร์เฟซหลังจากสอบถามข้อมูลที่เกี่ยวข้องและจากนั้นตามความต้องการของลูกค้าคุณสามารถเลือกชิ้นส่วนของข้อมูลที่จะดาวน์โหลดและบันทึก
แนบช่องทำเครื่องหมายเลือกทั้งหมด/ยกเลิกเลือกรหัส JS ทั้งหมด
// ช่องทำเครื่องหมายเลือกทั้งหมด/ยกเลิกเลือก var isCheckall = false; ฟังก์ชั่น swapcheck () {ถ้า (ischeckall) {$ ("อินพุต [type = 'ช่องทำเครื่องหมาย']") แต่ละ (ฟังก์ชั่น () {this.checked = false;}); ischeckall = false; } else {$ ("input [type = 'copbox']") แต่ละ (ฟังก์ชั่น () {this.checked = true;}); ischeckall = true; - รหัสต่อไปนี้ใช้สำหรับการโต้ตอบพื้นหลัง โปรดเตือนฉันว่าหากคุณดาวน์โหลดไฟล์อย่าใช้ AJAX เพื่อส่งข้อมูล ฉันเคยทำมาก่อนและไม่สามารถดาวน์โหลดได้ ฉันค้นพบมันหลังจากทั้งวันเท่านั้น ส่วนความคิดเห็นคือรหัส AJAX คุณสามารถดูเป็นข้อมูลอ้างอิง:
ฟังก์ชั่น downloadpic () {var arr = new Array (); var picids = document.getElementsByName ("pictureId"); สำหรับ (i = 0; i <picids.length; i ++) {ถ้า (picids [i]. ตรวจสอบ) {arr.push (picids [i] .value); }} if (arr.length <= 0) {$ .messager.alert ('tptrom', "ไม่มีเนื้อหาดาวน์โหลด!"); กลับ; } else {$ ('#formpic'). attr ('action', 'downloadpic.translog.action'); $ ("#formpic"). แบบฟอร์ม ('ส่ง', {onsubmit: function () {}, ความสำเร็จ: ฟังก์ชั่น (ข้อมูล) {$ .messager.alert ('คำใบ้', 'ภาพดาวน์โหลดสำเร็จ', 'info');}}); /***$. ajax ({type: "post", url: 'downloadpic.translog.action', ข้อมูล: {picturelist: json.stringify (arr)}, ความสำเร็จ: ฟังก์ชั่น (rcdata) {if (rcdata.success) {$. } else {$ .messager.alert ('คำใบ้', rcdata.errmsg); - ถัดไปคือการโต้ตอบพื้นหลังก่อนอื่นเลเยอร์ควบคุมคอนโทรลเลอร์:
/** * การดาวน์โหลดแบทช์รูปภาพ * @param Request * @param Response * @return * @throws ioexception */โมฆะสาธารณะดาวน์โหลด PPIC (คำขอ httpservletrequest, httpservletResponse ตอบกลับ) โยน ioexception {// แผนที่ <String, object> พารามิเตอร์ String [] pictureIds = request.getParameterValues ("pictureId"); การรับรองความถูกต้อง AU = getAuthentication (คำขอ); Service.downloadpic (PictureIds, Au, คำขอ, การตอบกลับ); กลับ ; - ชั้นบริการ:
โมฆะสาธารณะ downloadpic (String [] params, การรับรองความถูกต้อง AU, httpservletRequest คำขอ, httpservletResponse การตอบสนอง) พ่น IOException {// การตั้งค่าเริ่มต้นของเส้นทางสตริงไฟล์บีบอัด = system.getProperty ("ics.webapp.root"); // filezip = au.getUserName ()+"-"+au.getAttribute ("f_brno")+"pictures.zip"; String filePath = path + "//" + filezip; // จากนั้นมันจะใช้ในการสร้างไฟล์ zip // filepatharr เป็นชุดของพา ธ ไฟล์ PDF ที่ได้รับผ่านการสืบค้นฐานข้อมูลตามข้อมูลที่ส่งจากเบื้องหน้า (โดยเฉพาะไปยังคำต่อท้าย) // jsonarray jsons = jsonarray.fromobject (params.get ("pictureList")); /***รายการ <String> pictureIds = new ArrayList <String> (); สำหรับ (Object obj: jsons) {pictureIds.add (obj.toString ()); } */ สำหรับ (int i = 0; i <params.length; i ++) {แผนที่ <string, object> spemap = new hashmap <string, object> (); spemap.put ("f_date", params [i] .substring (0, 8)); spemap.put ("f_ics_batch", params [i] .substring (8)); รายการ <map <string, object >> reclists = dao.QueryLogInfo (spemap); สำหรับ (int j = 0; j <reccists.size (); j ++) {filenamearr.add (recists.get (j)); }} // ไฟล์ที่ต้องถูกบีบอัดรวมถึงที่อยู่ไฟล์และชื่อไฟล์ // string [] pathTyTyTyT = {"D: //13.JPG", "D: //1212.jpg"}; // ที่อยู่ไฟล์บีบอัดและชื่อไฟล์ที่จะสร้าง // string despath = "d: //downloads//new.zip"; ไฟล์ zipfile = ไฟล์ใหม่ (filepath); zipoutputStream zipstream = null; FileInputStream zipsource = null; bufferedInputStream bufferStream = null; ลอง {// สร้างกระแสเอาต์พุตของแพ็คเกจที่บีบอัดสุดท้าย zipstream = new ZipOutputStream (ใหม่ fileOutputStream (zipFile)); สำหรับ (int i = 0; i <filenamearr.size (); i ++) {ไฟล์ไฟล์ = ไฟล์ใหม่ ((สตริง) filenamearr.get (i) .get ("f_filename")); // ไฟล์ไฟล์ = ไฟล์ใหม่ (pathtytyt [i]); // จัดรูปแบบไฟล์ที่จำเป็นต้องถูกบีบอัดลงในสตรีมอินพุต zipsource = ใหม่ fileInputStream (ไฟล์); // รายการที่บีบอัดไม่ใช่ไฟล์อิสระเฉพาะ แต่รายการในรายการไฟล์แพ็คเกจที่บีบอัดเรียกว่ารายการเช่นดัชนี // ชื่อที่นี่คือชื่อไฟล์และการทำซ้ำของไฟล์จะทำให้ไฟล์ถูกเขียนทับ ที่นี่ฉันใช้ชื่อไฟล์สำหรับการจดจำไฟล์เดียว zipentry zipentry = ใหม่ zipentry (i+file.getName ()); // ค้นหาตำแหน่งของรายการบีบอัดและเริ่มเขียนไฟล์ไปยังแพ็คเกจบีบอัด zipstream.putnextentry (Zipentry); // อินพุต buffersTream = ใหม่ bufferedInputStream (Zipsource, 1024 * 10); int read = 0; // สร้างการอ่านและเขียนบัฟเฟอร์ไบต์ [] buf = ไบต์ใหม่ [1024 * 10]; ในขณะที่ ((read = buffersstream.read (buf, 0, 1024 * 10))! = -1) {zipstream.write (buf, 0, อ่าน); }}} catch (exception e) {e.printstacktrace (); } ในที่สุด {// ปิดสตรีมลอง {if (null! = bufferStream) buffersTream.close (); if (null! = zipstream) zipstream.close (); ถ้า (null! = zipsource) zipsource.close (); } catch (ioexception e) {e.printstacktrace (); }} /*** เขียนไฟล์สตรีมไปยังเบราว์เซอร์ front-end servletoutputStream OS = response.getOutputStream (); Response.SetContentType ("Application/X-Octet-Stream"); Response.SetContentLength ((int) zipfile.length ()); Response.addheader ("เนื้อหา-การจัดสรร", "เอกสารแนบ; filename =" + urlencoder.encode (filezip, "UTF-8")); bufferedInputStream bis = null; bufferedOutputStream bos = null; ลอง {bis = ใหม่ bufferedInputStream (ใหม่ FileInputStream (filePath)); BOS = ใหม่ bufferedOutputStream (OS); ไบต์ [] buff = ไบต์ใหม่ [2048]; int bytesread; ในขณะที่ (-1! = (bytesRead = bis.read (buff, 0, buff.length)) {bos.write (buff, 0, bytesRead); } os.flush (); os.close (); } catch (ioexception e) {โยน e; } ในที่สุด {ถ้า (bis! = null) bis.close (); ถ้า (bos! = null) bos.close (); ไฟล์ obj = ไฟล์ใหม่ (filepath); if (obj.exists ()) {obj.delete (); // ลบไฟล์บีบอัดชั่วคราวที่สร้างขึ้นโดยเซิร์ฟเวอร์}}*// // ดาวน์โหลดเบราว์เซอร์ // รับข้อมูลพร็อกซีเบราว์เซอร์สุดท้ายสตริง useragent = request.getheader ("user-agent"); // ตัดสินพร็อกซีเบราว์เซอร์และตั้งค่ารูปแบบการเข้ารหัสที่ตอบสนองต่อเบราว์เซอร์ตามลำดับสตริง finalFileName = null; if (stringUtils.contains (useragent, "msie") || stringutils.contains (useragent, "trident")) {// ie เบราว์เซอร์ finalfilename = urlencoder.encode (filezip, "UTF-8"); System.out.println ("IE Browser"); } อื่นถ้า (stringUtils.contains (useragent, "mozilla")) {// Google, เบราว์เซอร์ FinalFileName = urlencoder.encode (filezip, "UTF-8"); } else {finalFileName = urlencoder.encode (filezip, "utf-8"); // เบราว์เซอร์อื่น ๆ } response.setContentType ("แอปพลิเคชัน/x-octet-stream"); // บอกเบราว์เซอร์ให้ดาวน์โหลดไฟล์แทนการเปิดโดยตรง เบราว์เซอร์เริ่มต้นเพื่อเปิดการตอบสนอง setheader ("เนื้อหา-การจัดสรร", "ไฟล์แนบ; filename =" +finalfilename); // ชื่อของไฟล์ดาวน์โหลด servletutputstream servletoutputstream = response.getOutputStream (); dataOrtputStream temps = new dataOrmputStream (servletOutputStream); datainputStream ใน = ใหม่ datainputStream (ใหม่ FileInputStream (filePath)); // พา ธ ไปยังเบราว์เซอร์ไฟล์ดาวน์โหลดไบต์ [] b = นิวไบต์ [2048]; File ReportZip = ไฟล์ใหม่ (filePath); // จากนั้นใช้เพื่อลบไฟล์บีบอัดชั่วคราวลอง {ในขณะที่ ((in.read (b))! = -1) {temps.write (b); } temps.flush (); } catch (exception e) {e.printstacktrace (); optlogsvc.savelog (au.getusername (), au.getattribute ("f_brno"), au.getattribute ("f_lstip"), toptlogservice.type_mr, "", au.getUsername () } ในที่สุด {ถ้า (temps! = null) temps.close (); ถ้า (ใน! = null) in.close (); if (reportzip! = null) reportzip.delete (); // ลบไฟล์บีบอัดชั่วคราวที่สร้างขึ้นในเครื่องโดยเซิร์ฟเวอร์ servletoutputstream.close (); } /***ถ้า (picinfollist.size ()> 0) {rc.put ("ความสำเร็จ", จริง); rc.put ("picinfo", picinfollist); optlogsvc.savelog (au.getusername (), au.getattribute ("f_brno"), au.getattribute ("f_lstip"), toptlogservice.type_mr, ", au.getUsername ()+" } else {rc.put ("ความสำเร็จ", เท็จ); rc.put ("errmsg", "ข้อมูลทดสอบ"); optlogsvc.savelog (au.getusername (), au.getattribute ("f_brno"), au.getattribute ("f_lstip"), toptlogservice.type_mr, ", au.getUsername ()+" }*/ optlogsvc.savelog (au.getusername (), au.getAttribute ("f_brno"), au.getAttribute ("f_lstip"), toptlogservice.type_mr, "", au.getusername () กลับ ; -มีปัญหากับรูปแบบการแปลงอาร์เรย์ JSON หาก JSON ที่ส่งมาจาก JSON ส่วนหน้าถูกจัดรูปแบบโดย JSON.Stringify มันจะต้องแยกวิเคราะห์ด้วยวิธีนี้เมื่อคุณไปที่พื้นหลัง
ทักษะการจัดวางของฉันไม่ดีดังนั้นมาดูกันเถอะ ฉันตัดสินว่าเบราว์เซอร์ถูกคัดลอกออนไลน์ แต่ฉันพบว่ามันไร้ประโยชน์และไม่รู้จักจีน ในที่สุดฉันก็ประนีประนอมและยังคงใช้ภาษาอังกฤษเป็นชื่อไฟล์ หากคุณพบรหัสที่อ่านไม่ออกภาษาจีนคุณสามารถค้นหาอีกครั้งบน Baidu คนอื่น ๆ เขียนบทความที่คล้ายกัน แต่ฉันไม่มีพลังงานในการศึกษาพวกเขา
นี่คือวิธีการบีบอัดไฟล์ที่มีอยู่บนเซิร์ฟเวอร์ ฉันเคยเห็นบทความที่เกี่ยวข้องกับ Baidu มาก่อนเพื่อรับรูปภาพเครือข่ายและบีบอัดและดาวน์โหลดซึ่งน่าสนใจ
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น