การอัปโหลดไฟล์ Java และการดาวน์โหลดไฟล์เป็นฟังก์ชั่นทั่วไปในการพัฒนาโปรแกรม บทความต่อไปนี้จะแนะนำโซลูชั่นสามแบบเพื่อใช้งานการอัปโหลดและดาวน์โหลดไฟล์ใน Java รายละเอียดเฉพาะมีดังนี้
จุดแรก: รหัส Java ใช้การอัปโหลดไฟล์
formfile file = manform.getFile (); String newFileName = null; String newPathName = null; String fileaddre = "/numup"; ลอง {inputStream stream = file.getInputStream (); // อ่านไฟล์ลงในสตริง filePath = request.getRealPath (fileadDre); file1) .mkdir (); newFileName = system.currentTimeMillis ()+ file.getFilename (). substring (file.getFilename (). lastIndexof ('.')); byteArrayOutputStream BAOS = ใหม่ ByTeArrayputTream (); newfilename); newPathName = filePath+"/"+newfilename; system.out.println (newPathName); // สร้างสตรีมเอาต์พุตสำหรับการอัปโหลดไฟล์ System.out.println (filepath+"/"+file.getFilename (); ในขณะที่ ((bytesread = stream.read (บัฟเฟอร์, 0, 8192))! = -1) {bos.write (บัฟเฟอร์, 0, bytesRead); // เขียนไฟล์ไปยังเซิร์ฟเวอร์} bos.close (); stream.close (); {E.PrintStackTrace ();}จุดที่สอง: ใช้ไฟล์อัปโหลดบนหน้า JSP
แพ็คเกจ com.vogoal.util; นำเข้า java.io.bufferedoutputstream; นำเข้า java.io.file; นำเข้า java.io.fileoutputstream นำเข้า java.io.ioexception; นำเข้า Java.text.simpledateformat; นำเข้า Java.util.arraylist; javax.servlet.servletInputStream; นำเข้า Javax.servlet.http.httpservletRequest; คลาสสาธารณะ jspfileupload {/** คำขอวัตถุ*/ส่วนตัว httpservletrequest คำขอ = null; 1024*8;/** hashtable ที่เก็บพารามิเตอร์*/hashtable ส่วนตัว paramht = new Hasptable ();/** arraylist ที่เก็บชื่อไฟล์ของไฟล์ที่อัปโหลด*/arraylist updertilearr = new ArrayList ();/*** ตั้งค่าวัตถุคำขอ ** @param Request* HttpservletRequest คำขอวัตถุ*/โมฆะสาธารณะ setRequest (คำขอ httpservletRequest) {this.request = คำขอ;}/*** ตั้งค่าพา ธ การอัปโหลดไฟล์ * * @Param Path * เส้นทางการอัปโหลดของไฟล์ที่ระบุโดยผู้ใช้ */โมฆะสาธารณะ setuploadPath (เส้นทางสตริง) {this.uploadPath = path;}/*** โปรแกรมหลักสำหรับการประมวลผลการอัปโหลดไฟล์ �����BB * * @return int ผลการดำเนินการ 0 การดำเนินการไฟล์สำเร็จ 1 คำขอวัตถุไม่มีอยู่ 2 เส้นทางการบันทึกไฟล์ไม่ได้ตั้งค่าหรือพา ธ การบันทึกไฟล์ไม่ถูกต้อง 3* ไม่ได้ตั้งค่า Enctype ที่ถูกต้อง 4 การดำเนินการไฟล์ผิดปกติ */กระบวนการ int สาธารณะ () {สถานะ int = 0; // ก่อนที่จะอัปโหลดไฟล์ตรวจสอบวัตถุคำขอ, อัปโหลดพา ธ และ Enctype สถานะ = preCheck (); // ส่งคืนรหัสข้อผิดพลาดเมื่อเกิดข้อผิดพลาด if (สถานะ! = 0) สถานะส่งคืน; ลอง {// ��พารามิเตอร์หรือชื่อไฟล์�U��STRING NAME = NULL; // ค่าพารามิเตอร์ valuestring value = null; // ไม่ว่าจะเป็นสตรีมการอ่านเป็นไฟล์บิต FLAG BOOLEAN FILEFLAG = FALSE; // ไฟล์ที่จะเก็บไว้ ไฟล์ tmpfile = null; // ชื่อของสตริงไฟล์ที่อัปโหลด fname = null; fileOutputStream baos = null; bufferedOuttutStream bos = null; // ��hashtableParamht = new Hashtable (updfileArr �get ContentTypestring ContentType = request.getContentType (); int index = contentType.indexof ("ขอบเขต ="); ขอบเขตสตริง = "-" + contentType.substring (ดัชนี + 9); สตริง endboundary = ขอบเขต + "-"; // ServletInputStream sis = request.getInputStream (); // อ่าน 1 บรรทัดในขณะที่ ((rtnpos = sis.readline (buffs, 0, buffs.length))! = -1) {string strbuff = สตริงใหม่ (buffs, 0, rtnpos); name.trim (). ความยาว ()> 0) {ถ้า (fileflag) {bos.flush (); baos.close (); bos.close (); baos = null; bos = null; updfilearr.add (fname); {al = (arraylist) obj;} al.add (value); system.out.println (ค่า); paramht.put (ชื่อ, al);}} name = สตริงใหม่ (); ค่า = สตริงใหม่ (); fileflag = false; fname = สตริงใหม่ (); rtnpos = sis.readline {strbuff = สตริงใหม่ (buffs, 0, rtnpos); if (strbuff.toLowercase (). startswith ("เนื้อหา-การกระจาย: form-data;"))) {int nindex = strbuff.toLowerCase () ดัชนี ("name =" "); 6); name = strbuff.substring (nindex + 6, nlastindex);} int findex = strbuff.toLowercase (). indexof ("filename =/" "); ถ้า (findex! = -1) {fileflag = true; int flastindex = strbuff.tolowercase strbuff.substring (findex + 10, flastindex); fname = getFilename (fname); ถ้า (fname == null || fname.trim (). length () == 0) {fileflag = false; sis.readline (buffs, 0, buffs.length); sis.readline (buffs, 0, buffs.length); sis.readline (buffs, 0, buffs.length); buffs.length); sis.readline (buffs, 0, buffs.length);}}} else ถ้า (strbuff.startswith (endboundary)) {ถ้า (ชื่อ! = null && name.trim () ความยาว ()> 0) {ถ้า (fileflag) null; updfilearr.add (fname);} else {object obj = paramht.get (ชื่อ); arraylist al = arraylist ใหม่ (); ถ้า (obj! = null) {al = (arraylist) obj;} al.add (ค่า); && bos == null) {tmpfile = ไฟล์ใหม่ (uploadpath + fname); baos = ใหม่ fileOutputStream (tmpfile); bos = ใหม่ bufferedOutputStream (baos);} bos.write (buffs, 0, rtnpos); baos.flush () strbuff); value = value + strbuff;}}}} catch (ioexception e) {status = 4;} สถานะการส่งคืน;} private int precheck () {int errcode = 0; ถ้า (ขอ == null) กลับ 1; if (uploadPath == null || uploadPath.Trim (). ความยาว () == 0) return 2; else {ไฟล์ tmpf = ไฟล์ใหม่ (uploadpath); ถ้า (! tmpf.exists ()) ส่งคืน 2;} สตริง contentType = request.getContentType () ชื่อ) {ค่าสตริง = "" ถ้า (name == null || name.trim (). length () == 0) ค่าส่งคืน; value = (paramht.get (ชื่อ) == null)? "" :( สตริง) (arraylist) paramht.get (ชื่อ)) name.trim (). ความยาว () == 0) ส่งคืน null; if (paramht.get (ชื่อ) == null) return null; arraylist al = (arraylist) paramht.get (ชื่อ); string [] strarr = สตริงใหม่ [al.size (); สำหรับ (int i = 0; int getUpdFilesize () {return updfilearr.size ();} สตริงสาธารณะ [] getUpdFileNames () {string [] strarr = สตริงใหม่ [updfilearr.size ()]; สำหรับ (int i = 0; getFilename (อินพุตสตริง) {int findex = input.AlastIndexof ("//"); ถ้า (findex == -1) {findex = input.lastindexof ("/"); ถ้า (findex == -1) {return input;}} อินพุต = input.substring (findex + 1) input.indexof ("."); วันที่ dt = วันที่ใหม่ (); simpledateFormat sdf = new SimpledateFormat ("yyyymmddhhmmssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss2. อ้างอิงคลาส Java ในหน้า JSP:
<%@page import = "com.vogoal.util.jspfileupload"%> <%// เริ่มต้น jspfileupload jfu = new jspfileupload (); // ตั้งค่าวัตถุคำขอ jfu.setRequest (คำขอ); // ตั้งค่าไฟล์ที่อัปโหลด jfu.process (); // รับค่าของพารามิเตอร์การควบคุมอินพุตอื่น ๆ ในฟอร์มสตริงชื่อผู้ใช้ = jfu.getParameter ("ชื่อผู้ใช้"); // หากมีการควบคุมอินพุตหลายตัวสำหรับพารามิเตอร์เดียวกันให้ส่งคืนสตริงอาร์เรย์ [] usernameArr = jfu.getParameters jfu.getUpdFileNames (); // รับจำนวนไฟล์ที่อัปโหลดวิธีนี้เป็น filenumber int ที่ไร้ประโยชน์บิต = jfu.getUpdFilesize (); // ต่อไปนี้เป็นรหัสเอาต์พุตสำหรับการทดสอบ // out.println ("พารามิเตอร์:" + ชื่อผู้ใช้); // out.println ("ขนาดพารามิเตอร์:" + usernamearr.length); // out.println ("ขนาด filearr:" + filearr.length); // ถ้า (filearr.length> 0)จุดที่สาม: struts2 ใช้การอัปโหลดและดาวน์โหลดไฟล์
ขั้นตอนที่ 1: เพิ่ม Commons-Fileupload -1.2.1.jar และ Commons-io-1.3.2.jar ภายใต้ web-inf/lib ไฟล์ทั้งสองนี้สามารถดาวน์โหลดได้จาก http://commons.apache.org/
ขั้นตอนที่ 2: ตั้งค่า Enctype ของตารางฟอร์มเป็น: "Multipart/Form-Data" ดังนี้:
รหัส Java
การอัปโหลดคลาสสาธารณะ {ไฟล์ส่วนตัวอัปโหลด // ไฟล์สตริงส่วนตัว uploadimageContentType; // ประเภทไฟล์สตริงส่วนตัว uploadimagefilename; // ชื่อไฟล์สตริงส่วนตัว bookname; // หนังสือชื่อหนังสือสตริงส่วนตัว; // ผู้เขียนสตริงส่วนตัวบันทึก; // ไฟล์บันทึกตำแหน่ง // แอตทริบิวต์ -หมายเหตุ: โดเมนไฟล์ในแบบฟอร์มสอดคล้องกับคุณสมบัติสามประการในการดำเนินการคือชื่อไฟล์และประเภทไฟล์ การตั้งชื่อได้รับการแก้ไข ชื่อไฟล์จะต้องเหมือนกับชื่อโดเมนไฟล์ในแบบฟอร์ม (UploadImage) ชื่อไฟล์คือ: file + filename และประเภทไฟล์: ไฟล์ + contentType
ขั้นตอนที่ 4: กำหนดค่าการดำเนินการอัปโหลดของเราเป็น struts.xml
รหัส Java
<action name = "upload"> <param name = "savepath">/uploadfile </param> <results> /success.jsp </result> </action>
หมายเหตุ: ในการระบุไดเรกทอรีบันทึกของไฟล์ที่อัปโหลดบนเซิร์ฟเวอร์คุณต้องกำหนดตัวแปร SavePath ในการอัปโหลดและเพิ่มวิธีการที่สอดคล้องกันและวิธีการ getter ให้กับมันเพื่อให้ struts2 สามารถกำหนดค่า /uploadfile ให้กับแอตทริบิวต์บันทึก
ประเภทการกรองไฟล์การกำหนดค่าด้วยตนเอง
<param name = "levertypes"> image/bmp, image/png, image/gif, image/jpeg </param>
ขีด จำกัด ขนาดไฟล์การกำหนดค่าด้วยตนเอง
<param name = "maximumsize"> 1048576 </param>
ใช้ File Upload Interceptor ของ Struts2 เพื่อใช้การกรองไฟล์
struts2 จัดเตรียมไฟล์ upload interceptor - fileupload โดยการกำหนดค่าการสกัดกั้นนี้การกรองไฟล์ที่อัปโหลดสามารถทำได้อย่างง่ายดาย
เมื่อกำหนดค่า fileupload interceptor คุณสามารถระบุพารามิเตอร์สองตัวสำหรับมัน:
อนุญาตให้ใช้: ระบุประเภทไฟล์ที่ได้รับอนุญาตให้อัปโหลดคั่นด้วยเครื่องหมายจุลภาคภาษาอังกฤษ (,)
สูงสุด: ระบุขนาดไฟล์ที่อนุญาตให้อัปโหลดเป็นไบต์
เคล็ดลับ: โดยการกำหนดค่า FileUpload Interceptor คุณสามารถใช้การกรองไฟล์ได้อย่างง่ายดาย เมื่อการกรองไฟล์ล้มเหลวระบบจะถ่ายโอนไปยังมุมมองเชิงตรรกะอินพุตโดยอัตโนมัติ ดังนั้นมุมมองเชิงตรรกะที่ชื่ออินพุตจะต้องได้รับการกำหนดค่าสำหรับการดำเนินการ นอกจากนี้การอ้างอิง Interceptor ของ DefaultStack จะต้องกำหนดค่าสำหรับการกระทำ
ใช้ interceptor ของ Struts2 เพื่อใช้การกำหนดค่าการกรองไฟล์ดังนี้:
<action name = "UploadFileAction"> <interceptor-ref name = "defaultStack"> <!-กำหนดค่าประเภทไฟล์ที่อนุญาตให้อัปโหลดโดยคั่นด้วยหลาย ๆ โดยใช้ ","-> <param name = "fileupload.allowedTypes" image/bmp, image/png, image/gif <!-กำหนดค่าขนาดไฟล์ที่อนุญาตให้อัปโหลดหน่วยไบต์ตัวอย่างนี้คือ: 1mb-> <param name = "fileupload.maximumsize"> 1048576 </param> </interceptor-ref> <results name = "input">/jsp/oneFileFileUpload.jsp <
เมื่อผู้ใช้ไม่สามารถอัปโหลดได้มีข้อความแจ้งเตือนบางอย่าง ใน struts2 ให้ใช้แท็ก <s: fielderror/> เพื่อส่งข้อความแสดงข้อผิดพลาดไปยังหน้า
หมายเหตุ: หากคุณต้องการใช้ข้อมูลพรอมต์ข้อผิดพลาดของ Struts2 คลาสการกระทำที่อัปโหลดไฟล์จะต้องสืบทอดการกระทำที่มีการสนับสนุนมิฉะนั้น struts2 จะไม่ให้ฟังก์ชันข้อมูลพรอมต์ข้อผิดพลาดของเอาต์พุต
เราสามารถกำหนดค่าไฟล์ทรัพยากร (.properties) เพื่อบันทึกเอาต์พุตข้อมูลไปยังผู้ใช้
struts.messages.eror.file.too.large: เมื่อขนาดไฟล์อัปโหลดเกินค่าที่ตั้งไว้ struts2 จะส่งออกข้อมูลพรอมต์ที่สอดคล้องกับคีย์
struts.messages.error.content.type.not.lowed: เมื่อประเภทไฟล์ที่อัปโหลดไม่ตรงกับค่าที่ตั้งไว้ Struts2 จะส่งออกข้อมูลพรอมต์ที่สอดคล้องกับคีย์
struts.messages.error.uploading: เมื่อเกิดข้อผิดพลาดที่ไม่รู้จักเกิดขึ้นเมื่ออัปโหลดไฟล์ struts2 จะส่งออกข้อมูลพรอมต์ที่สอดคล้องกับคีย์
นอกจากนี้เรายังต้องกำหนดค่าไฟล์ทรัพยากรลงในไฟล์ struts.xml ต่อไปเราต้องดูไฟล์ทรัพยากรของเรา มันมีภาษาจีนแล้ว เราต้องแปลงแล้วกำหนดค่าเป็นโครงการ
ตั้งค่าไฟล์ทรัพยากรใน struts.xml:
<constant name = "struts.custom.i18n.resources" value = "messages"/> หรือ <constant name = "struts.custom.i18n.resources" value = "messages_zh_cn"/>
ใช้คำสั่ง native2ascii d: /messages.properties d: /messages_zh_cn.properties เพื่อแปลงไฟล์ทรัพยากรต้นฉบับเป็นไฟล์ที่รองรับ
หมายเหตุ: Keep International ชื่อคำต่อท้ายของไฟล์ทรัพยากรคือ: *_ZH_CN + ส่วนขยายไฟล์
หลักการของการอัปโหลดหลายไฟล์นั้นเหมือนกับด้านบน แต่ควรสังเกตว่าชื่อแอตทริบิวต์ชื่อของฟิลด์ไฟล์หลายไฟล์จะต้องเหมือนกันและในการดำเนินการไฟล์ [] หรือรายการ <file> ควรใช้เพื่อรับ
โดยส่วนตัวฉันคิดว่าการใช้วิธีนี้เพื่ออัปโหลดหลายไฟล์ไม่ใช่
ดีมาก.
struts2 สำหรับการดาวน์โหลดไฟล์
Struts2 จัดเตรียมประเภทผลลัพธ์สตรีมซึ่งใช้โดยเฉพาะเพื่อรองรับการดาวน์โหลดไฟล์ เมื่อระบุประเภทผลลัพธ์สตรีมพารามิเตอร์อินพุตชื่อจะต้องกำหนดค่าซึ่งระบุสตรีมอินพุตซึ่งเป็นทางเข้าสู่ไฟล์ที่ดาวน์โหลด (นั่นคือไฟล์สามารถดาวน์โหลดได้ในสตรีมผ่านรายการนี้)
ใช้การดำเนินการดาวน์โหลดไฟล์
Public Class FileDownAction ใช้การดำเนินการ {// ค่าคุณสมบัตินี้ระบุไว้ในไฟล์การกำหนดค่า Struts2 จะฉีดโดยอัตโนมัติ (เช่นกำหนดค่า) คุณต้องจัดเตรียมเมธอด setter และ getter สตริง private string inputPath; // ระบุเส้นทางที่สมบูรณ์ของไฟล์ที่จะดาวน์โหลด (ชื่อพา ธ + ชื่อไฟล์)/ * คลาสแอ็คชั่นที่ใช้การดาวน์โหลดควรให้วิธีการส่งคืนอินสแตนซ์อินพุต ค่าคุณสมบัติ inputName ที่สอดคล้องกันใน <ผลลัพธ์ ... // public inputStream getTargetFile () พ่นข้อยกเว้น {return servletActionContext.getServletContext (). getResourceasstream (inputPath); } // วิธีการดำเนินการที่จัดการคำขอของผู้ใช้ซึ่งส่งคืนสตริงความสำเร็จสตริงสาธารณะ execute () โยนข้อยกเว้น {return "ความสำเร็จ"; -การกำหนดค่าการกระทำที่สอดคล้องกันในไฟล์ struts.xml
<action name = "ดาวน์โหลด"> <!-ระบุตำแหน่งของทรัพยากรที่ดาวน์โหลด-> <param name = "inputPath">/uploadfile/demo.txt </param> <!-กำหนดค่าประเภทผลลัพธ์เป็นสตรีม-> <name result = "success" type = "Stream"> <! name = "inputName"> targetFile </param> <!-ระบุวิธีการดาวน์โหลดของไฟล์ที่ดาวน์โหลดและชื่อไฟล์ที่บันทึกไว้ในเวลาที่ดาวน์โหลด ชื่อไฟล์เมื่อบันทึกไฟล์ต้องมีส่วนขยายและส่วนขยายระบุไอคอนของประเภทดาวน์โหลด-> <param name = "contentDisposition"> ไฟล์แนบ; filename = struts2.txt </param> <!-ระบุขนาดบัฟเฟอร์ของไฟล์ที่ดาวน์โหลด
ด้านบนเป็นโซลูชั่นสามประการสำหรับการใช้งานการอัปโหลดและดาวน์โหลดไฟล์ใน Java ที่แนะนำโดยบรรณาธิการ ฉันหวังว่ามันจะเป็นประโยชน์กับคุณ หากคุณมีคำถามใด ๆ โปรดฝากข้อความถึงฉันและบรรณาธิการจะตอบกลับคุณทันเวลา ขอบคุณมากสำหรับการสนับสนุนเว็บไซต์ Wulin.com!