إذا كنت بحاجة إلى تحميل الملفات عبر الخوادم ، فأنت تقوم بتحميل ملفاتنا المحلية إلى خادم الموارد. الطريقة الأفضل هي تحميلها من خلال 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 لمعالجة الملفات في النموذج
<!-تحميل مترجم الملف-> <bean id = "multipartresolver"> <property name = "defaultencoding" value = "utf-8" /> <property name = "maxuploadsize" value = "10485760"
تم شرح السمات بالتفصيل:
يقوم DefaultEncoding بتكوين تنسيق الترميز للطلب ، ISO-8859-1 الافتراضي
الحد الأقصى للوحدة من ملف تكوين maxuploadsize ، بالبايت
MaxinMemorysize يهيئ ذاكرة التخزين المؤقت للملفات التي تم تحميلها ، بالبايت
يتم تمكين خاصية sesolvelazily لتأخير دقة الملف بحيث يمكن اكتشاف استثناءات حجم الملف في عملية التحميل
تكوين الصفحة
أضف enctype = "multipart/form-data" إلى شكل الصفحة
<form id = "" name = "" method = "post" Action = "" enctype = "multipart/form-data">
قم بتعيين enctype = "multipart/form-data" في علامة النموذج لضمان الترميز الصحيح للملف الذي تم تحميله المجهول.
هذا هو ترميز MIME للنموذج. بشكل افتراضي ، فإن تنسيق الترميز هذا هو التطبيق/x-www-form-urlencoded ، والذي لا يمكن استخدامه لتحميل الملف ؛ فقط باستخدام multipart/form-data يمكن تمرير بيانات الملف بالكامل ويتم تنفيذ العمليات التالية. enctype = "multipart/form-data" هو تحميل البيانات الثنائية. يتم تمرير قيمة الإدخال في النموذج بطريقة من رقمين ، وبالتالي لا يمكن للطلب الحصول على القيمة.
اكتب فئة التحكم في التحميل
اكتب طريقة تحميل ، ولا توجد نتيجة يتم إرجاعها هنا. إذا كنت بحاجة إلى القفز إلى الصفحة أو إرجاع قيم أخرى ، فيمكنك تغيير الفراغ إلى السلسلة والخريطة <string و Object> وغيرها من القيم ، ثم العودة لإرجاع النتيجة.
/** * endload * @param request * @return */responseBodyReQuestMapping (value = "/upload" ، method = {requestMethod.get ، requestMethod.post}) تحميل الفراغ العام (httpservletrequest request) {multiparThtPledRequest ؛ multipartfile file = multipartrequest.getFile ("file") ؛ // الملف هو اسم اسم input string basepath = "file path" try {multipartresolver resolver = new commonsmultipartresolver (request.getSession (). if (resolver.ismultipart (request)) {String filestoredPath = "Folder Path" ؛ // اسم الملف الذي تم إنشاؤه العشوائي string randomname = stringUtil.getRandomFilename () ؛ سلسلة eploadFiLename = file.getoriginalfilename () ؛ if (stringUtils.isNotBlank (UploadFilename)) {// اعتراض اسم تنسيق الملف السلسلة لاحقة = eploadfilename.subString (UploadFilename.indexof (".")) ؛ // إعادة تجميع سلسلة اسم الملف newFilename = RandomName + لاحقة ؛ String SavePath = BasePath + "/" + newFilename ؛ ملف SaveFile = ملف جديد (SavePath) ؛ file parentFile = saveFile.getParentFile () ؛ if (savefile.exists ()) {savefile.delete () ؛ } آخر {if (! parentfile.exists ()) {parentfile.mkdirs () ؛ }} // انسخ الملف إلى المسار المحدد fileUtils.copyInputStreamTofile (file.getInputStream () ، SaveFile) ؛ // قم بتحميل الملف إلى الخادم ftpclientutil.upload (SaveFile ، FilestoredPath) ؛ }}} catch (استثناء e) {E.PrintStackTrace () ؛ }} أداة تحميل عميل FTP
حزمة com.yuanding.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*/ private static logger logger = loggerfactory.getLogger (ftpClientUtil.class) ؛ / ** * تكوين خادم FTP-مفتاح IP ، القيمة هي نوع السلسلة */ Static Static Final String Server_ip = "Server_ip" ؛ / ** * تكوين خادم FTP-مفتاح المنفذ ، القيمة هي نوع عدد صحيح */ Static Final String Server_port = "Server_port" ؛ / ** * تكوين خادم FTP-تسجيل الدخول إلى مفتاح تسجيل الدخول ، هو نوع من Boolean */ السلسلة النهائية الثابتة العامة IS_ANONDOND = "IS_Anonymous" ؛ / ** * اسم المستخدم لسجل مجهول في in */ public Static Final String Anonymous_user_name = "Anonymous" ؛ / ** * كلمة مرور سجل مجهول تسجيل الدخول */ السلسلة النهائية الثابتة العامة anonymous_password = "" ؛ / ** * تكوين خادم FTP--log في اسم المستخدم ، القيمة هي نوع السلسلة */ Static Final String user_name = "user_name" ؛ / ** * تكوين خادم FTP-السطوع في كلمة المرور ، القيمة هي نوع السلسلة */ Public Static Final String Password = "Password" ؛ / ** * تكوين خادم FTP-مفتاح PASV ، القيمة هي نوع Boolean */ Static Final String IS_PASV = "IS_PASV" ؛ /** * تكوين خادم FTP-مفتاح دليل العمل ، القيمة هي نوع السلسلة أثناء تسجيل الدخول ، الدليل الحالي * هو الدليل الرئيسي للمستخدم ، ويجب تعيين WorkDirectory بناءً عليه. علاوة على ذلك ، يجب أن يكون هناك workdirectory * لا يمكن إنشاؤه تلقائيًا. إذا لم يكن موجودًا ، فسيتم تحميل الملف في الدليل الرئيسي للمستخدم. إذا لم يتم تعيين * "/". */ السلسلة النهائية الثابتة العامة work_directory = "works_directory" ؛ الخريطة الثابتة العامة <string ، Object> servercfg = new HashMap <string ، Object> () ؛ خصائص ثابتة الدعامة. ثابت {logger.info ("ابدأ تحميل ملف ftp.properties!") ؛ prop = خصائص جديدة () ؛ حاول {inputStream fps = ftpclientutil.class.getResourCeasStream ("/ftp.properties") ؛ prop.load (fps) ؛ fps.close () ؛ } catch (استثناء 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 ، "" وسيتم استبدال Word blank string * strupt> strenge stringd stringd stringd stringd stringd stringd stringd stringc FilePathtoupload ، سلسلة FilestoredName) يلقي socketException ، ioException {expload (servercfg ، ملف جديد (filePathToupload) ، FilestoredName) ؛ } /*** قم بتحميل ملف إلى خادم FTP. * * param servercfg: تكوين خادم FTP * param fileToupload: ملف للتحميل * param filestoredName: الاسم لإعطاء الملف المخزن عن بُعد ، فارغ ، " Filetoupload ، سلسلة FilestoredName) يلقي socketException ، ioException {if (! fileToupload.exists ()) {رمي جديد alfortalargumentexception ( } if (! fileToupload.isfile ()) {رمي new alficalArgumentException ("ملف للتحميل ليس ملفًا:" + fileToupload.getabsolutepath ()) ؛ } if (stringUtils.IsBlank ((string) servercfg.get (server_ip))) {رمي جديد alficalArgumentException ("يجب أن يكون Server_ip في تكوين خادم FTP.") ؛ } transferfile (true ، servercfg ، filetoupload ، filestoredName ، null ، null) ؛ ستر FilestoredPath) يلقي SocketException ، ioException {if (stringUtils.IsBlank (FileNametOdownload)) {رمي جديد غير alfictalargumentexception ("لا يمكن أن يكون اسم الملف المراد تنزيله فارغًا.") ؛ } if (stringUtils.IsBlank (filestoredpath)) {رمي جديد غير unalfalArgumentException ("لا يمكن أن يكون المسار المخزن للملف الذي تم تنزيله في Local فارغًا.") ؛ } if (stringUtils.IsBlank ((string) servercfg.get (server_ip))) {رمي جديد alficalArgumentException ("يجب أن يكون Server_ip في تكوين خادم FTP.") ؛ } transferfile (false ، servercfg ، null ، null ، filenametodownload ، filestoredPath) ؛ } transferfile private static void void (isupload boolean ، خريطة <سلسلة ، كائن> servercfg ، fileToupload ، string serverfilestoredname ، string filenametodownload ، string localfilestoredpath) يلقي socketException ، ioException {String string = (String) servercfg.get (server_ip) ؛ منفذ Integer = (integer) servercfg.get (server_port) ؛ boolean isanymous = (boolean) servercfg.get (is_anynowous) ؛ سلسلة username = (string) servercfg.get (user_name) ؛ سلسلة كلمة المرور = (سلسلة) servercfg.get (كلمة المرور) ؛ Boolean ISPASV = (Boolean) servercfg.get (IS_PASV) ؛ String WorkDirectory = (string) servercfg.get (works_directory) ؛ ftpClient ftpClient = new ftpclient () ؛ inputStream filein = null ؛ OutputStream FileOut = null ؛ حاول {if (port == null) {logger.debug ("الاتصال بخادم FTP على" + مضيف + ":" + ftp.default_port) ؛ ftpclient.connect (مضيف) ؛ } آخر {logger.debug ("الاتصال بخادم FTP على" + مضيف + ":" + منفذ) ؛ ftpclient.connect (مضيف ، منفذ) ؛ } int reply = ftpClient.getReplyCode () ؛ if (! ftpreply.ispositivecOption (الرد)) {logger.error ("يرفض خادم FTP الاتصال") ؛ يعود؛ } if (Isanynowous! = null && isanymous) {username = anonymous_user_name ؛ كلمة المرور = Anonymous_Password ؛ } logger.debug ("قم بتسجيل الدخول إلى خادم FTP باستخدام اسم المستخدم =" + username + "، password =" + password) ؛ if (! ftpClient.login (اسم المستخدم ، كلمة المرور)) {logger.error ("فشل في تسجيل الدخول إلى خادم FTP باستخدام username =" + username + "، password =" + password) ؛ ftpclient.logout () ؛ يعود؛ } // هنا سوف نستخدم الوضع الثنائي كنوع ملف النقل ، // وضع ASCII غير معتمد. logger.debug ("تعيين نوع الملف ، وهو التحميل ، إلى ثنائي.") ؛ ftpclient.setfiletype (ftp.binary_file_type) ؛ if (ISPASV! = null && ISPASV) {logger.debug ("استخدم وضع PASV لنقل الملف.") ؛ ftpclient.enterlocalPassiveMode () ؛ } آخر {logger.debug ("استخدم الوضع النشط لنقل الملف.") ؛ ftpclient.enterlocalactiveMode () ؛ } if (stringUtils.isBlank (workDirectory)) {workDirectory = "/" ؛ } logger.debug ("تغيير دليل العمل الحالي إلى" + workDirectory) ؛ changeWorkingDirectory (ftpClient ، WorkDirectory) ؛ if (isUpload) {// endload if (stringUtils.IsBlank (serverFileStoredName)) {serverFiLestoredName = filetoupload.getName () ؛ } filein = new FileInputStream (fileToupload) ؛ logger.debug ("ملف التحميل:" + filetoupload.getabsolutepath () + "إلى خادم FTP مع الاسم:" + serverFileStoredName) ؛ if (! ftpclient.storefile (serverFileStoredName ، filein)) {logger.error ("فشل في تحميل الملف ،" + ftpclient.getReplyString ()) ؛ } آخر {logger.debug ("نجاح لتحميل الملف.") ؛ }} else {// download // تأكد من وجود دليل الملفات المصادفة = ملف جديد (localFileStoredPath) ؛ if (! filestored.getParentFile (). } fileout = new FileOutputStream (filestered) ؛ logger.debug ("تنزيل ملف:" + FileNametOdOwnload + "من FTP Server إلى Local:" + LocalFileStoredPath) ؛ if (! ftpClient.RetRieveFile (FileNametOdownload ، fileOut)) {logger.error ("فشل في تنزيل الملف ،" + ftpclient.getReplyString ()) ؛ } آخر {logger.debug ("نجاح لتنزيل الملف.") ؛ }} ftpclient.noop () ؛ ftpclient.logout () ؛ } أخيرًا {if (ftpclient.isconnected ()) {try {ftpclient.disconnect () ؛ } catch (ioException f) {}} if (filein! = null) {try {filein.close () ؛ } catch (ioException e) {}} if (fileout! = null) {try {fileout.close () ؛ } catch (ioException e) {}}} private static boolean changeWorkingDirectory (ftpclient ftpclient ، string workdirectory) يلقي ioException {if (! لـ (int i = 0 ؛ i <paths.length ؛ i ++) {if (! " ftpClient.ChangeWorkingDirectory (مسارات [i]) ؛ }}} إرجاع صحيح ؛ } تحميل الفراغ النهائي الثابت (MAP <String ، Object> servercfg ، string filepathtoupload ، سلسلة filestoredpath ، سلسلة filestoredName) يلقي socketException ، ioException {expload (servercfg ، ملف جديد (filePathtoupload) ، filestoredpath ، filestordname) ؛ } تحميل الفراغ النهائي الثابت العام (خريطة <سلسلة ، كائن> servercfg ، filetoupload ، السلسلة filestoredpath ، سلسلة filestoredName) يلقي socketException ، ioException {if (filestoredpath! = null &&! ". } التحميل (servercfg ، fileToupload ، filestoredName) ؛ } تحميل الفراغ النهائي الثابت العام (سلسلة FilePathtoupload ، السلسلة FilestoredPath) يلقي SocketException ، ioException {تحميل (servercfg ، filepathtoupload ، filestoredpath ، "") ؛ } تحميل الفراغ النهائي الثابت (ملف fileToupload ، السلسلة FilestoredPath) يلقي SocketException ، ioException {expload (servercfg ، filetoupload ، filestoredpath ، "") ؛ } قيم السلسلة الثابتة العامة (مفتاح السلسلة) {string value = prop.getProperty (key) ؛ if (value! = null) {return value ؛ } آخر {return null ؛ }}} FTP.Properties
#Server عنوان Server_ip = 192.168.1.1 #Server Port Server_port = 21 #Account name user_name = userftp #password #password = passwordftp
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.