บทความนี้เปรียบเทียบตัวอย่างการอัปโหลดไฟล์สองไฟล์เพื่อช่วยให้ทุกคนเรียนรู้ฟังก์ชั่นอัปโหลดไฟล์ Java ได้ดีขึ้น เนื้อหาเฉพาะมีดังนี้
1. รหัสอัปโหลด Java Attachment
@ControllerPublic คลาส UploadFile ขยาย BaseJsonController {/** * ไฟล์แนบอัปโหลด * * @param คำขอ * @param creativeFile * @param การตอบสนอง * @return */@requestmapping (value = "/upload/uploadfile.json") 1. เพื่อให้แน่ใจว่าความปลอดภัยของเซิร์ฟเวอร์ควรวางไฟล์ที่อัปโหลดไว้ในไดเรกทอรีที่ไม่สามารถเข้าถึงได้โดยตรงจากโลกภายนอกเช่นในไดเรกทอรี Web-Inf * 2. เพื่อป้องกันการเขียนทับไฟล์ต้องสร้างชื่อไฟล์ที่ไม่ซ้ำกันสำหรับการอัปโหลดไฟล์ * 3. เพื่อป้องกันไม่ให้ไฟล์มากเกินไปปรากฏภายใต้ไดเรกทอรีคุณต้องใช้อัลกอริทึมแฮชเพื่อแยกพื้นที่เก็บข้อมูล * 4. ค่าสูงสุดของไฟล์ที่อัปโหลดควรมี จำกัด * 5. หากต้องการ จำกัด ประเภทของไฟล์ที่อัปโหลดเมื่อได้รับชื่อไฟล์ที่อัปโหลดให้พิจารณาว่าชื่อต่อท้ายนั้นถูกกฎหมายหรือไม่ */// รับไดเรกทอรีบันทึกไฟล์ที่อัปโหลดจัดเก็บไฟล์ที่อัปโหลดไว้ในไดเรกทอรี Web-Inf และไม่อนุญาตให้เข้าถึงโดยตรงจากโลกภายนอกเพื่อให้แน่ใจว่าความปลอดภัยของสตริงไฟล์ที่อัปโหลด SAVETPATH = request.getSession (). getServletContext (). getRealAthAth ( // ไดเรกทอรีการบันทึกไฟล์ชั่วคราวที่สร้างขึ้นระหว่างการอัปโหลดสตริง temppath = request.getSession (). getServletContext (). getRealPath ("/web-inf/temp"); ไฟล์ tmpfile = ไฟล์ใหม่ (temppath); if (! tmpfile.exists ()) {// สร้างไดเรกทอรีชั่วคราว tmpfile.mkdirs (); } // ข้อความแจ้ง jsonarray arr = new jsonarray (); แผนที่ <สตริงวัตถุ> แผนที่ = null; inputStream ใน = null; fileOutputStream out = null; ลอง {// ใช้องค์ประกอบอัปโหลดไฟล์ Apache เพื่อจัดการขั้นตอนการอัปโหลดไฟล์: // 1 สร้างโรงงาน diskfileitemfactory diskfileitemfactory โรงงาน = ใหม่ diskfileitemfactory (); // ตั้งค่าขนาดของบัฟเฟอร์ของโรงงาน เมื่อขนาดไฟล์ที่อัปโหลดเกินขนาดของบัฟเฟอร์ไฟล์ชั่วคราวจะถูกสร้างและเก็บไว้ในไดเรกทอรีชั่วคราวที่ระบุ Factory.SetSizEthreshold (1024*100); // ตั้งค่าขนาดบัฟเฟอร์เป็น 100KB หากไม่ได้ระบุขนาดบัฟเฟอร์คือ 10KB ตามค่าเริ่มต้น // ตั้งค่าไดเรกทอรีที่เก็บข้อมูลของไฟล์ชั่วคราวที่สร้างขึ้นระหว่างการอัปโหลดโรงงาน SetRepository (TMPFile); // 2. สร้างไฟล์อัปโหลด parser servletFileUpload upload = ใหม่ servletFileUpload (โรงงาน); // supert ไฟล์อัปโหลดความคืบหน้าการอัปโหลด SetProgressListener (ใหม่ progressionListener () {การอัปเดตโมฆะสาธารณะ (ยาว pbytesread, ยาว pcontentlength, int arg2) {system.out.println ("ขนาดไฟล์คือ:" + pcontentlength + " // แก้การอัปโหลดที่อ่านไม่ออกภาษาจีน Setheaderencoding ("UTF-8"); // 3. ตรวจสอบว่าข้อมูลที่ส่งเป็นข้อมูลของแบบฟอร์มการอัปโหลดหรือไม่หาก (! ServletFileUpload.ismultipartContent (คำขอ)) {// รับข้อมูลคืนข้อมูลตามวิธีดั้งเดิม } // ตั้งค่าขนาดสูงสุดของไฟล์เดียวที่อัปโหลดซึ่งปัจจุบันตั้งค่าเป็น 1024*1024 ไบต์นั่นคือ 20MB upload.SetFilesizEmax (1024*1024*20); // ตั้งค่าสูงสุดของจำนวนไฟล์ที่อัปโหลดทั้งหมด ค่าสูงสุด = ผลรวมของขนาดสูงสุดของหลายไฟล์ที่อัปโหลดในเวลาเดียวกัน ปัจจุบันตั้งค่าเป็น 40MB upload.SetSizemax (1024*1024*40); // 4. ใช้ตัวแยกวิเคราะห์ servletFileUpload เพื่อแยกวิเคราะห์ข้อมูลที่อัปโหลด ผลลัพธ์การแยกวิเคราะห์ส่งคืนรายการ <fileitem> รายการคอลเลกชัน FileItem แต่ละรายการสอดคล้องกับรายการอินพุตของแบบฟอร์มแบบฟอร์ม @SuppressWarnings ("ไม่ได้ตรวจสอบ") รายการ <"fileItem> list = upload.parserequest (คำขอ); สำหรับ (FileItem item: list) {// ถ้าข้อมูลของรายการอินพุตทั่วไปถูกห่อหุ้มใน fileItem ถ้า (item.isformfield ()) {string name = item.getFieldName (); // แก้ปัญหาที่อ่านไม่ออกภาษาจีนของข้อมูลของรายการอินพุตทั่วไปค่าสตริง = item.getString ("UTF-8"); // value = สตริงใหม่ (value.getBytes ("ISO8859-1"), "UTF-8"); System.out.println (ชื่อ + "=" + ค่า); } else {// ถ้ารายการไฟล์ถูกห่อหุ้มในไฟล์ที่อัปโหลด // รับชื่อไฟล์ที่อัปโหลดชื่อสตริง filename = item.getName (); if (filename == null || filename.trim (). เท่ากับ ("")) {ดำเนินการต่อ; } // หมายเหตุ: ชื่อไฟล์ที่ส่งโดยเบราว์เซอร์ต่าง ๆ จะแตกต่างกัน เบราว์เซอร์บางตัวส่งชื่อไฟล์ที่มีพา ธ เช่น: C: /a/b/1.txt ในขณะที่บางชื่อเป็นเพียงชื่อไฟล์ง่าย ๆ เช่น: 1.txt // ประมวลผลส่วนพา ธ ของชื่อไฟล์ของไฟล์ที่ได้รับที่ได้รับเพียงส่วนชื่อไฟล์เท่านั้น // รับส่วนขยายของสตริงไฟล์ที่อัปโหลด fileextName = filename.substring (filename.lastindexof (".")+1); // หากคุณต้องการ จำกัด ประเภทไฟล์ที่อัปโหลดคุณสามารถใช้นามสกุลไฟล์เพื่อตรวจสอบว่าประเภทไฟล์ที่อัปโหลดนั้นถูกกฎหมายหรือไม่ (StringUtils.equals (fileextname, "rar") || stringutils.equals (fileextname, "zip")) } /*************** /// รับสตรีมอินพุตของไฟล์ที่อัปโหลดในรายการ = item.getInputStream (); /***************************************************************** // รับไฟล์บันทึกสตริงไดเรกทอรี realsavepath = makePath (savefilename, savepath); // สร้างสตรีมเอาต์พุตไฟล์ออก = ใหม่ fileOutputStream (RealSavePath + "//" + saveFiLEname); // สร้างบัฟเฟอร์บัฟเฟอร์บัฟเฟอร์ [] = ไบต์ใหม่ [1024]; // การระบุว่าข้อมูลในสตรีมอินพุตได้รับการอ่านเป็น int len = 0; // ลูปอ่านกระแสอินพุตลงในบัฟเฟอร์ (len = in.read (บัฟเฟอร์))> 0 หมายความว่ายังมีข้อมูลอยู่ในขณะที่ ((len = in.read (บัฟเฟอร์))> 0) {// ใช้สตรีมเอาต์พุต fileOutputStream เพื่อเขียนข้อมูลบัฟเฟอร์ } // ปิดสตรีมอินพุต in.close (); // ปิดสตรีมเอาต์พุตออก close (); // ลบไฟล์ชั่วคราวที่สร้างขึ้นเมื่อประมวลผลไฟล์อัปโหลด item.delete (); map = new hashmap <string, object> (); map.put ("savefilename", savefilename); map.put ("RealSavePath", RealSavePath); arr.add (แผนที่); }} returnsuccessjson ("uploadbase.filesizeLimitexceedeDexception e) {e.printstacktrace (); returnfailjson (e.getMessage ()," ไฟล์เดียวเกินค่าสูงสุด !!! ", การตอบสนอง); returnfailjson (E.getMessage (), "ขนาดทั้งหมดของไฟล์ที่อัปโหลดเกินขีด จำกัด สูงสุด!", การตอบสนอง); in.close (); // ปิดสตรีมเอาท์พุทออกไป (); @return uuid + "_" + ชื่อเดิมของไฟล์ */สตริงส่วนตัว makefileName (ชื่อไฟล์สตริง) {//2.jpg // เพื่อป้องกันไม่ให้มีการเขียนทับไฟล์ชื่อไฟล์ที่ไม่ซ้ำกันจะต้องถูกสร้างขึ้นสำหรับการอัปโหลดไฟล์ return uuid.randomuuid () tostring () + "_" } / ** * เพื่อป้องกันไม่ให้ไฟล์มากเกินไปที่ปรากฏในไดเรกทอรีคุณต้องใช้อัลกอริทึมแฮชเพื่อแยกพื้นที่เก็บข้อมูล * @Method: MakePath * @Description: * @anthor: Xuwentao * * @param ชื่อไฟล์สตริง savepath) {// รับค่า hashcode ของชื่อไฟล์และสิ่งที่คุณได้รับคือที่อยู่ของชื่อไฟล์สตริงวัตถุในหน่วยความจำ int hashcode = filename.hashCode (); int dir1 = hashcode & 0xf; // 0--15 int dir2 = (hashcode & 0xf0) >> 4; // 0-15 // สร้างสตริงไดเรกทอรีบันทึกใหม่ DIR = savepath + "//" + dir1 + "//" + dir2; // อัปโหลด/2/3 อัปโหลด/3/5 // ไฟล์สามารถแสดงทั้งไฟล์และไดเรกทอรีไฟล์ไฟล์ = ไฟล์ใหม่ (DIR); // ถ้าไดเรกทอรีไม่มีอยู่ถ้า (! file.exists ()) {// สร้าง directory file.mkdirs (); } return dir; -2. Java อัปโหลดรหัสเรซูเม่
/ ***อัปโหลดประวัติย่อ*การสร้างไฟล์ 1 ไฟล์ล้มเหลว 2-Exception 3-upload ล้มเหลว 4 ไฟล์ไม่ได้รับ 5 ไฟล์ไม่ได้ลบคำอัพโหลด 6-please, excel, ppt, ไฟล์ pdf*//*ตัวคั่นพา ธ : ใช้ในระบบปฏิบัติการ / ** * อัปโหลดไฟล์ * * @param fileio * @param oldcontracturl * @param Request * @return return address ไฟล์ (ที่อยู่สัมพัทธ์, ที่อยู่ที่ไม่ใช่ absolute) */ @Override String การอัปโหลดสาธารณะ // ลบไฟล์และโฟลเดอร์ถ้า (oldContractUrl! = null) {String oldDirectory = oldContracturl.substring (5, oldContracturl.AlastIndexof (file_separator)); ไฟล์ไฟล์ = ไฟล์ใหม่ (uploadurl + oldDirectory); ธงบูลีน = deletedir (ไฟล์); if (! flag) {logger.error ("การลบไฟล์เก่าล้มเหลว"); กลับ "5"; }} // อัปโหลดไฟล์เรซูเม่ใหม่ Long Now = System.currentTimeMillis (); uploadurl = uploadurl + file_separator + now + file_separator; String resumename = ""; if (! fileio.isEmpty ()) {resumename = stringUtils.deletewhitespace (fileio.getoriginalfilename ()); // ตัดสินไฟล์คำต่อท้าย/*สตริงคำต่อท้าย = resumename.substring (resumename.lastindexof ("."), resumename.length ()) .toLowerCase (); if (! ". doc" .Equals (คำต่อท้าย) &&! ". docx" .equals (คำต่อท้าย) &&! ". xlsx" .Equals (คำต่อท้าย) &&! ". xlsx". เท่า equals (คำต่อท้าย) &&! "ppt". logger.error ("ไม่ใช่คำ, excel, ppt, ไฟล์ pdf"); กลับ "6"; }*/} else {logger.error ("ไฟล์ไม่ได้รับ"); กลับ "4"; } ไฟล์ dir = ไฟล์ใหม่ (uploadurl); if (! dir.exists ()) {dir.mkdirs (); } ไฟล์ targetFile = ไฟล์ใหม่ (uploadurl + resumename); if (! targetFile.exists ()) {ลอง {targetFile.CreatenewFile (); } catch (ioexception e) {logger.error ("การสร้างไฟล์ล้มเหลว", e); กลับ "1"; }} ลอง {fileio.transferto (TargetFile); } catch (unglegalStateException e) {logger.error ("ข้อยกเว้นประโยค", e); กลับ "2"; } catch (ioexception e) {logger.error ("อัปโหลดล้มเหลว", e); กลับ "3"; } ส่งคืน file_separator + "ไฟล์" + file_separator + now + file_separator + resumename; } /*** ลบไฟล์ทั้งหมดซ้ำในไดเรกทอรีและไฟล์ทั้งหมดในไดเรกทอรีย่อย* @param dir ไดเรกทอรีไฟล์ที่จะถูกลบ* @return บูลีนส่งคืน "จริง" หากการลบทั้งหมดสำเร็จ * หากการลบล้มเหลววิธีการหยุดพยายาม * ลบและส่งคืน "เท็จ" */ บูลีนสาธารณะ deletedir (ไฟล์ dir) {ถ้า (dir.isdirectory ()) {string [] children = dir.list (); // ลบไดเรกทอรีย่อยซ้ำในไดเรกทอรีสำหรับ (int i = 0; i <children.length; i ++) {ความสำเร็จของบูลีน = deletedir (ไฟล์ใหม่ (dir, เด็ก [i])); if (! ความสำเร็จ) {return false; }}} // ไดเรกทอรีว่างเปล่าในเวลานี้คุณสามารถลบ return dir.delete (); -ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและเชี่ยวชาญทักษะการอัปโหลดไฟล์ Java