تحميل ملف من خادم FTP في Java

باستخدام   واجهة برمجة تطبيقات Apache Commons Net ، من السهل ترميز برنامج لتنزيل ملف من خادم FTP. في هذه المقالة ، ستتعلم كيفية تنفيذ كود جافا بشكل صحيح لتنزيل الملفات من الخادم عبر بروتوكول FTP.

أباتشي كومنز صافي API و FTP< / h2 تحميل>
نمط org.apache.commons.net.ftp.FTPClient طريقتين لتنزيل الملفات من خادم FTP:

1) نمط < / span >< span = "عائلة الخط:" ساعي جديد" , " ساعي" ، حافلة صغيرة؛" > boolean retrieveFile (سلسلة عن بعد ، OutputStream المحلية) < / span>: تقوم هذه الطريقة باسترداد الملف من الخادم عن طريق تحديد مساره في المعلمة remote، ويكتب وحدات البايت المستردة باستخدام نمط OutputStream < / span >. ترجع هذه الطريقة true< / span> إذا نجحت ، وإلا خطأ< / امتداد>. هذه الطريقة مناسبة لبرنامجنا عندما لا تحتاج إلى معرفة المعلومات حول النقل وكيفية حفظ الملف على القرص. في نهاية التنزيل ، يجب أن نغلق دفق الإخراج OutputStream في نهاية التنزيل.

