شاركت هذه المقالة معك طريقتان لتحميل وتنزيل ملفات Java FTP للرجوع إليها. المحتوى المحدد كما يلي
الطريقة الأولى:
package com.cloudpower.util ؛ استيراد java.io.file ؛ استيراد java.io.fileInputStream ؛ استيراد java.io.fileOutputStream ؛ استيراد java.io.ioException ؛ استيراد sun.net.telnetinputstream ؛ import sun.net.telnetuTtream ؛ earge. ftp* title: ftp.java* author: Zhou lingbin*/public class ftp {/*** name file file*/private string localfilename ؛ / *** اسم الملف البعيد*/ السلسلة الخاصة عن RemoteFilename ؛ / *** FTP Client*/ private ftpclient ftpclient ؛ /***اتصال الخادم*param ip server ip*param port server port* @param اسم المستخدم*param password password*param path path path*author zhou lingbin*date 2012-7-11*/public void connectserver (string ip ، int port ، string password ، string pass) { method // ftpclient = new ftpclient () ؛ // ftpclient.openserver (IP ، port) ؛ // الطريقة الثانية ftpclient = ftpclient جديد (IP) ؛ ftpclient.login (المستخدم ، كلمة المرور) ؛ // ضبط على الإرسال الثنائي ftpclient.binary () ؛ System.out.println ("تسجيل الدخول!") ؛ if (path.length ()! = 0) {// قم بتبديل الدليل على النظام البعيد إلى الدليل المحدد بواسطة مسار المعلمة ftpclient.cd (path) ؛ } ftpclient.binary () ؛ } catch (ioException ex) {ex.printStackTrace () ؛ رمي new RunTimeException (ex) ؛ }} / *** أغلق الاتصال* Author Zhou Lingbin* date 2012-7-11* / public void closeConnect () {try {ftpclient.closeerver () ؛ system.out.println ("افصل النجاح") ؛ } catch (ioException ex) {system.out.println ("not disconnect") ؛ ex.printStackTrace () ؛ رمي new RunTimeException (ex) ؛ }} / *** upload file* param localfile file local* param remotefile file Remote* author Zhou lingbin* date 2012-7-11* / public void upload (String localfile ، string remotefile) {this.localfilename = localfile ؛ this.RemoteFilename = RemoteFile ؛ TelnetOutputStream OS = NULL ؛ FileInputStream هو = فارغ ؛ حاول {// إضافة الملف عن بُعد إلى OPTER DTREA OS = ftpClient.put (this.remoteFilename) ؛ // احصل على دفق إدخال ملف الملف المحلي file_in = ملف جديد (this.localfilename) ؛ هو = جديد fileInputStream (file_in) ؛ // إنشاء بايت عازلة [] بايت = بايت جديد [1024] ؛ int c ؛ بينما ((c = is.read (bytes))! = -1) {os.write (bytes ، 0 ، c) ؛ } system.out.println ("تحميل النجاح") ؛ } catch (ioException ex) {system.out.println ("not expload") ؛ ex.printStackTrace () ؛ رمي new RunTimeException (ex) ؛ } أخيرًا {try {if (is! = null) {is.close () ؛ }} catch (ioException e) {E.PrintStackTrace () ؛ } أخيرًا {try {if (os! = null) {os.close () ؛ }} catch (ioException e) {E.PrintStackTrace () ؛ }}}} / ** * تنزيل الملف * param pathfile path remote path (Server Side) * param localfile path file path (client) * author zhou lingbin * date 2012-7-11 * / public void download (String remotefile ، string localfile) {telnetinputstream is = null ؛ FileOutputStream OS = NULL ؛ جرب {// احصل على اسم الملف على الجهاز البعيد واستخدم TelnetInputStream لنقل الملف إلى المنطقة المحلية. IS = ftpClient.get (RemoteFile) ؛ ملف file_in = ملف جديد (localfile) ؛ OS = جديد fileOutputStream (file_in) ؛ بايت [] بايت = بايت جديد [1024] ؛ int c ؛ بينما ((c = is.read (bytes))! = -1) {os.write (bytes ، 0 ، c) ؛ } system.out.println ("تنزيل النجاح") ؛ } catch (ioException ex) {system.out.println ("not download") ؛ ex.printStackTrace () ؛ رمي new RunTimeException (ex) ؛ } أخيرًا {try {if (is! = null) {is.close () ؛ }} catch (ioException e) {E.PrintStackTrace () ؛ } أخيرًا {try {if (os! = null) {os.close () ؛ }} catch (ioException e) {E.PrintStackTrace () ؛ }}}} main static void static (سلسلة agrs []) {String filePath [] = {"/temp/aa.txt" ، "/temp/regist.log"} ؛ String localFilePath [] = {"c: //tmp//1.txt" ، "c: //tmp///2.log"} ؛ ftp fu = new ftp () ؛ /** استخدم رقم المنفذ الافتراضي ، اسم المستخدم ، كلمة المرور والدليل الجذر للاتصال بخادم FTP*/fu.connectserver ("127.0.0.1" ، 22 ، "مجهول" ، "ieuser@" ، "/temp") ؛ // download for (int i = 0 ؛ i <filepath.length ؛ i ++) {fu.Download (filepath [i] ، localfilepath [i]) ؛ } string localfile = "e: //number.txt" ؛ String RemoteFile = "/temp/haha.txt" ؛ // تحميل fu.upload (LocalFile ، RemoteFile) ؛ fu.closeconnect () ؛ }}
لا يوجد شيء يمكن قوله حول هذه الطريقة ، فهي بسيطة نسبيًا ، ولا توجد مشكلة في رمز مشوهة صيني. يبدو أن هناك عيب ولا يمكن تشغيل ملفات كبيرة. يمكن للأصدقاء المهتمين تجربته.
الطريقة الثانية:
الفئة العامة ftpapche {private static ftpclient ftpclient = new ftpclient () ؛ ترميز سلسلة ثابتة خاصة = system.getProperty ("file.encoding") ؛ /** * الوصف: تحميل ملف إلى خادم FTP * * @ @version1.0 * param url * ftp server hostname * param port * ftp server port * param username * ftp login accoun FTP Server * param input * دفق إدخال الملف المحلي * return إرجاع true بنجاح ، وإلا فكل */ public static boolean uploadfile (url url ، منفذ int ، اسم مستخدم السلسلة ، كلمة مرور السلسلة ، مسار السلسلة ، اسم ملف السلسلة ، إدخال inputstream) {boolean result = خطأ ؛ جرب {int reply ؛ // إذا تم استخدام المنفذ الافتراضي ، فيمكنك الاتصال مباشرة بخادم FTP FTPClient.connect (url) ؛ // ftp.connect (url ، port) ؛ // قم بالاتصال بخادم FTP // تسجيل الدخول إلى ftpclient.login (اسم المستخدم ، كلمة المرور) ؛ ftpclient.setControlencoding (الترميز) ؛ // تحقق من أن الاتصال هو الرد الناجح = ftpClient.getReplyCode () ؛ if (! ftpreply.ispositivecOption (الرد)) {system.out.println ("فشل الاتصال") ؛ ftpclient.disconnect () ؛ نتيجة العودة } // نقل دليل العمل إلى تغيير منطقي الدليل المحدد = ftpClient.ChangeWorkingDirectory (path) ؛ ftpclient.setfiletype (ftp.binary_file_type) ؛ if (تغيير) {result = ftpclient.storefile (سلسلة جديدة (filename.getBytes (الترميز) ، "ISO-8859-1") ، الإدخال) ؛ if (النتيجة) {system.out.println ("تم تحميله بنجاح!") ؛ }} input.close () ؛ ftpclient.logout () ؛ } catch (ioException e) {E.PrintStackTrace () ؛ } أخيرًا {if (ftpclient.isconnected ()) {try {ftpclient.disconnect () ؛ } catch (ioException ioe) {}}} نتيجة الإرجاع ؛ }/*** قم بتحميل الملفات المحلية إلى خادم FTP**/public void testUploadFromDisk () {try {fileInputStream in = new FileInputStream (ملف جديد ("E: /Number.txt")) ؛ flag boolean = uploadfile ("127.0.0.1" ، 21 ، "ZLB" ، "123" ، "/" ، "haha.txt" ، in) ؛ system.out.println (flag) ؛ } catch (fileNotFoundException e) {e.printStackTrace () ؛ }} /** * الوصف: قم بتنزيل الملف من خادم FTP * * * @personge1.0 * param url * ftp server hostname * param port * ftp server port * @param username * ftp login accoun إلى Local بعد التنزيل * @RETURN */ public static boolean downfile (url url string ، منفذ int ، اسم مستخدم السلسلة ، كلمة مرور السلسلة ، السلسلة remotepath ، اسم ملف السلسلة ، String localPath) {boolean result = false ؛ جرب {int reply ؛ ftpclient.setControlencoding (الترميز) ؛ / * * من أجل تحميل الملفات الصينية وتنزيلها ، توصي بعض الأماكن باستخدام الجملتين التاليتين بدلاً من * سلسلة جديدة (remotepath.getBytes (الترميز) ، "ISO-8859-1"). * بعد الاختبار ، لا يمكن تمريره. */// ftpclientconfig conf = new ftpClientConfig (ftpClientConfig.syst_nt) ؛ // conf.SetServerLanguageCode ("ZH") ؛ ftpclient.connect (url ، port) ؛ // إذا تم استخدام المنفذ الافتراضي ، يمكنك الاتصال مباشرة بخادم FTP بواسطة ftpclient.login (اسم المستخدم ، كلمة المرور) ؛ // تسجيل الدخول // تعيين نوع نقل الملف إلى ftpclient.setfiletype ثنائي (ftpclient.binary_file_type) ؛ // احصل على رمز استجابة تسجيل الدخول FTP = ftpclient.getReplyCode () ؛ // تحقق من أن تسجيل الدخول ناجح إذا (! ftpreply.ispositivecompletion (الرد)) {ftpclient.disconnect () ؛ System.err.println ("رفض خادم FTP الاتصال.") ؛ نتيجة العودة }. // احصل على قائمة الملفات ftpfile [] fs = ftpclient.listfiles () ؛ لـ (ftpfile ff: fs) {if (ff.getName (). equals (filename)) {file localfile = new file (localPath + "/" + ff.getName ()) ؛ OutputStream هو = fileOutputStream جديد (LocalFile) ؛ ftpClient.RetRieveFile (ff.getName () ، IS) ؛ is.close () ؛ }} ftpclient.logout () ؛ النتيجة = صواب ؛ } catch (ioException e) {E.PrintStackTrace () ؛ } أخيرًا {if (ftpclient.isconnected ()) {try {ftpclient.disconnect () ؛ } catch (ioException ioe) {}}} نتيجة الإرجاع ؛ }/** * قم بتنزيل الملف على خادم FTP إلى المحلي *//public void testDownFile () {try {boolean flag = downfile ("127.0.0.1" ، 21 ، "ZLB" ، "123" ، "/" ، "Haha.txt" ، "d:/") ؛ system.out.println (flag) ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ }} public static void main (string [] args) {ftpapche fa = new ftpapche () ؛ fa.testDownFile () ؛ }}
وبهذه الطريقة ، تحتاج إلى الانتباه إلى مشكلة الكود المشتعل الصيني. إذا قمت بتعيينه بشكل غير صحيح ، فقد يكون اسم الملف الذي تم تحميله هو رمز مشوه. في بعض الأحيان لا يمكن تحميله على الإطلاق. بالطبع ، لن يطالبك لأنه لا يوجد استثناء. لقد وجدت العديد من الحلول عبر الإنترنت ، وهناك العديد من الآراء المختلفة. تم نسخ جميعهم تقريبًا من نسخة واحدة ، ولم يتم اختبارها بنفسي. لقد عانيت كثيرا لهذا. ينقسم تقريبًا إلى الحلين التاليين:
1. أضف الجمل الثلاث التالية لحلها
ftpclient.setControlenCoding ("GBK") ؛
ftpClientConfig conf = new ftpclientConfig (ftpClientConfig.syst_nt) ؛
conf.SetServerLanguageCode ("ZH") ؛
الإجابة: بعد الاختبار ، لا تعمل ببساطة ، لا تزال المشكلة أعلاه موجودة
2. إنه يشبه الطريقة أعلاه ، لكنني أعتقد أن هذه الطريقة أكثر موثوقية
أولاً ، أضف الجملة ftpclient.setControlenCoding ("GBK") ؛ وبعد ذلك ، قم بتنسيق كل الصينيين إلى "ISO-8859-1" ، على النحو التالي:
ftpclient.ChangeWorkingDirectory (سلسلة جديدة (RemotePath.getBytes ("GBK") ، "ISO-8859-1")) ؛
الإجابة: بعد الاختبار ، لا يزال لا يعمل. السبب الذي قلت أن هذه الطريقة أكثر موثوقية. الرجاء متابعة القراءة.
أولاً ، دعنا نتحدث عن سبب حاجتنا إلى نقل الرمز:
لأنه في بروتوكول FTP ، تم تحديد اسم الملف ليتم ترميزه على أنه ISO-8859-1 ، يجب نقل اسم الدليل أو اسم الملف.
السؤال التالي هو ، ما هو الترميز الذي يجب أن نتحوله إلى هذا التنسيق. لذلك ، هناك حل ثانٍ-تحويل تنسيق GBK إلى تنسيق ISO-8859-1. علاوة على ذلك ، يقول بعض الناس أيضًا أنه يجب القيام بذلك. في الواقع ، أعتقد أن السبب في أنهم يستطيعون قول أن هذا مصادفة كاملة. مبدأها الحقيقي هو أنه نظرًا لأن تنسيق الترميز المحدد بواسطة بروتوكول FTP هو "ISO-8859-1" ، يتعين علينا حقًا تحويل التنسيق ثم تحويله تلقائيًا إلى تنسيق الترميز الخاص بالنظام عندما يستقبل الخادم الملف. لذلك ، لا يتمثل المفتاح في تحديد التنسيق ، ولكن للاعتماد على تنسيق الترميز لخادم FTP. لذلك ، إذا كان تنسيق الترميز لنظام FTP هو "GBK" ، فستنجح الطريقة الثانية بالتأكيد ؛ ومع ذلك ، إذا كان تنسيق الترميز للنظام هو "UTF-8" ، فسيظل هناك رمز مشتعل. لذلك ، لا يمكننا إلا الحصول على تنسيق الترميز للنظام من خلال الكود ، ثم تحويله إلى تنسيق الترميز لـ ISO-8859-1 من خلال تنسيق الترميز هذا. طريقة الاستحواذ على النحو التالي:
ترميز سلسلة ثابتة خاصة = system.getProperty ("file.encoding") ؛
تم اختبار جميع الرموز المذكورة أعلاه بنفسك ، وآمل أن يتمكنوا من حل المشكلة للجميع!