หากคุณต้องการอัปโหลดไฟล์ผ่านเซิร์ฟเวอร์คุณกำลังอัปโหลดไฟล์โลคัลของเราไปยังเซิร์ฟเวอร์ทรัพยากร วิธีที่ดีกว่าคือการอัปโหลดผ่าน FTP สิ่งนี้ถูกอัปโหลดร่วมกับ SpringMVC+FTP ก่อนอื่นเราต้องเข้าใจวิธีกำหนดค่า SpringMVC จากนั้นกำหนดค่า FTP และในที่สุดก็อัปโหลดไฟล์ร่วมกับ MultipartFile
การอัปโหลด SpringMVC ต้องใช้แพ็คเกจขวดคีย์หลายแพ็คเกจสปริงและแพ็คเกจที่เกี่ยวข้องสามารถกำหนดค่าได้ด้วยตัวเอง ที่นี่เราอธิบายแพ็คเกจโถกุญแจเป็นหลัก
1: Spring-Web-3.2.9.release.jar (แพ็คเกจคีย์ขวดของฤดูใบไม้ผลิคุณสามารถเลือกเวอร์ชันด้วยตัวเอง)
2: Commons-io-2.2.jar (แพ็คเกจเครื่องมือบางอย่างที่ใช้ในการจัดการ IO ในโครงการ)
ไฟล์กำหนดค่า
SpringMVC ใช้ MultipArtFile เพื่ออัปโหลดไฟล์ดังนั้นเราจำเป็นต้องกำหนดค่า MultipartResolver เพื่อจัดการไฟล์ในแบบฟอร์ม
<!-อัปโหลด File Interpreter-> <Bean ID = "MultipArtResolver"> <property name = "DefaultEncoding" value = "UTF-8" /> <property name = "MaxUploadSize" value = "10485760" />
คุณลักษณะมีการอธิบายอย่างละเอียด:
DefaultEncoding กำหนดค่ารูปแบบการเข้ารหัสของคำขอ, ค่าเริ่มต้น ISO-8859-1
หน่วยสูงสุดของไฟล์กำหนดค่า maxuploadsize ในไบต์
MaxinMemorySize กำหนดค่าแคชของไฟล์ที่อัปโหลดในไบต์
คุณสมบัติ Resolvelazily ถูกเปิดใช้งานเพื่อชะลอการแก้ไขปัญหาไฟล์เพื่อให้สามารถจับข้อยกเว้นขนาดไฟล์ได้ในการอัปโหลดแอคชั่น
การกำหนดค่าหน้า
เพิ่ม enctype = "multipart/form-data" ในรูปแบบของหน้า
<form id = "" name = "" method = "post" action = "" enctype = "multipart/form-data">
ตั้งค่า Enctype = "Multipart/Form-Data" ในแท็กฟอร์มเพื่อให้แน่ใจว่าการเข้ารหัสไฟล์ที่ถูกอัปโหลดแบบไม่ระบุชื่อที่ถูกต้อง
มันคือการเข้ารหัส MIME ของแบบฟอร์ม โดยค่าเริ่มต้นรูปแบบการเข้ารหัสนี้คือแอปพลิเคชัน/x-www-form-urlencoded ซึ่งไม่สามารถใช้สำหรับการอัปโหลดไฟล์ โดยการใช้ข้อมูลไฟล์แบบหลายส่วน/ฟอร์มสามารถส่งผ่านอย่างเต็มที่และดำเนินการต่อไปนี้ Enctype = "Multipart/Form-Data" คือการอัปโหลดข้อมูลไบนารี ค่าอินพุตในแบบฟอร์มจะถูกส่งผ่านด้วยวิธี 2 หลักดังนั้นคำขอไม่สามารถรับค่าได้
เขียนคลาสควบคุมอัปโหลดคลาส
เขียนวิธีการอัปโหลดและไม่มีผลลัพธ์ที่ได้ที่นี่ หากคุณต้องการข้ามไปที่หน้าหรือส่งคืนค่าอื่น ๆ คุณสามารถเปลี่ยนโมฆะเป็นสตริงแมป <สตริงวัตถุ> และค่าอื่น ๆ จากนั้นกลับไปกลับเพื่อส่งคืนผลลัพธ์
/** * อัปโหลด * @param Request * @return */@ResponseBody @RequestMapping (value = "/upload", method = {requestMethod.get, requestMethod.post}) การอัปโหลดโมฆะสาธารณะ multipartFile file = multipartrequest.getFile ("ไฟล์"); // ไฟล์เป็นชื่อชื่อของสตริงอินพุตหน้า basepath = "path ไฟล์" ลอง {multipartresolver resolver = new CommonsMultipArtresolver (request.getSession () if (Resolver.ismultipart (คำขอ)) {String filestoredPath = "เส้นทางโฟลเดอร์"; // การสุ่มชื่อไฟล์ชื่อสตริง randomName = stringUtil.getRandomFileName (); String uploadFileName = file.getoriginalfilename (); if (stringutils.isnotblank (uploadfileName)) {// สกัดกั้นรูปแบบไฟล์ชื่อสตริงคำต่อท้าย = uploadfilename.substring (uploadfilename.indexof (".")); // ประกอบสตริงชื่อไฟล์ใหม่ newFileName = randomName + คำต่อท้าย; String savepath = basepath + "/" + newfilename; ไฟล์ saveFile = ไฟล์ใหม่ (บันทึก); ไฟล์ parentFile = savefile.getParentFile (); if (savefile.exists ()) {savefile.delete (); } else {ถ้า (! parentfile.exists ()) {parentfile.mkdirs (); }} // คัดลอกไฟล์ไปยัง path path fileutils.copyInputStreamTofile (file.getInputStream (), saveFile); // อัปโหลดไฟล์ไปยังเซิร์ฟเวอร์ ftpclientutil.upload (savefile, filestoredpath); }}} catch (exception e) {e.printstacktrace (); - เครื่องมืออัปโหลดไคลเอนต์ FTP
แพ็คเกจ com.yuananding.common.util; นำเข้า Java.io.File; นำเข้า Java.io.FileInputStream; นำเข้า Java.io.FileOutputStream; นำเข้า java.io.ioException; นำเข้า Java.io.InputStream; นำเข้า Java.io.OutputStream; นำเข้า java.net.socketexception; นำเข้า java.util.hashmap; นำเข้า java.util.map; นำเข้า java.util.properties; นำเข้า org.apache.commons.lang.stringutils; นำเข้า org.apache.commons.net.ftp.ftp; นำเข้า org.apache.commons.net.ftp.ftpclient; นำเข้า org.apache.commons.net.ftp.ftpreply; นำเข้า org.slf4j.logger; นำเข้า org.slf4j.loggerfactory; / *** เครื่องมือไคลเอนต์ ftp*/ คลาสสาธารณะคลาส ftpclientutil {/ *** log*/ ส่วนตัว logger logger สุดท้ายคงที่ = loggerFactory.getLogger (ftpClientutil.class); / ** * การกำหนดค่าเซิร์ฟเวอร์ FTP-คีย์ IP ค่าคือประเภทของสตริง */ สตริงสุดท้ายคงที่ server_ip = "server_ip"; / ** * การกำหนดค่าเซิร์ฟเวอร์ FTP-คีย์พอร์ตค่าคือประเภทของจำนวนเต็ม */ สตริงสุดท้ายคงที่ Server_port = "Server_port"; / ** * การกำหนดค่าเซิร์ฟเวอร์ FTP-บันทึกย่อในคีย์ในคีย์ค่าคือประเภทของบูลีน */ สตริงสุดท้ายคงที่สาธารณะ is_anonymous = "is_anonymous"; / ** * ชื่อผู้ใช้ของการเข้าสู่ระบบที่ไม่ระบุชื่อ */ สตริงสุดท้ายคงที่สาธารณะ anonymous_user_name = "anonymous"; / ** * รหัสผ่านของการเข้าสู่ระบบที่ไม่ระบุชื่อ */ สตริงสุดท้ายคงที่สาธารณะ anonymous_password = ""; / ** * การกำหนดค่าเซิร์ฟเวอร์ FTP-ล็อกในชื่อผู้ใช้ค่าคือประเภทของสตริง */ สตริงสุดท้ายคงที่สาธารณะ user_name = "user_name"; / ** * การกำหนดค่าเซิร์ฟเวอร์ FTP-ล็อกในรหัสผ่านค่าคือประเภทของสตริง */ รหัสผ่านสตริงสุดท้ายคงที่สาธารณะ = "รหัสผ่าน"; / ** * การกำหนดค่าเซิร์ฟเวอร์ FTP-คีย์ PASV ค่าคือประเภทของบูลีน */ สตริงสุดท้ายคงที่สาธารณะ IS_PASV = "IS_PASV"; /** * การกำหนดค่าเซิร์ฟเวอร์ FTP-คีย์ไดเรกทอรีการทำงานค่าคือประเภทของสตริงในขณะที่เข้าสู่ระบบไดเรกทอรีปัจจุบัน * เป็นไดเรกทอรีโฮมโฮมของผู้ใช้ต้องตั้งค่าการทำงานของไดเรกทอรี นอกจากนี้ยังไม่สามารถสร้างไดเรกทอรีการทำงานได้แล้วมันไม่สามารถสร้างได้โดยอัตโนมัติ หากไม่มีอยู่ไฟล์จะถูกอัปโหลดในไดเรกทอรีโฮมไดเรกทอรีของผู้ใช้ หากไม่ได้รับมอบหมาย * ใช้ "/" */ สตริงสุดท้ายคงที่สาธารณะ working_directory = "working_directory"; แผนที่สาธารณะคงที่ <สตริง, Object> Servercfg = ใหม่ HashMap <String, Object> (); คุณสมบัติคงที่ Static {logger.info ("เริ่มโหลดไฟล์ ftp.properties!"); prop = คุณสมบัติใหม่ (); ลอง {inputStream fps = ftpClientutil.class.getResourceasstream ("/ftp.properties"); prop.load (fps); fps.close (); } catch (exception e) {logger.error ("ข้อยกเว้นอ่านไฟล์ ftp.properties!", e); } servercfg.put (ftpclientutil.server_ip, ค่า ("server_ip")); servercfg.put (ftpclientutil.server_port, integer.parseint (ค่า ("server_port"))); servercfg.put (ftpclientutil.user_name, ค่า ("user_name")); Servercfg.put (ftpclientutil.password, ค่า ("รหัสผ่าน")); logger.info (string.valueof (servercfg)); } /*** อัปโหลดไฟล์ไปยังเซิร์ฟเวอร์ FTP * * @Param ServerCFG: การกำหนดค่าเซิร์ฟเวอร์ FTP * @param filepathtoupload: พา ธ ของไฟล์เพื่ออัปโหลด * @param filestoredName: ชื่อที่จะให้ไฟล์ที่เก็บไว้ระยะไกล, null, "" และคำว่างอื่น ๆ FilePathToupload, String FileStoredName) พ่น SocketException, iOException {upload (ServerCFG, ไฟล์ใหม่ (FilePathToupload), FileStoredName); } /*** อัปโหลดไฟล์ไปยังเซิร์ฟเวอร์ FTP * * @Param ServerCFG: การกำหนดค่าเซิร์ฟเวอร์ FTP * @param fileToupload: ไฟล์เพื่ออัปโหลด * @param filestoredName: ชื่อที่จะให้ไฟล์ที่เก็บไว้ระยะไกล, null, "" และคำอื่น ๆ ที่ว่าง String FilestoredName) พ่น SocketException, iOexception {ถ้า (! fileToupload.exists ()) {โยน unlegalargumentException ใหม่ ("ไฟล์เพื่ออัปโหลดไม่ได้มีอยู่:" + fileToupload.getAbsolutePath ()); } if (! fileToupload.isfile ()) {โยน unlegalargumentException ใหม่ ("ไฟล์เพื่ออัปโหลดไม่ใช่ไฟล์:" + filetoupload.getabsolutepath ()); } if (stringUtils.isblank ((สตริง) servercfg.get (server_ip))) {โยน unleglargumentException ใหม่ ("Server_ip ต้องอยู่ในการกำหนดค่าเซิร์ฟเวอร์ FTP"); } TransferFile (True, ServerCFG, FileToupload, FileStoredName, Null, NULL); } / ** * ดาวน์โหลดไฟล์จากเซิร์ฟเวอร์ ftp * * @param servercfg: การกำหนดค่าเซิร์ฟเวอร์ ftp * @param filenametodownload: ชื่อไฟล์ที่จะดาวน์โหลด * @param filestoredpath: path ที่เก็บไว้ของไฟล์ที่ดาวน์โหลดในท้องถิ่น FileStoredPath) พ่น SocketException, iOexception {ถ้า (stringutils.isblank (filenametodownload)) {โยน unlegalargumentException ใหม่ ("ชื่อไฟล์ที่จะดาวน์โหลดไม่สามารถว่างเปล่า"); } if (stringutils.isblank (filestoredPath)) {โยน unlegalargumentException ใหม่ ("เส้นทางที่เก็บไว้ของไฟล์ที่ดาวน์โหลดในท้องถิ่นไม่สามารถว่างเปล่า"); } if (stringUtils.isblank ((สตริง) servercfg.get (server_ip))) {โยน unleglargumentException ใหม่ ("Server_ip ต้องอยู่ในการกำหนดค่าเซิร์ฟเวอร์ FTP"); } TransferFile (FALSE, ServerCFG, NULL, NULL, FILENAMETODOWNLOAD, FileStoredPath); } โมฆะสุดท้ายคงที่แบบคงที่ transferfile (บูลีน isupload, แผนที่ <สตริง, Object> ServerCFG, ไฟล์ FileToupload, String ServerFileStoredName, String filenametodownload, สตริง localestoredPath) พ่น SocketException, iOException พอร์ตจำนวนเต็ม = (จำนวนเต็ม) Servercfg.get (server_port); บูลีน isanonymous = (บูลีน) เซิร์ฟเวอร์ cfg.get (is_anonymous); string username = (string) servercfg.get (user_name); String Password = (String) Servercfg.get (รหัสผ่าน); บูลีน ispasv = (บูลีน) เซิร์ฟเวอร์ cfg.get (is_pasv); String WorkingDirectory = (String) Servercfg.get (working_directory); ftpClient ftpClient = new ftpClient (); inputStream filein = null; outputStream fileout = null; ลอง {ถ้า (พอร์ต == null) {logger.debug ("เชื่อมต่อกับเซิร์ฟเวอร์ ftp บน" + โฮสต์ + ":" + ftp.default_port); ftpclient.connect (โฮสต์); } else {logger.debug ("เชื่อมต่อกับเซิร์ฟเวอร์ ftp บน" + host + ":" + พอร์ต); ftpclient.connect (โฮสต์, พอร์ต); } int reply = ftpClient.getReplyCode (); if (! ftpreply.ispositiveCompletion (ตอบกลับ)) {logger.error ("เซิร์ฟเวอร์ FTP ปฏิเสธการเชื่อมต่อ"); กลับ; } if (isanonymous! = null && isanonymous) {username = anonymous_user_name; รหัสผ่าน = Anonymous_Password; } logger.debug ("เข้าสู่ระบบเซิร์ฟเวอร์ ftp ด้วยชื่อผู้ใช้ =" + ชื่อผู้ใช้ + ", รหัสผ่าน =" + รหัสผ่าน); if (! ftpClient.login (ชื่อผู้ใช้รหัสผ่าน)) {logger.error ("ไม่สามารถเข้าสู่ระบบเซิร์ฟเวอร์ FTP ด้วยชื่อผู้ใช้ =" + ชื่อผู้ใช้ + ", รหัสผ่าน =" + รหัสผ่าน); ftpclient.logout (); กลับ; } // ที่นี่เราจะใช้โหมดไบนารีเป็นประเภทไฟล์ถ่ายโอนไม่รองรับโหมด ASCII logger.debug ("ตั้งค่าประเภทของไฟล์ซึ่งคือการอัปโหลดไปยังไบนารี"); ftpClient.setFileType (ftp.binary_file_type); if (ispasv! = null && ispasv) {logger.debug ("ใช้โหมด PASV เพื่อถ่ายโอนไฟล์"); ftpClient.EnterlocalPassiveMode (); } else {logger.debug ("ใช้โหมดที่ใช้งานอยู่เพื่อถ่ายโอนไฟล์"); ftpclient.enterlocalactiveMode (); } if (stringUtils.isblank (workingDirectory)) {workingDirectory = "/"; } logger.debug ("เปลี่ยนไดเรกทอรีการทำงานปัจจุบันเป็น" + WorkingDirectory); ChangeworkingDirectory (FTPClient, WorkingDirectory); if (isUpload) {// อัปโหลด if (stringUtils.isblank (ServerFileStoredName)) {ServerFileStoredName = fileToUpload.getName (); } filein = ใหม่ fileInputStream (fileToupload); logger.debug ("อัปโหลดไฟล์:" + filetoupload.getabsolutepath () + "ไปยังเซิร์ฟเวอร์ ftp พร้อมชื่อ:" + serverfilestoredName); if (! ftpClient.storeFile (ServerFileStoredName, filein)) {logger.error ("ไม่สามารถอัปโหลดไฟล์" + ftpClient.getReplyString ()); } else {logger.debug ("ประสบความสำเร็จในการอัปโหลดไฟล์"); }} else {// download // ตรวจสอบให้แน่ใจว่าไดเรกทอรีไฟล์มีอยู่ File Filestored = ไฟล์ใหม่ (localFilestoredPath); if (! filestored.getParentFile (). มีอยู่ ()) {filestored.getParentFile (). mkdirs (); } fileout = ใหม่ fileOutputStream (Filestored); logger.debug ("ดาวน์โหลดไฟล์:" + filenametodownload + "จากเซิร์ฟเวอร์ FTP ไปยัง local:" + localFilestoredPath); if (! ftpClient.retrieveFile (filenametodownload, fileout)) {logger.error ("ไม่สามารถดาวน์โหลดไฟล์" + ftpClient.getReplyString ()); } else {logger.debug ("ประสบความสำเร็จในการดาวน์โหลดไฟล์"); }} ftpClient.noop (); ftpclient.logout (); } ในที่สุด {if (ftpClient.isconnected ()) {ลอง {ftpClient.disconnect (); } catch (ioexception f) {}} ถ้า (filein! = null) {ลอง {filein.close (); } catch (ioexception e) {}} ถ้า (fileout! = null) {ลอง {fileout.close (); } catch (ioexception e) {}}} private private private boolean changeWorkingDirectory (ftpClient ftpClient, String WorkingDirectory) พ่น IOException {ถ้า (! ftpClient.changeWorkingDirectory (WorkingDirectory) สำหรับ (int i = 0; i <paths.length; i ++) {ถ้า (! "". เท่ากับ (พา ธ [i])) {ถ้า (! ftpClient.changeWorkingDirectory (พา ธ [i])) ftpclient.changeworkingDirectory (เส้นทาง [i]); }}} ส่งคืนจริง; } การอัพโหลดโมฆะสุดท้ายคงที่สาธารณะ (แผนที่ <สตริง, วัตถุ> Servercfg, String filepathtoupload, String FileStoredPath, String FileStoredName) พ่น SocketException, iOexception {upload (ServerCFG, ไฟล์ใหม่ } การอัพโหลดโมฆะสุดท้ายคงที่สาธารณะ (แผนที่ <สตริง, วัตถุ> Servercfg, ไฟล์ filetoupload, สตริง filestoredpath, สตริง filestoredName) พ่น SocketException, iOexception {ถ้า (filestoredPath! = null &&! " } อัปโหลด (ServerCFG, fileToupload, filestoredName); } การอัพโหลดโมฆะสุดท้ายคงที่สาธารณะ (String FilePathToupload, String FileStoredPath) พ่น SocketException, iOException {อัปโหลด (ServerCFG, FilePathToupload, FileStoredPath, ""); } การอัพโหลดโมฆะสุดท้ายคงที่สาธารณะ (ไฟล์ filetoupload, สตริง FilestoredPath) พ่น SocketException, iOexception {อัปโหลด (ServerCFG, FileToupload, FileStoredPath, ""); } ค่าสตริงคงที่สาธารณะ (คีย์สตริง) {ค่าสตริง = prop.getProperty (คีย์); if (value! = null) {ค่าส่งคืน; } else {return null; - ftp.properties
#Server ที่อยู่เซิร์ฟเวอร์ _ip = 192.168.1.1 #Server พอร์ต Server_port = 21 #Account ชื่อ user_name = userftp #รหัสผ่าน #รหัสผ่าน = passwordftp
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น