2) نمط < / span >< span = "عائلة الخط:" ساعي جديد" , " ساعي" ، حافلة صغيرة؛" >InputStream retrieveFileStream (سلسلة عن بعد) < / span>: تأخذ هذه الطريقة مسار الملف البعيد فقط كمعلمة ولا تحتاج إلى نمط OutputStream ، لكنه يرجع نمط InputStream< / span > والتي يمكن أن تكون مفيدة لقراءة وحدات البايت المستلمة من الملف. تمنحنا هذه الطريقة مزيدا من التحكم في كيفية كتابة البايتات على القرص المحلي. هناك نقطتان مهمتان حول استخدام هذه الطريقة: < / div>
< / div>
  • الأسلوب completePendingCommand() لإكمال التنزيل والتحقق من القيمة التي تم إرجاعها لمعرفة ما إذا كان التنزيل قد تم.
  • يجب إغلاق دفق التشغيل InputStream< / span >.< / li>< / ul>
    السؤال هو الطريقة التي يجب استخدامها؟ فيما يلي بعض الحيل: < / div>
    • الطريقة الأولى هي أسهل طريقة لتنزيل ملف بعيد عن طريق تمرير وسيطة OutputStream للملف الذي نريد حفظه على disk.
    • الطريقة الثانية تعطينا المزيد من التحكم في كيفية إجراء النقل ، لذلك يتطلب المزيد من التعليمات البرمجية للكتابة عن طريق إنشاء نمط InputStream لقراءة وحدات البايت المستلمة ونمط إكسيتستريم < / سبان>   لحفظ البايتات ، اقرأ . هذه الطريقة مفيدة إذا كنت تريد معرفة عدد البايتات التي تم نقلها وعدد البايتات المتبقية. الطريقة  < span style = "عائلة الخط:" ساعي جديد" , " ساعي" ، حافلة صغيرة؛" >completePendingCommand()  < / span> يجب أن يسمى  لإكمال التنزيل.
    • كلتا الطريقتين رفع استثناء IOException أو أحد هذين النمطين الاستثناءات: نمط < / span >< span = "عائلة الخط: " ساعي جديد" , " ساعي" ، حافلة صغيرة؛" >FTPConnectionClosedExcception و CopyStreamException < / span >. لذلك، تأكد من التعامل مع هذه الاستثناءات بشكل صحيح عند استدعاء .
    بالإضافة إلى ذلك، يجب استدعاء الطريقتين التاليتين قبل الأساليب < span style="font-family:" ساعي جديد" , " ساعي" ، حافلة صغيرة؛" > retrieveFile() and  < span style = "عائلة الخط:" ساعي جديد" , " ساعي" ، حافلة صغيرة؛" > retrieveFileStream () < / span >: < / div>

    < / div>
    - نمط باطل enterLocalPassiveMode(): تغير هذه الطريقة وضع الاتصال من خادم إلى عميل إلى خادم إلى خادم ، مما يتجنب مشكلة حظر جدار الحماية.

    - نمط void setFileType(int fileType): هذه الطريقة تغير نوع الملف المراد نقله ، يوصى بتغيير النوع إلى FTP. BINARY_FILE_TYPE ، بدلا من FTP. ASCII_FILE_TYPE حتى لو كان ملفا نصيا.

    خطوات تنزيل ملف في Java

    فيما يلي خطوات تنفيذ كود التنزيل بشكل صحيح لملف بعيد من خادم FTP باستخدام Apache Commons Net:
    • الاتصال وتسجيل الدخول إلى server.
    • استخدام وضع الاتصال السلبي.
    • قم بتغيير نوع النقل إلى binary.
    • إنشاء نمط outputStream لحفظ الملف الذي تم تنزيله على disk.
    • حدد مسار التسجيل إلى disk.
    • إذا كنت تستخدم النمط retriveFile ()< / span>: < / li>
      • Pass < span style = "عائلة الخط: " ساعي جديد" , " ساعي" ، حافلة صغيرة؛" >outputStream ومسار الملف كوسيطات.
      • إغلاق دفق الكتابة  < span style = "عائلة الخط:" ساعي جديد" , " ساعي" ، حافلة صغيرة؛" >outputStream.
      • اقرأ القيمة التي تم إرجاعها للتحقق مما إذا كان التنزيل ناجحا.
    • إذا كنت تستخدم النمط retriveFileStream():
      • Retrieve On  < span style = "عائلة الخط:" ساعي جديد" , " ساعي" ، حافلة صغيرة؛" >الإدخال ستريم< / سبان>  تم إرجاعها بواسطة الطريقة  < span style = "عائلة الخط:" ساعي جديد" , " ساعي" ، حافلة صغيرة؛" >retriveFileStream().
      • إنشاء مصفوفة بايت (مخزن مؤقت) بحجم محدد (عادة 4096) لقراءة البايتات وكتابتها باستخدام a  < span style = "عائلة الخط:" ساعي جديد" , " ساعي" ، حافلة صغيرة؛" >outputStream< / span >.< / li>
      • استدعاء الطريقة < span style = "عائلة الخط:" ساعي جديد" , " ساعي" ، حافلة صغيرة؛" >completePendingCommand() لإكمال التنزيل والتحقق من القيمة التي تم إرجاعها لمعرفة ما إذا كان النقل ناجحا.
      • إغلاق تدفقات القراءة والكتابة InputStream< / span > و < span style = "عائلة الخط:" ساعي جديد" , " ساعي" ، حافلة صغيرة؛" >outputStream< / span >.< / li>< / ul >
      • قطع الاتصال بالخادم باستخدام نمط قطع الاتصال () < / span >.< / li>< / ul >< / div>< / div>
          < / ul >< / div>

          برنامج لتحميل ملف مع FTP في Java

          يوضح هذا الرمز كيفية تنزيل ملف من خادم FTP باستخدام هاتين الطريقتين:
          • استرداد منطقي (سلسلة عن بعد ، InputStream المحلية) < / span >< / li>
          • inputStream retrieveFileStream (سلسلة عن بعد) < / span>< / li>< / ul > إليك الكود الكامل:

            < pre class = "prettyprint lang-java" >import java.io.BufferedOutputStream ؛
            import java.io.File;
            import java.io.FileInputStream;
            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.ftp.FTPFile;

            من الفئة العامة FTPDownloadFile {

            الفراغ العام الثابت الرئيسي (سلسلة [] args) {
            Server String = "ServerAddress" ؛
            int port = 21 ؛
            اسم مستخدم السلسلة = "YourUserName" ؛
            كلمة مرور السلسلة = "كلمة المرور الخاصة بك" ؛

            FTPClient ftpClient = FTPClient الجديد () ؛
            جرب {

            ftpClient.connect (الخادم ، المنفذ) ؛
            ftpClient.login (اسم المستخدم وكلمة المرور) ؛
            ftpClient.enterLocalPassiveMode();

            ftpClient.setFileType(FTP. BINARY_FILE_TYPE) ؛

            // النهج 1: تحميل ملف باستخدام ملف InputStream
            File = ملف جديد ("المكونات الإضافية و styles.txt") ؛

            اسم ملف السلسلة = "الإضافات و styles.txt" ؛
            InputStream inputStream = جديد FileInputStream (ملف) ؛

            System.out.println ("بدء التنزيل");
            //download result
            الدقة المنطقية = ftpClient.storeFile (اسم الملف ، inputStream) ؛
            // إغلاق دفق التشغيل
            inputStream.close () ؛

            if (res==true) {
            System.out.println ("الملف "+FileName+
            " تم تنزيله بنجاح");
            }

            // النهج 2: تحميل ملف باستخدام OutputStream
            String FileName2 = "Track 2.mp3" ؛
            سلسلة RemoteFilePath = "/songs/"+FileName2;
            ملف filelocal = ملف جديد ("C: / Track 2.mp3") ؛

            // سرد المجلد الذي يوجد به الملف و
            // ثم ابحث عنه بالاسم للحصول على
            // حجمه الذي سيتم استخدامه لحساب
            // نسبة التنزيل
            FTPFile[] files1 = ftpClient.listFiles ("/ songs") ؛
            الحجم الطويل = 0 ؛
            for(int i = 0; أنا< الملفات 1.الطول; i++){
            if(files1[i].getName().equals(FileName2))
            //get file size
            size = files1[i].getSize();
            }

            OutputStream outputStream2 = جديد BufferedOutputStream (
            جديد FileOutputStream (ملف محلي)) ؛
            InputStream inputStream2 = ftpClient.retrieveFileStream (
            RemoteFilePath) ؛

            بايت [] bytesArray = بايت جديد [4096] ؛
            int bytesRead = -1;
            // طالما أننا لم نصل إلى النهاية < br / > int المنقولة = 0 ؛
            int في المئة = 0 ؛
            بينما ((bytesRead = inputStream2.read (bytesArray)) != -1) {
            // bytes تتم كتابتها إلى الموقع المحدد
            outputStream2.write (bytesArray، 0، bytesRead);
            إعادة توجيه += بايت قراءة ؛
            بالمائة = (int) (منقول * 100 / حجم) ؛
            System.out.println(النسبة المئوية+"٪");
            }
            // إغلاق تدفقات قراءة الكتابة
            inputStream2.close ();
            outputStream2.close ();

            // br //
            الدقة = ftpClient.completePendingCommand();
            إذا (res) {
            System.out.println ("تم تنزيل الملف "+FileName2+
            " بنجاح");
            }

            } catch (IOException e) {
            System.out.println(e.getMessage());
            e.printStackTrace ();
            } أخيرا {
            جرب {
            if (ftpClient.isConnected()) {
            //close FTP
            ftpClient.logout();
            ftpClient.disconnect();
            }
            } الصيد (IOException ex) {
            ex.printStackTrace ();
            }
            }
            }
            }
            يشير تنفيذ هذا الرمز إلى نجاح التنزيل:

            بدء التنزيل
            تم تنزيل المكونات الإضافية والملف styles.txt بنجاح
            بدء التنزيل



            .
            .
            98٪
            99٪
            99٪
            100٪
            2.mp3 تم تنزيل ملف المسار بنجاح
            < / pre>< / div>