مقدمة
في الآونة الأخيرة ، أحتاج إلى التفاعل مع خادم FTP في مشروعي. لقد وجدت فئة أدوات حول تحميل FTP وتنزيلها على الإنترنت. هناك نوعان تقريبًا.
الأول هو فئة نمط المفرد.
النوع الثاني هو تحديد خدمة أخرى ، والتي تنفذ مباشرة تحميل وتنزيل FTP من خلال الخدمة.
كل من هذه المشاعر لها إيجابيات وسلبيات.
أول واحد ينفذ إعادة استخدام الكود ، ولكن يجب كتابة معلومات التكوين في الفصل ، وهو أمر أكثر تعقيدًا في الحفاظ عليه.
النوع الثاني هو إطار ربيع ، يمكن حقن معلومات التكوين ديناميكيًا من خلال ملف الخصائص ، ولكن لا يمكن إعادة استخدام الكود.
لذلك أخطط لتنفيذ فئة الأدوات بنفسي لدمج المزايز أعلاه. بالمناسبة ، تم أيضًا حل بعض المشكلات الشائعة أثناء عملية التحميل.
نظرًا لأنني أستخدم إطار عمل الربيع ، إذا تم إعلان فئة الأدوات باعتبارها فول لإدارة الربيع ، فهي مفردة بشكل افتراضي ، لذلك لست بحاجة إلى تنفيذ المفرد مرة أخرى. ولأنه فول ، يمكنني حقن خصائص ملف الخصائص في خصائص الفول لفصلها. ما يلي هو الرمز المحدد:
package com.cky.util;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import org.apache.commons.net.ftp.FTP;import org.apache.commons.net.ftp.FTPClient;import org.apache.commons.net.ftpfile ؛ import org.apache.commons.net.ftp.ftpreply ؛ استيراد org.springframework.beans.factory.annotation.antation. // الحقن التلقائي لـ Value ("$ {ftp.host}") مضيف سلسلة خاص ؛ // ftp server ipvalue ("$ {ftp.port}") منفذ int الخاص ؛ // ftp server portvalue ("$ {ftp.username}") سلسلة username الخاصة بالسلسلة الخاصة ؛ // username @value ("$ {ftp.password}") provia password password ؛ اختبار في الطريقة الرئيسية وراء الكود/*public ftputil () {//system.out.println (this.toString ()) ؛ مضيف = "192.168.100.77" ؛ منفذ = 21 ؛ اسم المستخدم = "ftpuser" ؛ كلمة المرور = "FTP54321" ؛ BasePath = "/home/ftpuser/" ؛ }*// **** param path مسار تحميل الملف إلى الخادم* param اسم ملف تحميل اسم ملف* param دفق إدخال* @return*/ public boolean fileupload (مسار السلسلة ، اسم ملف السلسلة ، إدخال inputStream) {ftpclient ftp = new ftpclient () ؛ حاول {ftp.connect (مضيف ، منفذ) ؛ ftp.login (اسم المستخدم ، كلمة المرور) ؛ // قم بتعيين تنسيق ترميز الملف ftp.setControlenCoding ("UTF-8") ؛ . خلال هذه الفترة ، يستخدم الخادم منفذًا واحدًا فقط يفتحه ، مثل 21 // PASV (الوضع السلبي) يرسل أمر PASV إلى الخادم ، يفتح الخادم منفذًا جديدًا (> 1024) ، ويستخدم هذا المنفذ لنقل البيانات باستخدام المنفذ العميل 21 // بسبب العميل غير القابل للتحكم ، وحول الموالفة ، وما إلى ذلك ، والمنفذ يفتح على الخادم ، والوضع المقابل. // قم بتعيين وضع الإرسال لدفق FTP.SetFiLetRansferMode (ftp.stream_transfer_mode) ؛ // احصل على رمز الحالة لتحديد ما إذا كان الاتصال ناجحًا إذا (! ftpreply.ispositivecOption (ftp.getReplyCode ())) {رمي RunTimeException ("FTP يرفض الاتصال") ؛ } // انتقل إلى الدليل الجذري للملف الذي تم تحميله إذا (! ftp.ChangeWorkingDirectory (basepath)) {رمي new RunTimeException ("لا يوجد دليل الجذر ، يجب إنشاؤه") ؛ }. // إنشاء الدليل لـ (string dir: dirs) {if (null == dir || ". equals (dir)) متابعة ؛ // احكم على ما إذا كان الدليل موجودًا إذا (! ftp.ChangeWorkingDirectory (dir)) {// إنشاء if (! ftp.makedirectory (dir)) {رمي new runTimeException ("فشل إنشاء subdirectory") ؛ } // أدخل الدليل الذي تم إنشاؤه حديثًا ftp.ChangeWorkingDirectory (dir) ؛ }} // قم بتعيين نوع الملف الذي تم تحميله على النوع الثنائي ftp.setfiletype (ftp.binary_file_type) ؛ // قم بتحميل الملف if (! ftp.storefile (اسم الملف ، الإدخال)) {return false ؛ } input.close () ؛ ftp.logout () ؛ العودة صحيح. }} catch (استثناء e) {رمي new runTimeException (e) ؛ } أخيرًا {if (ftp.isconnected ()) {try {ftp.disconnect () ؛ } catch (ioException e) {رمي new runTimeException (e) ؛ }}} return false ؛ } /** * * @param اسم الملف اسم الملف ، ملاحظة! اسم الملف هنا هو اسم الملف بالإضافة إلى مسار ، مثل: /2015/06/04/aa.jpg * @Param LocalPath Store على العنوان المحلي * REGAN */Public Boolean DownloadFile (اسم ملف السلسلة ، String LocalPath) {ftpclient ftp = new ftpclient () ؛ حاول {ftp.connect (مضيف ، منفذ) ؛ ftp.login (اسم المستخدم ، كلمة المرور) ؛ // قم بتعيين تنسيق ترميز الملف ftp.setControlenCoding ("UTF-8") ؛ . خلال هذه الفترة ، يستخدم الخادم منفذًا واحدًا فقط يفتحه ، مثل 21 // PASV (الوضع السلبي) يرسل أمر PASV إلى الخادم ، يفتح الخادم منفذًا جديدًا (> 1024) ، ويستخدم هذا المنفذ لنقل البيانات باستخدام منفذ العميل 21 // يحتاج الخادم إلى فتح المنفذ من الخادم لأن العميل غير قابل للتحديد ، ftp.enterlocalPassiveMode () ؛ // قم بتعيين وضع الإرسال لدفق FTP.SetFiLetRansferMode (ftp.stream_transfer_mode) ؛ // احصل على رمز الحالة لتحديد ما إذا كان الاتصال ناجحًا إذا (! ftpreply.ispositivecOption (ftp.getReplyCode ())) {رمي RunTimeException ("FTP يرفض الاتصال") ؛ } int index = filename.lastindexof ("/") ؛ // احصل على مسار مسار سلسلة الملف = filename.substring (0 ، index) ؛ // احصل على اسم سلسلة اسم الملف = filename.subString (الفهرس+1) ؛ // احكم على ما إذا كان الدليل موجودًا إذا (! ftp.ChangeWorkingDirectory (basepath+path)) {رمي new runTimeException ("مسار الملف غير موجود:"+basepath+path) ؛ } // الحصول على جميع الملفات في هذا الدليل ftpfile [] files = ftp.listfiles () ؛ لـ (ftpfile file: files) {// ugn arme a target file //system.out.println chare (samefile name "+file.getName ()+" --- "+name) ؛ if (file.getName (). equals (name)) {//system.out.println indaged found ") ؛ // إذا تم العثور عليها ، انسخ الملف الهدف إلى الملف المحلي localfile = ملف جديد (localPath+"/"+file.getName ()) ؛ OutputStream Out = fileOutputStream جديد (localfile) ؛ ftp.retrievefile (file.getName () ، out) ؛ out.close () ؛ }} ftp.logout () ؛ العودة صحيح. } catch (استثناء e) {رمي new runTimeException (e) ؛ } أخيرًا {if (ftp.isconnected ()) {try {ftp.disconnect () ؛ } catch (ioException e) {رمي new runTimeException (e) ؛ }} ستر امتحان-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- E.PrintStackTrace () ؛ } أخيرًا {}*/// download امتحان------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------استخدام محدد
الخطوة 1: تكوين الربيع لتحميل ملفات الخصائص
ApplicationContext.xml
<السياق: property-placeholder location = "classpath:*. properties"/> ftp.propertiesftp.host = 192.168.100.77ftp.port = 21ftp.username = ftpuserftp.password = ftp54321ftp.basepath =/home/ftpuser/
الخطوة 2: إعلان فئة الأدوات كحبة
طريقة XML
<bean id = "ftputil"> <property name = "host" value = "$ {ftp.host}"> </property> <property name = "port" value = "$ {ftp.port}"> </sprement> <property name = "username" value = "$ {ftp.username}" value = "$ {ftp.password}"> </sprention> <property name = "basepath" value = "$ {ftp.basepath}"> </property> </bean>طريقة التعليقات التوضيحية ، مسح المكون
<السياق: مكون المسح الضوئي package = "com.cky.util"> </context: Component-Scan>
الجزء 3: الحقن والاستخدام
autowired private ftputil ftputil ؛
لخص
ما ورد أعلاه هو ملخص لحمل تحميل وتنزيل Spring FTP الذي أدخله المحرر. آمل أن يكون ذلك مفيدًا للجميع. إذا كان لديك أي أسئلة ، فيرجى ترك رسالة لي وسوف يرد المحرر على الجميع في الوقت المناسب. شكرا جزيلا لدعمكم لموقع wulin.com!