قبل بضعة أيام ، قمت بمشروع. تمت كتابة العميل والمسؤول معًا ، وشاركوا نفس الخادم. كانت الملفات التي تم تحميلها بواسطة العميل على القرص الصلب للخادم. اقترح Lao Long فصل العميل وجانب المسؤول ، وفي هذا الوقت كانت هناك مشكلة في تخزين المرفقات التي تم تحميلها بواسطة المستخدم. من الواضح ، من غير الواقعي تخزين ملفات APK التي تزيد حجمها عن مئات M إلى قاعدة البيانات. بعد التحقق لفترة طويلة ، هي أسرع طريقة لإنشاء خادم FTP لنقل الملفات على كلا الطرفين.
العملية المحددة هي أن المستخدم يقوم بتسجيل الدخول إلى عميل الشبكة الخارجية ويقوم بتحميل الملف إلى القرص الصلب خادم الشبكة الخارجي. في الوقت نفسه ، يصل الملف إلى خادم FTP لخادم مسؤول Intranet من خلال خادم الشبكة الخارجي ويقوم بتمريره إلى القرص الصلب الخادم الداخلي. وبهذه الطريقة ، يمكن لخادم Intranet تشفير الملفات التي تم تحميلها وتسجيلها ، ثم تمرير الملفات مرة أخرى إلى القرص الصلب خادم الشبكة الخارجي من خلال FTP للمستخدمين لإجراء عمليات أخرى.
الأدوات المستخدمة في التنفيذ المحدد: serv-u. Serv-U هي أداة تسهلنا إلى إنشاء خادم FTP على Windows. بعد التنزيل والتكسير ، اتبع الخطوات ، وقم بتعيين IP ، والمنفذ ، وكلمة مرور الحساب ، ومسار القرص الذي يسمح بالوصول إلى FTP ، وأذونات التشغيل ، وما إلى ذلك ، ويمكنك استخدامه. عند اختبار IP ، اختر 127.0.0.1 ، وعند اختبار IP في إنترانت ، اختر 192.168.0.x.
في تنفيذ مشروع Java ، كتبت فئة الأدوات بنفسي واستخدمت حزمة Commons-Net من Apache ، والتي لديها وظائف تحميل وتنزيل وحذف. الرمز المرفق:
حزمة app.ftp ؛ استيراد java.io.file ؛ استيراد java.io.fileInputStream ؛ استيراد java.io.filenotfoundException ؛ استيراد java.io.fileOutputStream ؛ استيراد java.io.ioException ؛ استيراد java.io.inputstream ؛ استيراد java.io.outputStream ؛ استيراد org.apache.commons.net.ftp.ftpclient ؛ استيراد org.apache.commons.net.ftp.ftpfile ؛ استيراد org.apache.commons.net.ftp.ftpreply ؛ /*** ftp class class** /public class ftputils { /*** upload file to ftp server** url url* param عنوان IP الخادم* param port* منفذ الخادم* username usernam <b> true </b>: التحميل بنجاح* <br/>* <b> false </b>: فشل التحميل الفاشل*/public static boolean storefile (url url ، منفذ int ، اسم مستخدم السلسلة ، كلمة مرور السلسلة ، string storepath ، اسم ملف السلسلة ، inputStream is) {boolean result = false ؛ ftpclient ftp = new ftpclient () ؛ جرب {// عند الاتصال بالخادم ، يتقدم المنفذ إلى 21 ، يمكنك توصيل ftp.connect مباشرة (url ، port) ؛ // تسجيل الدخول إلى الخادم ftp.login (اسم المستخدم ، كلمة المرور) ؛ // حدد ما إذا كان رمز الإرجاع قانونيًا إذا (! ftpreply.ispositivecOption (ftp.getReplyCode ())) {// افصل عند عدم الاتصال بـ ftp.disconnect () ؛ // إنهاء نتيجة إرجاع البرنامج ؛ } // تحديد ما إذا كان دليل FTP موجود. إذا لم يكن موجودًا ، فقم بإنشاء دليل ، بما في ذلك إنشاء سلسلة دليل متعددة المستويات S = "/"+StorePath ؛ سلسلة [] dirs = s.split ("/") ؛ ftp.ChangeWorkingDirectory ("/") ؛ // تحقق مما إذا كان الدليل موجودًا بالترتيب. إذا لم يكن موجودًا ، فقم بإنشاء دليل لـ (int i = 1 ؛ dirs! = null && i <dirs.length ؛ i ++) {if (! }} آخر {return false ؛ }}} // تعيين دليل تشغيل الملف ftp.ChangeWorkingDirectory (StorePath) ؛ // set type file ، binary ftp.setfiletype (ftpclient.binary_file_type) ؛ // set buffer size ftp.setbuffersize (3072) ؛ // تحميل ملف ملف = ftp.storefile (اسم الملف ، هو) ؛ // أغلق دفق الإدخال is.close () ؛ // تسجيل الدخول الخادم ftp.logout () ؛ } catch (ioException e) {E.PrintStackTrace () ؛ } أخيرًا {try {// تحقق من (null! = is) {// أغلق دفق الإدخال IS.Close () ؛ } // تحقق مما إذا كان الاتصال موجودًا إذا (ftp.isconnected ()) {// difnonnect ftp.disconnect () ؛ }} catch (ioException e) {E.PrintStackTrace () ؛ }} نتيجة الإرجاع ؛ ستر * <b> false </b>: فشل التنزيل */ public static boolean RetrieveFile (url url ، منفذ int ، اسم مستخدم السلسلة ، كلمة مرور السلسلة ، السلسلة remotepath ، اسم ملف السلسلة ، String localPath) {boolean result = false ؛ ftpreply.ispositivecompletion (ftp.getReplyCode ())) {// disconnect عندما يكون المنفذ غير قانوني ؛ // إنهاء نتيجة إرجاع البرنامج ؛ } // قم بتعيين دليل تشغيل الملفات ftp.ChangeWorkingDirectory (RemotePath) ؛ // قم بتعيين نوع الملف ، binary ftp.setfiletype (ftpclient.binary_file_type) ؛ // قم بتعيين حجم المخزن المؤقت FTP.SetBuffersize (3072) ؛ // قم بتعيين حرف الترميز ftp.setControlenCoding ("UTF-8") ؛ // إنشاء ملف كائن الملف المحلي localfile = ملف جديد (localPath + "/" + اسم الملف) ؛ // احصل على جميع أسماء الملفات في سلسلة دليل تشغيل الملفات [] remotenames = ftp.listnames () ؛ ] }} // عندما تكون مقارنة اسم الملف ناجحة ، أدخل عملية التنزيل إذا (النتيجة) {// إنشاء دفق إخراج الملف OS = جديد fileOutputStream (localfile) ؛ // قم بتنزيل نتيجة الملف = ftp.retrievefile (اسم الملف ، OS) ؛ // أغلق دفق الإخراج os.close () ؛ } // تسجيل الخروج من الخادم ftp.logout () ؛ } catch (ioException e) {E.PrintStackTrace () ؛ } أخيرًا {try {// حدد ما إذا كان دفق الإخراج موجودًا إذا (null! = os) {// أغلق دفق الإخراج os.close () ؛ } // تحديد ما إذا كان الاتصال موجودًا إذا (ftp.isconnected ()) {// dissconnect ftp.disconnect () ؛ }} catch (ioException e) {E.PrintStackTrace () ؛ }} نتيجة الإرجاع ؛ }/*** حذف الملف من خادم FTP** param url* عنوان IP الخادم* param port* param username* اسم تسجيل الدخول اسم المستخدم* param password* تسجيل الدخول إلى المستخدم* param remotepath* pare tore storage storage* @param filedam فاشل*/ public static boolean deletefile (url url string ، منفذ int ، اسم مستخدم السلسلة ، كلمة مرور السلسلة ، سلسلة Remotepath ، اسم ملف السلسلة) {boolean result = false ؛ ftpclient ftp = new ftpclient () ؛ جرب {// عند الاتصال بالخادم ، يتقدم المنفذ إلى 21 ، يمكنك توصيل ftp.connect مباشرة (url ، port) ؛ // تسجيل الدخول إلى الخادم ftp.login (اسم المستخدم ، كلمة المرور) ؛ // حدد ما إذا كان رمز الإرجاع قانونيًا إذا (! ftpreply.ispositivecpletion (ftp.getReplyCode ())) {// disconnect عندما لا يكون ftp.disconnect () ؛ // إنهاء نتيجة إرجاع البرنامج ؛ } // قم بتعيين دليل تشغيل الملفات ftp.ChangeWorkingDirectory (RemotePath) ؛ // قم بتعيين نوع الملف ، binary ftp.setfiletype (ftpclient.binary_file_type) ؛ // قم بتعيين حجم المخزن المؤقت FTP.SetBuffersize (3072) ؛ // قم بتعيين حرف الترميز ftp.setControlenCoding ("UTF-8") ؛ // احصل على جميع أسماء الملفات في سلسلة دليل تشغيل الملفات [] remotenames = ftp.listnames () ؛ // LOOP لمقارنة أسماء الملفات لتحديد ما إذا كان اسم الملف الذي سيتم تنزيله موجود حاليًا لـ (سلسلة remotename: remotenames) {if (fileName.equals (Remotename)) {result = true ؛ }} // عندما تكون مقارنة اسم الملف ناجحة ، أدخل عملية الحذف إذا (النتيجة) {// delete file result = ftp.deletefile (filename) ؛ } // تسجيل الخروج من الخادم ftp.logout () ؛ } catch (ioException e) {E.PrintStackTrace () ؛ } أخيرًا {try {// تحديد ما إذا كان الاتصال موجودًا إذا (ftp.isconnected ()) {// disonnect ftp.disconnect () ؛ }} catch (ioException e) {E.PrintStackTrace () ؛ }} نتيجة الإرجاع ؛ } public static void main (string [] args) يلقي fileNotfoundException {// حاول {// fileInputStream fis = new FileInputStream (ملف جديد ("d:/soft storage/soft toolbox/html_help_workshop_1.3_xiazaiba.zip")) ؛ // system.out.println (storefile ("192.168.1.2" ، 21 ، "admin" ، "1" ، "c:/documents and settings/administrator/desktop" ، randomuuid.random () + ".zip" ، fis)) ؛ //} catch (fileNotfoundException e) {// e.printstacktrace () ؛ //} // // file file = file new ("c: /users/freed/desktop/1.txt") ؛ // inputStream هو = جديد fileInputStream (ملف) ؛ //system.out.println(storefile("127.0.0.1 "، 21 ،" feili "،" feili "،" أمثلة "،" 2.txt "، هو)) ؛ //system.out.println(retrievefile("127.0.1.1 "، 21 ،" feili "،" feili "،" Amposure/JSP "،" index.html "،" C:/Users/Freed/Desktop ")) ؛ //system.out.println(deletefile("127.0.0.1 "، 21 ،" Feili "،" Feili "،" TestPath "،" 1.txt ")) ؛ }}تجدر الإشارة إلى أنه عند تحميل الملفات ، يجب أولاً وضع ملف الملف في FileInputStream.
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.