โดยทั่วไปมีสองวิธีในการอัปโหลดภาพ หนึ่งคือการเขียนไฟล์ภาพลงในฐานข้อมูลและอีกอันคือการจัดเก็บไว้ในไดเรกทอรีไฟล์เซิร์ฟเวอร์ ไฟล์รูปภาพที่เขียนไปยังฐานข้อมูลจำเป็นต้องได้รับการแปลงเป็นรูปแบบสตรีมไบนารีการครอบครองพื้นที่ฐานข้อมูลและเหมาะสำหรับการจัดเก็บภาพจำนวนน้อย ตัวอย่างเช่นไอคอนขนาดเล็กบางตัวในระบบมีข้อได้เปรียบในการเขียนลงในฐานข้อมูลว่าพวกเขาค่อนข้างปลอดภัยและไม่ถูกลบโดยผู้ใช้โดยไม่ได้ตั้งใจ
หากคุณเก็บภาพจำนวนมากมักจะทำเพื่อบันทึกลงในโฟลเดอร์บนเซิร์ฟเวอร์ มีหลายวิธีในการอัปโหลดเสร็จสิ้นคุณสามารถใช้วิธีการสตรีมและวิธี FTP และใช้วิธีการ FilePload ที่นี่
ด้วยขนาดของระบบที่แตกต่างกันวิธีการประมวลผลของไฟล์ภาพก็แตกต่างกันเช่นกัน หากจำนวนรูปภาพในระบบไม่ใหญ่เพียงเก็บรูปภาพทั้งหมดไว้ในไดเรกทอรีเดียวกัน หากรูปภาพสะสมมากขึ้นคุณสามารถจำแนกและจัดเก็บรูปภาพตามการจำแนกประเภทวัสดุซึ่งจะประหยัดเวลาในการค้นหาไฟล์บนดิสก์
เมื่ออัปโหลดรูปภาพไปยังไฟล์คุณสามารถอัปโหลดรูปภาพโดยตรงไปยังไดเรกทอรีคุณยังสามารถเขียนชื่อไฟล์ภาพและพา ธ ไฟล์ไปยังฐานข้อมูลหรือคุณสามารถสร้างเส้นทางไฟล์ในโปรแกรมได้ หาก บริษัท ต้องการรูปภาพที่จะเก็บไว้บนเซิร์ฟเวอร์พิเศษคุณควรเขียนพา ธ ไฟล์ไปยังไฟล์เต็ม โดยทั่วไปจะง่ายต่อการประมวลผลหากวัสดุ (วัสดุ) สอดคล้องกับรูปภาพ หากสอดคล้องกับรูปภาพหลายภาพจะต้องใช้ร่วมกับการรีไซเคิล ในอีกด้านหนึ่งมีความจำเป็นต้องประมวลผลการแสดงแบบไดนามิกของรูปภาพและในทางกลับกันจำเป็นต้องตรวจสอบว่าการตั้งชื่อของไฟล์รูปภาพนั้นซ้ำกันหรือไม่ นอกจากนี้เมื่อประมวลผลภาพ (การอัปโหลดการลบและการแก้ไข) คุณต้องร่วมมือกับธุรกรรม
ต่อไปนี้เป็นคำแนะนำสำคัญเกี่ยวกับการใช้งานขั้นพื้นฐานที่สุดของการใช้ FilePload เพื่อให้ได้อัพโหลดรูปภาพ
1. ใช้แท็กไฟล์ที่ปลายด้านหน้า:
<input name = "filename" type = "file" class = "text1" size = "40" maxLength = "40">
2. ตั้งค่ารูปแบบ Enctype ของไฟล์: Multipart/Form-Data
<form name = "itemform" target = "_ self" id = "itemform" method = "post" action = "servlet/item/fileuploadservlet" enctype = "multipart/form-data">
คำแนะนำเกี่ยวกับ enctype = "multipart/form-data":
หากรูปแบบนี้ใช้ใน JSP servlet ที่เกี่ยวข้องไม่สามารถใช้ request.getParameter () เพื่อรับพารามิเตอร์ คุณต้องใช้วิธีการ parserequest ของวัตถุ ServletFilePilePload เพื่อแยกวิเคราะห์ข้อมูลในวัตถุคำขอก่อนจากนั้นใช้การตั้งค่าสถานะ iSformfield ขององค์ประกอบที่แยกวิเคราะห์และร่วมมือกับวิธี getFieldName เพื่อรับข้อมูล
3. การใช้งาน fileuploadservlet:
แพ็คเกจ com.bjpowernode.drp.basedata.web; นำเข้า Java.io.File; นำเข้า java.io.ioException; นำเข้า java.util.iterator; นำเข้า java.util.list; นำเข้า javax.servlet.servletexception; นำเข้า Javax.servlet.http.httpservlet; นำเข้า javax.servlet.http.httpservletrequest; นำเข้า Javax.servlet.http.httpservletResponse; นำเข้า org.apache.Commons.FileUpload.FileItem; นำเข้า org.apache.commons.fileupload.disk.diskfileitemfactory; นำเข้า org.apache.commons.fileupload.servlet.servletFileUpload; นำเข้า com.bjpowernode.drp.baseddata.manager.itemmanager; นำเข้า com.bjpowernode.drp.baseddata.manager.itemmanagerimpl; นำเข้า com.bjpowernode.drp.util.applicationException; FilePloadServlet Public Class ขยาย AbstractItemServlet {ไฟล์ส่วนตัวอัพโหลด private; Temppath ไฟล์ส่วนตัว; @Override โมฆะสาธารณะ init () พ่น ServleTexception {// เมื่อระบบเริ่มต้นเริ่มการเริ่มต้น ในระหว่างการเริ่มต้นตรวจสอบว่าโฟลเดอร์ที่อัพโหลดรูปภาพและโฟลเดอร์ที่เก็บไฟล์ชั่วคราวไว้หรือไม่ หากไม่มีอยู่ให้สร้าง // รับพา ธ ทางกายภาพจริงที่สอดคล้องกับไดเรกทอรีรูท uploadPath = ไฟล์ใหม่ (getServletContext (). getRealPath ("อัปโหลด")); System.out.println ("UploadPath ====" + UploadPath); // ถ้าไดเรกทอรีไม่มีอยู่ถ้า (! uploadPath.exists ()) {// สร้างไดเรกทอรี uploadPath.mkdir (); } // ไดเรกทอรีชั่วคราว // ไฟล์ tempfile = ไฟล์ใหม่ (item.getName ()) สร้าง temppath วัตถุชั่วคราว = ไฟล์ใหม่ (getServletContext (). getRealPath ("temp")); if (! temppath.exists ()) {temppath.mkdir (); } // หากวิธีการคลาสแม่ไม่ปรากฏขึ้นจะไม่มีอินสแตนซ์ itemManager ซึ่งจะทำให้ตัวชี้ null super.init (); } โมฆะสาธารณะ DOGET (คำขอ httpservletRequest, การตอบสนอง httpservletResponse) พ่น servletexception, ioexception {dopost (คำขอ, การตอบสนอง); } โมฆะสาธารณะ dopost (คำขอ httpservletrequest, httpservletResponse การตอบสนอง) พ่น servletexception, ioexception {// รับข้อมูลจาก item_upload.jsp เนื่องจากรูปแบบการเข้ารหัสของหน้าเว็บที่ใช้งานไม่สามารถใช้งานได้ req.getParameter () // string itemno = req.getParameter ("itemno"); //system.out.println("itemno======= " + itemno); /******************************************* ใช้ส่วนประกอบ fileupload เพื่อแยกวิเคราะห์แบบฟอร์ม *************************** // diskfileitemfactory: สร้างโรงงานสำหรับวัตถุ FileItem ในคลาสโรงงานนี้คุณสามารถกำหนดค่าขนาดบัฟเฟอร์หน่วยความจำและไดเรกทอรีที่เก็บไฟล์ชั่วคราว โรงงาน DiskFileItemFactory = ใหม่ diskfileitemfactory (); // ขนาดสูงสุดที่จะถูกเก็บไว้ในโรงงานหน่วยความจำ SetsizEthreshold (4096); // ที่ตั้งสำหรับการบันทึกข้อมูลที่มีขนาดใหญ่กว่า GetSizethreshold () Factory.setRepository (Temppath); // servletFileUpload: รับผิดชอบในการประมวลผลข้อมูลไฟล์ที่อัปโหลดและห่อหุ้มแต่ละส่วนของข้อมูลลงในวัตถุ FileItem // เมื่อได้รับข้อมูลไฟล์ที่อัปโหลดเนื้อหาจะถูกบันทึกลงในแคชหน่วยความจำ หากเนื้อหาไฟล์เกินขนาดของบัฟเฟอร์ที่ระบุโดย DiskFileItemFactory // ไฟล์จะถูกบันทึกลงในดิสก์และเก็บไว้เป็นไฟล์ชั่วคราวในไดเรกทอรีที่ระบุของ DiskFileItemFactory // หลังจากได้รับข้อมูลไฟล์ ServletUpload จะเขียนข้อมูลจากไฟล์ลงในไฟล์ในไดเรกทอรีไฟล์ที่อัปโหลด ServletFileUpload อัปโหลด = ใหม่ servletFilePilePilePload (โรงงาน); // ขนาดสูงสุดก่อนที่ fileuploadexception จะถูกโยนอัปโหลด SetsizeMax (1000000 * 20); / ***************** การแยกวิเคราะห์ข้อมูลที่ส่งผ่านโดยแบบฟอร์มและส่งคืนรายการข้อมูลประเภทข้อมูล: fileItem *****************/ ลอง {รายการ fileItems = upload.parserequest (คำขอ); สตริง itemno = ""; // iterator iter = fileItems.iterator () ใช้ iterator //iter.hasnext () ตรวจสอบว่ามีองค์ประกอบในลำดับสำหรับ (iterator iter = fileitems.iterator (); iter.hasnext ();) {// รับองค์ประกอบถัดไป // ตัดสินว่าเป็นข้อมูลไฟล์หรือข้อความ // เป็นฟิลด์อินพุตแบบฟอร์มทั่วไปถ้า (item.isformfield ()) {ถ้า ("itemno" .equals (item.getfieldName ())) {itemno = item.getString (); }} // เป็นฟิลด์อินพุตถ้า (! item.isformfield ()) {// ชื่อและเส้นทางเต็มของไฟล์สตริงไฟล์ที่อัปโหลดชื่อ = item.getName (); ขนาดยาว = item.getSize (); // พิจารณาว่าไฟล์ถูกเลือกถ้า ((filename == null || filename.equals ("")) && size == 0) {ดำเนินการต่อ; } // สกัดกั้นสตริงเช่น: c: /windows/debug/passwd.log filename = filename.substring (filename.lastindexof ("//") + 1, filename.length ()); // บันทึกไฟล์บนดิสก์ฟิสิคัลของเซิร์ฟเวอร์: พารามิเตอร์แรกคือ: พา ธ แบบเต็ม (ไม่รวมชื่อไฟล์) พารามิเตอร์ที่สองคือ: ชื่อไฟล์ //item.write(file); // แก้ไขชื่อไฟล์และชื่อวัสดุเหมือนกันและส่วนขยายไฟล์ถูกบังคับให้เป็น gif //item.write( ใหม่ไฟล์ (UploadPath, itemno + ".gif")); // บันทึกไฟล์ไปยังไดเรกทอรีโดยไม่ต้องแก้ไขรายการชื่อไฟล์เขียน (ไฟล์ใหม่ (uploadPath, ชื่อไฟล์)); // เขียนชื่อไฟล์รูปภาพไปยังฐานข้อมูล itemManager.uploadItemimage (itemno, ชื่อไฟล์); }} response.sendredirect (request.getContextPath () + "/servlet/item/searchitemservlet"); } catch (exception e) {e.printstacktrace (); โยน ApplicationException ใหม่ ("อัปโหลดล้มเหลว!"); - คลาสนี้สืบทอด AbstractItemServlet: คลาสแม่ที่เป็นนามธรรมของ Servlets วัสดุทั้งหมดซึ่งรับผิดชอบในการสร้างอินสแตนซ์ itemManager
/** * คลาสแม่ที่เป็นนามธรรมของ Servlets วัสดุทั้งหมดมีหน้าที่ในการสร้างอินสแตนซ์ itemManager * @author limin * */คลาสนามธรรมนามธรรม AbstractItemServlet ขยาย httpservlet {// แม้ว่ามันจะไม่ปลอดภัยหากเป็นแบบอ่านอย่างเดียว @Override โมฆะสาธารณะ init () พ่น servletexception {itemManager = ใหม่ itemManagerImpl ()}}ItemManagerImpl เป็นคลาสย่อยที่ใช้อินเตอร์เฟส itemManager มีปัญหาอย่างหนึ่งเกี่ยวกับรูปแบบการออกแบบนี้ซึ่งมีการเพิ่มประสิทธิภาพเงินเดือน แต่ที่นี่เราจะไม่กล่าวคำพูดที่ไม่เกี่ยวข้องใด ๆ เพื่ออธิบายการอัปโหลดรูปภาพ
สรุป:
เกี่ยวกับวิธีการเริ่มต้น () การเริ่มต้น:
เมื่อ servlet เริ่มต้นไดเรกทอรีจะถูกสร้างขึ้นแบบไดนามิก นี่คือการอัปโหลดและไฟล์ชั่วคราว temppath ไปยังโครงการและไดเรกทอรีภายใต้ webapps ของ Tomcat
เป็นที่น่าสังเกตว่าต้องมีการเรียกวิธี super.init () ที่นี่ (Super ไม่ใช่การอ้างอิงถึงวัตถุคลาสแม่ แต่รับผิดชอบการเรียกใช้วิธีการคลาสแม่) มิฉะนั้นอาจทำให้ตัวชี้โมฆะไปยังชั้นเรียน
การอัปโหลดจะดำเนินการประมาณสามขั้นตอน: ใช้องค์ประกอบ fileupload เพื่อแยกวิเคราะห์แบบฟอร์ม; แยกวิเคราะห์ข้อมูลที่ส่งผ่านโดยแบบฟอร์มและส่งคืนรายการข้อมูลการรวบรวมรายการ: fileitem; ในที่สุดก็อัปโหลดภาพ
ใช้เมธอด isformfield () ของ FileItem เพื่อตรวจสอบว่าเป็นข้อความปกติหรือไฟล์
ใช้ fileitem.write (ไฟล์ใหม่ (uploadpath, ชื่อไฟล์)) เพื่ออัปโหลดไฟล์ พารามิเตอร์แรกคือ: เส้นทางเต็ม (ไม่รวมชื่อไฟล์) พารามิเตอร์ที่สองคือ: ชื่อไฟล์;
การประมวลผลข้อมูลข้อความปกติ:
if ("itemno" .equals (item.getFieldName ())) {itemno = item.getString (); -การอัปโหลดเป็นเทคโนโลยีที่ค่อนข้างครบกำหนดเป็นเวลาหลายปีและมีแพคเกจมากมายที่เราสามารถใช้โดยตรงในโครงการประจำวันของเรา แต่การเข้าใจหลักการพื้นฐานบางอย่างเป็นสิ่งจำเป็น
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น