การอัปโหลดและดาวน์โหลดไฟล์เป็นเรื่องธรรมดามากในระหว่างการพัฒนา นี่คือสรุปสั้น ๆ :
1. เงื่อนไขที่ต้องปฏิบัติตามสำหรับการอัปโหลดไฟล์:
. วิธีการของแบบฟอร์มหน้าจะต้องโพสต์เนื่องจากข้อมูลที่ส่งโดย GET มีขนาดเล็กเกินไป
ข. Enctype ของแบบฟอร์มหน้าจะต้องเป็นประเภทหลายส่วน/ฟอร์ม-ข้อมูล
ค. แบบฟอร์มแสดงรายละเอียดของการอัปโหลดรหัสฟิลด์อินพุต: ในแบบฟอร์มไคลเอน
(หากคุณสมบัตินี้ไม่พร้อมใช้งานพา ธ ไฟล์ที่อ่านโดยเซิร์ฟเวอร์จะแตกต่างกันไปขึ้นอยู่กับเบราว์เซอร์)
เซิร์ฟเวอร์ servletInputStream คือ = request.getInputStream (); รับเนื้อหาของร่างกายในสตรีมเพื่อการวิเคราะห์เพิ่มเติม
2. รายละเอียดของการอัปโหลดไฟล์:
(1) ทำไมต้องตั้งค่าประเภทฟอร์มเป็น: multipart/form-data มันคือการตั้งค่าที่ส่งผ่านโดยแบบฟอร์มนี้ซึ่งไม่ใช่คีย์ = ค่า สิ่งที่ผ่านไปคือ bytecode
การติดต่อระหว่างแบบฟอร์มและคำขอ:
ดังที่แสดงไว้ด้านบนคุณจะเห็นว่าหลังจากตั้งค่าประเภทแบบฟอร์มเป็น: multipart/form-data ไฟล์ที่คุณเลือกจะเริ่มต้นเป็นไบนารีในตัวถังร้องขอ HTTP ดังที่แสดงในภาพด้านบนภายใต้สตริงสุ่มภายใต้คุกกี้
แต่โปรดทราบว่ามีอักขระพิเศษสองบรรทัดในไฟล์ bytecode หารด้วยไฟล์ประจำตัว (เช่นสตริงของสตริงสุ่ม) คือส่วนหัวบรรทัดแรกของไฟล์และบรรทัดของบรรทัดว่าง บรรทัดที่สามหลังจากนั้นคือเนื้อหาไฟล์ไบนารี
ดังนั้นเมื่อเซิร์ฟเวอร์ยอมรับไฟล์ที่อัปโหลดโดยไคลเอนต์เมื่อได้รับไฟล์ไบนารีในพารามิเตอร์คำขอ HTTP สามบรรทัดแรกจะต้องถูกลบออก
3. แยกวิเคราะห์ไฟล์ txt ที่อัปโหลดด้วยตนเอง:
นำเข้า java.io.bufferedreader; นำเข้า java.io.ioexception; นำเข้า java.io.inputstream; นำเข้า java.io.inputstreamreader; นำเข้า java.io.printwriter; นำเข้า Javax.servlet.servletexception; javax.servlet.http.httpservletrequest; นำเข้า Javax.servlet.http.httpservletResponse;/** * หากประเภทของแบบฟอร์มคือโพสต์และ Enctype เป็นแบบหลายส่วน/วันที่ * จากนั้นข้อมูลทั้งหมดจะถูกส่งผ่านไปยังเซิร์ฟเวอร์ในโหมดไบนารี * ดังนั้น req.getParameter ("xxx") เป็นโมฆะเสมอ * คุณสามารถรับข้อมูลผ่าน req.getInputStream () และรับข้อมูลของข้อความ * * @author Wangxi * */คลาสสาธารณะ Upservlet ขยาย Httpservlet {โมฆะสาธารณะ Dopost (Httpservletrequest req String txt = req.getParameter ("txt"); // return เป็น null system.err.println ("txt คือ:"+txt); System.err.println ("============================================="); inputstream ใน = req.getInputStream (); // byte [] b = byte ใหม่ [1024]; // int len = 0; // ในขณะที่ ((len = in.read (b))! =-1) {// สตริง s = สตริงใหม่ (b, 0, len); String firstLine = br.readline (); // อ่านบรรทัดแรกและบรรทัดแรกคือสัญลักษณ์ที่คั่นนั่นคือชื่อสตริงสตริงแบบสุ่ม = br.readline (); // ข้อมูลบรรทัดที่สองและสกัดกั้นชื่อไฟล์จากชื่อไฟล์ = filename.substring filename.substring (0, filename.length ()-1); if (data.equals (FirstLine+"-")) {break;} out.println (ข้อมูล); 4. ใช้ Apache-FileUpload เพื่อประมวลผลการอัปโหลดไฟล์:
เฟรมเวิร์ก: หมายถึงการห่อหุ้มธุรกิจที่ผู้ใช้มักจะประมวลผลในรหัส ทำให้ผู้ใช้โทรได้ง่าย
ส่วนประกอบ (เฟรม) ที่กำลังอัปโหลดไฟล์:
Apache--fileupload-
ORIALIY COS 2008 () -
jsp-smart-upload 200m
อัปโหลดไฟล์โดยใช้ fileupload:
ต้องมีการนำเข้าแพ็คเกจบุคคลที่สาม:
ไฟล์ Apache-fileupload.jar อัปโหลดแพ็คเกจหลัก
Apache-commons-io.jar แพ็คเกจนี้เป็นแพ็คเกจการพึ่งพาสำหรับ fileupload นอกจากนี้ยังเป็นชุดเครื่องมือ
หมวดหมู่หลัก:
DiskFileItemFactory ตั้งค่าพื้นที่ดิสก์และบันทึกไฟล์ชั่วคราว แค่ชั้นเรียน
ServletFileUpload - คลาสหลักสำหรับการอัปโหลดไฟล์ซึ่งได้รับการร้องขอและการแยกวิเคราะห์ reqeust
servletfileupload.parserequest (regedest) - รายการ <fileitem>
หมายเหตุ: FileItem เป็นจุดเริ่มต้นของโลโก้: -------- 243243242342 ถึง ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
ขั้นตอนที่ 1: นำเข้าแพ็คเกจ:
ขั้นตอนที่ 2: เขียน servlet เพื่อทำวิธี Dopost ให้เสร็จสมบูรณ์
/*** พารามิเตอร์สองตัวที่สร้างโดย DiskFileItemFactory* พารามิเตอร์แรก: SizetHreadhold - ตั้งค่าจำนวนไบต์ของข้อมูลที่จะบันทึกในแคช (หน่วยความจำ) ค่าเริ่มต้นคือ 10K* หากไฟล์ไม่เกิน 10K คุณสามารถใช้หน่วยความจำเพื่อบันทึกลงในไฟล์โดยตรง * หากไฟล์มากกว่า 10k คุณต้องบันทึกไฟล์ลงในไดเรกทอรีชั่วคราวก่อน * ไฟล์พารามิเตอร์ที่สองหมายถึงตำแหน่งไดเรกทอรีชั่วคราว * */คลาสสาธารณะ UP2Servlet ขยาย HTTPSERVLET {โมฆะสาธารณะ DOPOST (HTTPSERVLETREQUEST REQ, HTTPSERVLETRESSESSESS) โยน ServleTexception, iOexception // รับเส้นทางของ Project String Path = getServletContext (). getRealPath ("/up"); // ขั้นตอนแรกประกาศคลาสโรงงาน DiskFileItemFactory ซึ่งใช้ในการตั้งค่าไดเรกทอรีชั่วคราวบนดิสก์ดิสก์ DiskFileItemFactory = ใหม่ DiskFileItemFactory (1024*10 ไฟล์ใหม่ ("/home/wang/")); // ขั้นตอนที่สอง: ประกาศ servletFilePoLoad และรับไดเรกทอรีชั่วคราวด้านบน servletFilePilePload ขึ้น = ใหม่ servletFileUpload (ดิสก์); // ขั้นตอนที่สาม: คำขอแยกวิเคราะห์ลอง {list <fileItem> list = up.parserequest (req); // ถ้าไฟล์ไฟล์หนึ่งไฟล์เท่านั้น = list.get (0); // รับชื่อไฟล์ด้วย path string filename = file.getName (); filename = filename.substring (filename.lastindexof ("//")+1); // รับสตริงประเภทไฟล์ fileType = file.getContentType (); // รับข้อมูล bytecode inputStream ของไฟล์ใน = file.getInputStream (); // ประกาศเอาต์พุต BYTE Stream OutputStream OUT = ใหม่ fileOutputStream (พา ธ+"/"+ชื่อไฟล์); // ไฟล์คัดลอกไบต์ [] b = ไบต์ใหม่ [1024]; int len = 0; ในขณะที่ ((len = in.read (b))! =-1) {out.write (b, 0, len); } out.close (); ขนาดยาว = file.getInputStream (). มี (); // ลบไฟล์ไฟล์ชั่วคราวที่อัปโหลดไฟล์ delete (); // แสดงข้อมูล resp.setContentType ("text/html; charset = utf-8"); PrintWriter op = resp.getWriter (); op.print ("ไฟล์อัปโหลดสำเร็จ <br/> ชื่อไฟล์:"+ชื่อไฟล์); op.print ("<br/> ประเภทไฟล์:"+fileType); op.print ("<br/> ขนาดไฟล์ (ไบต์)"+ขนาด); } catch (exception e) {e.printstacktrace (); -5. ใช้เฟรมเวิร์กนี้เพื่ออัปโหลดหลายไฟล์:
ขั้นตอนที่ 1: แก้ไขรูปแบบของหน้าเป็นหลายประเภทอินพุต = "ไฟล์"
<form action = "<c: url value = '/up3servlet' //>" method = "post" enctype = "multipart/form-data"> file1: <อินพุต type = "file" name = "txt
ขั้นตอนที่ 2: รายการทราเวิร์ส
ชั้นเรียนสาธารณะ UP3Servlet ขยาย httpservlet {โมฆะสาธารณะ dopost (คำขอ httpservletrequest, การตอบสนอง httpservletResponse) พ่น servletexception, ioexception {request.setcharacterencoding ("UTF-8"); String path = getServletContext (). getRealPath ("/up"); // ประกาศดิสก์ดิสก์ diskfileitemfactory = ใหม่ diskfileitemfactory (); ดิสก์ Setsizethreshold (1024*1024); Disk.SetRepository (ไฟล์ใหม่ ("D:/A")); // ประกาศ servlet ที่แยกวิเคราะห์คำขอ servletfileupload up = servletfileupload ใหม่ (ดิสก์); ลอง {// แก้ไขรายการคำขอ <FileItem> list = up.parserequest (คำขอ); // ประกาศรายการ <apal> ห่อหุ้มข้อมูลของรายการไฟล์ที่อัปโหลด <แผนที่ <สตริงสตริง >> ups = arrayList ใหม่ <แผนที่ <สตริงสตริง >> (); สำหรับ (ไฟล์ fileItem: รายการ) {แผนที่ <สตริง, สตริง> mm = ใหม่ hashmap <สตริง, สตริง> (); // รับชื่อสตริงชื่อไฟล์ชื่อ filename = file.getName (); filename = filename.substring (filename.lastindexof ("//")+1); สตริง fileType = file.getContentType (); inputStream ใน = file.getInputStream (); ขนาด int = in.available (); // ใช้คลาสเครื่องมือ FileUtils.copyInputStreamTofile (ในไฟล์ใหม่ (path+"/"+ชื่อไฟล์)); mm.put ("ชื่อไฟล์", ชื่อไฟล์); mm.put ("fileType", fileType); mm.put ("size", "+size); ups.add (mm); file.delete ();}} setAttribute (" ups ", ups); // forward request.getRequestDispatcher ("/jsps/show.jsp ")ข้างต้นเป็นวิธีการทั่วไปของการอัปโหลดไฟล์ ตอนนี้ลองดูที่ APIs การค้นหาอื่น ๆ ของ FilePload
ตรวจสอบว่าไฟล์ FileItem เป็นไฟล์ (type = file) หรือข้อความ (type = text | text | ช่องทำเครื่องหมาย | วิทยุ) วัตถุ:
บูลีน iSformfield () ถ้าเป็นข้อความ | ช่องทำเครื่องหมาย | วิทยุ | เลือกค่านั้นเป็นจริง
6. ประมวลผลรูปภาพพร้อมข้อมูลคำอธิบาย
ระดับสาธารณะ updescservlet ขยาย httpservlet {โมฆะสาธารณะ dopost (httpservletrequest คำขอ, httpservletresponse การตอบสนอง) พ่น servletexception, ioexception {request.setcharacterencoding ("UTF-8"); // ดิสก์ diskfileitemfactory = ใหม่ diskfileitemfactory (); Disk.SetRepository (ไฟล์ใหม่ ("D:/A")); ลอง {servletFileUpload up = new servletFileUpload (ดิสก์); รายการ <fileItem> list = up.parserequest (คำขอ); สำหรับ (ไฟล์ fileItem: รายการ) {// ขั้นตอนที่ 1: พิจารณาว่าเป็นรายการแบบฟอร์มทั่วไปหรือไม่ถ้า (file.isformfield ()) {สตริง filename = file.getFieldName (); // <อินพุต type = "text" name = "desc"> = desc string value = file.getString ("UTF-8"); } else {// ระบุว่าเป็นไฟล์สตริงไฟล์ชื่อ filename = file.getName (); filename = filename.substring (filename.lastindexof ("//")+1); file.write (ไฟล์ใหม่ (path+"/"+ชื่อไฟล์)); System.err.println ("ชื่อไฟล์คือ:"+ชื่อไฟล์); System.err.println ("ขนาดไฟล์คือ:"+file.getSize ()); file.delete (); }}} catch (exception e) {e.printstacktrace (); - 7. ปรับปรุงประสิทธิภาพของการอัปโหลดไฟล์
เมื่อแยกวิเคราะห์คำขอเพื่อรับคอลเลกชัน FileItem ให้ใช้:
fileItemiterator it = up.getItemiterator (คำขอ);
เมื่อเทียบกับการใช้งาน
รายการ <fileItem> list = up.parserequest (คำขอ);
ประสิทธิภาพที่ดีขึ้นมาก
รหัสตัวอย่าง:
Fastservlet ระดับสาธารณะขยาย HTTPSERVLET {โมฆะสาธารณะ DOPOST (HTTPSERVLETREQUEST Request, HTTPSERVLETRESSESSENTESS) พ่น ServleTexception, iOException {request.Setcharacterencoding ("UTF-8"); String path = getServletContext (). getRealPath ("/up"); ดิสก์ diskfileitemfactory = ใหม่ diskfileitemfactory (); Disk.SetRepository (ไฟล์ใหม่ ("D:/A")); ลอง {servletFileUpload up = new servletFileUpload (ดิสก์); // ต่อไปนี้เป็นโหมด iterator filetemiterator it = up.getItemiterator (คำขอ); ในขณะที่ (it.hasnext ()) {fileItemstream item = it.next (); String filename = item.getName (); filename = filename.substring (filename.lastindexof ("//")+1); inputStream ใน = item.openstream (); fileutils.copyInputStreamTofile (ในไฟล์ใหม่ (path+"/"+ชื่อไฟล์)); }} catch (exception e) {e.printstacktrace (); - 8. ดาวน์โหลดไฟล์
สามารถรับหรือโพสต์ได้
โมฆะสาธารณะ dopost (httpservletrequest req, httpservletresponse resp) โยน servletexception, ioexception {req.setcharacterencoding ("UTF-8"); ชื่อสตริง = req.getParameter ("ชื่อ"); // ขั้นตอนที่ 1: ตั้งค่าประเภทการตอบสนอง resp.setContentType ("แอปพลิเคชัน/แรง-ลง"); // เส้นทางการอ่านไฟล์สตริงที่สอง = getServletContext (). getRealPath ("/up/"+ชื่อ); inputStream ใน = ใหม่ fileInputStream (พา ธ ); // ตั้งค่าส่วนหัวการตอบกลับ // USERT URL การเข้ารหัสชื่อไฟล์ = urlencoder.encode (ชื่อ, "UTF-8"); resp.setheader ("เนื้อหา-การจัดสรร", "สิ่งที่แนบมา; ชื่อไฟล์ ="+ชื่อ); resp.setContentLength (in.available ()); // ขั้นตอนที่ 3: เริ่มการคัดลอกไฟล์ OutputStream OUT = resp.getOutputStream (); ไบต์ [] b = ไบต์ใหม่ [1024]; int len = 0; ในขณะที่ ((len = in.read (b))! =-1) {out.write (b, 0, len); } out.close (); in.close (); } เมื่อใช้กรอบความนิยม J2EEง่ายกว่าที่จะใช้การห่อหุ้มภายในของเฟรมเวิร์กเพื่อทำการอัปโหลดและดาวน์โหลดให้เสร็จสมบูรณ์:
struts2 ถูกอัปโหลด
เมื่อใช้ struts2 เพื่อการพัฒนามันไม่ยากที่จะพบว่าแพ็คเกจคอมมอนส์-fileupload -1.3.1.jar มีอยู่ในแพ็คเกจ JAR ที่นำเข้า ผ่านการเรียนรู้ข้างต้นเราสามารถใช้มันเพื่ออัปโหลดและดาวน์โหลดไฟล์ แต่ Struts2 กำลังอยู่ระหว่างการห่อหุ้มเพิ่มเติม
ดู
<form action = "fileupload.action" method = "post" enctype = "multipart/form-data"> ชื่อผู้ใช้: <อินพุต type = "text" name = "username"> <br> ไฟล์: <อินพุต type = "file" name = "ไฟล์"> <br> <
ผู้ควบคุม
FilePloadAction ระดับสาธารณะขยายการกระทำ asctupport {ชื่อผู้ใช้สตริงส่วนตัว; // โปรดทราบว่าไฟล์ไม่ได้อ้างถึงไฟล์ที่อัปโหลดโดย JSP front-end แต่ไฟล์ที่อัปโหลดไปยังเก็บไฟล์ไฟล์ส่วนตัวภายใต้โฟลเดอร์ชั่วคราว // ชื่อของไฟล์ที่ส่ง // struts จะสกัดกั้นชื่อของไฟล์สุดท้ายโดยอัตโนมัติและฉีดลงในคุณสมบัติสตริงส่วนตัวของไฟล์สตริงนี้ // getter และ setter จะถูกบันทึกในเวลานี้เพื่อบันทึก space @Override public String execute () พ่นข้อยกเว้น {// บันทึกพา ธ ไปยังสตริงไฟล์ที่อัปโหลด root = servletactionContext.getServletContext (). getRealPath ("/อัปโหลด"); // รับสตรีมการป้อนข้อมูลไฟล์ชั่วคราวอินพุต IS = ใหม่ FileInputStream (ไฟล์); // ไฟล์เอาต์พุต OutputStream OS = ใหม่ fileOutputStream (ไฟล์ใหม่ (root, fileFileName)); // พิมพ์ชื่อไฟล์ของ System.out.out.println ("fileFilename:" + fileFilename); // เนื่องจากไฟล์เป็นไฟล์ที่เก็บไว้ในโฟลเดอร์ชั่วคราวเราสามารถพิมพ์ชื่อไฟล์และพา ธ ไฟล์เพื่อดูว่ามันเหมือนกับไฟล์ fileFilename ก่อนหน้านี้. System.out.println ("ไฟล์:" + file.getPath ()); ไบต์ [] บัฟเฟอร์ = ไบต์ใหม่ [1024]; ความยาว int = 0; ในขณะที่ (-1! = (length = is.read (บัฟเฟอร์, 0, buffer.length))) {os.write (บัฟเฟอร์); } os.close (); is.close (); กลับมาประสบความสำเร็จ -ก่อนอื่นเราต้องชัดเจนว่าไฟล์ที่นี่ไม่ได้อ้างถึงไฟล์ที่อัปโหลดโดย JSP เมื่ออัปโหลดไฟล์ Struts2 จะค้นหาตำแหน่งที่เก็บข้อมูลที่ระบุโดย struts.multipart.savedir (นี่คือค่าเริ่มต้น properties) (ค่าเริ่มต้นว่างเปล่า) เราสามารถระบุตำแหน่งที่เก็บชั่วคราวนี้ใน struts2 ของโครงการของเรา
<constant name = "struts.multipart.savedir" value = "/repository"/> >>
หากไม่ได้ตั้งค่า struts.multipart.savedir ที่อยู่ที่ระบุโดย javax.servlet.context.tempdir จะถูกใช้โดยค่าเริ่มต้น ค่าของ javax.servlet.context.tempdir ถูกกำหนดโดยเซิร์ฟเวอร์ ตัวอย่างเช่น: หากบริบทของโครงการเว็บของฉันคือ ABC และเซิร์ฟเวอร์ใช้ Tomcat ดังนั้น SavePath ควรเป็น %tomcat_home %/work/catalina/localhost/abc_ ชื่อของไฟล์ชั่วคราวคล้ายกับ Upload__1a156008_1373a8615dd__8000_00000001.tmp ชื่อไฟล์ชั่วคราวอาจแตกต่างกันในแต่ละครั้ง แต่มันก็ประมาณในรูปแบบนี้ และถ้าคุณใช้เซิร์ฟเวอร์ใน Eclipse เพื่อกำหนดค่า Tomcat และเริ่มต้นแล้ว % Tomcat_home % ในที่อยู่ข้างต้นจะไม่เป็นไดเรกทอรีราก Tomcat จริงในระบบ แต่จะเป็นที่อยู่ที่ระบุโดย Eclipse ตัวอย่างเช่นที่อยู่ในพื้นที่ของฉันมีดังนี้: /home/wang/eclipsejavaCode/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/work/catalina/localhost/abc/upc/upc/upc/upc/upc/upc/upc/upload__1a156008
struts2 ดาวน์โหลดเสร็จแล้ว
ดาวน์โหลดไฟล์ struts2 เพียงแค่กำหนดสตรีมอินพุตและเขียนไฟล์ลงในสตรีมอินพุต การกำหนดค่าคีย์ยังคงกำหนดค่าในไฟล์การกำหนดค่า struts.xml:
Public Class FiledownloadAction ขยาย ActionsUpport {// พา ธ เพื่อดาวน์โหลดไฟล์บนเส้นทางสตริงส่วนตัวเซิร์ฟเวอร์ // ชื่อไฟล์ของไฟล์เพื่อดาวน์โหลดสตริงส่วนตัว downloadfilename; // เขียน getter และ setter public inputstream getdownloadfile () {return servletactionContext.getServletContext (). getResourceasstream (พา ธ ); } @Override String Public Execute () พ่นข้อยกเว้น {// การกระทำปัจจุบันคือ SetdownloadFilename (xxx); กลับมาประสบความสำเร็จ -การกระทำเพียงแค่กำหนดอินพุตสตรีมดาวน์โหลดไฟล์จากนั้นให้วิธีการ getter ถัดไปลองดูที่ไฟล์กำหนดค่าของ struts.xml:
<action name = "filedOwnload"> <result name = "download" type = "stream"> <param name = "contentDisposition"> ไฟล์แนบ; filename = "$ {downloadfilename}" </param> <param name = "inputName"> ดาวน์โหลดมีหลายสถานที่ที่เราต้องให้ความสนใจกับไฟล์การกำหนดค่า struts.xml ก่อนอื่นประเภทจะต้องกำหนดเป็นสตรีม type_ การบอกการกระทำนี้เป็นผลลัพธ์ของการดาวน์โหลดไฟล์ องค์ประกอบผลลัพธ์โดยทั่วไปจะมีองค์ประกอบย่อยของพารามิเตอร์ สิ่งนี้ใช้เพื่อตั้งค่าพารามิเตอร์เมื่อดาวน์โหลดไฟล์ แอตทริบิวต์ InputName คือการรับสตรีมการป้อนข้อมูลในการดำเนินการ ชื่อจะต้องเหมือนกับแอตทริบิวต์อินพุตสตรีมในการดำเนินการ จากนั้นแอตทริบิวต์ ContentDisposition โดยทั่วไปแล้วแอตทริบิวต์นี้จะใช้เพื่อระบุวิธีที่เราต้องการประมวลผลไฟล์ที่ดาวน์โหลด หากค่าเป็นไฟล์แนบกล่องดาวน์โหลดจะปรากฏขึ้นเพื่อให้ผู้ใช้สามารถเลือกได้ว่าจะดาวน์โหลดหรือไม่ หากไม่ได้ตั้งค่านี้เบราว์เซอร์จะตรวจสอบก่อนว่าจะเปิดไฟล์ที่ดาวน์โหลดมาก่อนหรือไม่ ถ้าทำได้มันจะเปิดไฟล์ที่ดาวน์โหลดโดยตรง (แน่นอนว่าไม่ใช่สิ่งที่เราต้องการ) ค่าอื่นคือชื่อไฟล์ซึ่งเป็นชื่อดาวน์โหลดไฟล์ที่ได้รับแจ้งจากไฟล์เมื่อดาวน์โหลด หลังจากกำหนดค่าข้อมูลนี้เราสามารถใช้ฟังก์ชั่นดาวน์โหลดไฟล์
SpringMVC เสร็จสิ้นการอัปโหลด:
มุมมองเหมือนกับตัวอย่าง struts2 สิ่งนี้ไม่ได้เขียน
คอนโทรลเลอร์:
@controller@requestmapping (value = "fileOperate") คลาสสาธารณะ FileOperateAction {@requestMapping (value = "upload") การอัปโหลดสตริงสาธารณะ (httpservletRequest Request,@requestparam ("ไฟล์") multipartFile photofile) request.getSession (). getServletContext (). getRealPath ("/")+"อัปโหลด"; // ชื่อสตริงชื่อไฟล์ต้นฉบับ = photofile.getoriginalfilename (); // รับสตริงนามสกุลไฟล์ extName = filename.substring (filename.lastindexof (".")); // ป้องกันชื่อไฟล์ที่ขัดแย้งกันแก้ไขชื่อ filename = filename.substring เล็กน้อย (0, filename.lastindexof ("."))) + system.nanotime () + extname; fileutils.writeByTeArrayTofile (ไฟล์ใหม่ (dir, ชื่อไฟล์), photofile.getBytes ()); กลับ "ความสำเร็จ"; -SpringMVC ดาวน์โหลดที่สมบูรณ์:
@RequestMapping ("/ดาวน์โหลด") การดาวน์โหลดสตริงสาธารณะ (ชื่อไฟล์สตริง, คำขอ httpservletRequest, การตอบสนอง httpservletResponse) {response.setcharacterencoding ("UTF-8"); Response.SetContentType ("Multipart/Form-Data"); Response.SetheAder ("เนื้อหา-การจัดสรร", "สิ่งที่แนบมา; ชื่อไฟล์ =" + ชื่อไฟล์); ลอง {inputStream inputStream = ใหม่ fileInputStream (ไฟล์ใหม่ (พา ธ ของไฟล์); outputStream OS = response.getOutputStream (); byte [] b = byte ใหม่ [2048]; ความยาว int; ในขณะที่ (ความยาว = inputStream.read (b))> 0) {os.write } catch (filenotfoundexception e) {e.printstacktrace ();ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น