تحميل الملفات إلى خادم FTP باستخدام Java
لكتابة كود Java الذي يقوم بتحميل الملفات من القرص المحلي إلى خادم FTP عبر الإنترنت، تعد واجهة برمجة تطبيقات Apache Commons Net خيارا جيدا جدا لمطوري Java. انها بسيطة ويجعل البرمجة مع FTP سهلة.
1- تحميل شبكة أباتشي كومنز
API download Apache Commons Net API الذي يحتوي على مجموعة من أدوات الشبكة ويدعم عدة بروتوكولات مثل: FTP و Telnet و SMTP ... بعد التحميل ، يجب تضمين ملف .jar في classpath.
2- واجهة برمجة تطبيقات Apache Commons Net لنقل الملفات عبر بروتوكول FTP
The class < span style = "عائلة الخط:" ساعي جديد" , " ساعي" ، حافلة صغيرة؛" >FTPClient< / span > يوفر طرقا لنقل ملف محلي إلى الخادم عبر الإنترنت عبر بروتوكول FTP:- boolean storeFile (سلسلة التحكم عن بعد ، InputStream المحلي) < / span >< / li>
- OutputStream storeFileStream (سلسلة عن بعد) < / span >< / li>
- مخزن منطقي UniqueFile (InputStream المحلي) < / span >< / li>
- boolean storeUniqueFile (سلسلة التحكم عن بعد ، InputStream المحلية) < / span >< / li>
- مخزن OutputStreamيونيك فيليستريم ()< / span>< / li>
- مخزن OutputStream يونيك فيليستريم (سلسلة عن بعد)< / span>< / li>< / ul> ما هو الفرق بين هذه الطرق؟ حسنا! يمكن تصنيفها على النحو التالي:
- تخزين الملفات عن طريق إعطاء a < span style = "عائلة الخط:" ساعي جديد" , " ساعي" ، حافلة صغيرة؛" >الإدخال ستريم< / سبان> من الملف المحلي (هذه هي الطرق التي تحتوي على a < span style = "عائلة الخط:" ساعي جديد" , " ساعي" ، حافلة صغيرة؛" >الإدخال ستريم< / سبان> كمعامل). يتم اعتماد هذا النوع من الأساليب عندما لا تحتاج إلى معرفة كيف. ال بايت يتم نقلها من الملف المحلي إلى الخادم. تركنا النظام يفعل ذلك. معالجة.
- تخزين الملفات عن طريق الكتابة إلى < span style = "عائلة الخط:" ساعي جديد" , " ساعي" ، حافلة صغيرة؛" >إكسيتستريم< / سبان> من الاتصال (هذه هي الطرق التي تحتوي على OutputStream كمخرجات). هذه الأنواع من الأساليب ضرورية عندما تريد التحكم في كيفية استخدام البايتات. هي إعادة توجيهها ، عن طريق كتابة التعليمات البرمجية الخاصة بنا لقراءة < span style = "عائلة الخط:" ساعي جديد" , " ساعي" ، حافلة صغيرة؛" >بايتسبان> عبر الملف المحلي الذي سيتم حفظه في مسار الملف البعيد من خلال الكائن < span style = "عائلة الخط:" ساعي جديد" , " ساعي" ، حافلة صغيرة؛" > OutputStream < / span >. يمكن أن يكون هذا مفيدا إذا كنت تريد إظهار التقدم من التحميل ، وحساب عدد البايتات التي يتم نقلها على حجم الملف .< / li>< / ul> يمكن استخدام الطريقتين المذكورتين أعلاه مع :
- قم بتسمية الملف البعيد بوضوح (تلك الطرق التي تقبل معلمة سلسلة تسمى remote).
- اترك أسماء الخادم والملف البعيد باسم فريد (هذه الطرق التي لا تحتوي على معلمة سلسلة).
على الرغم من تعقيد هذه الأساليب ، يتم استخدام طريقتين فقط بشكل أساسي في الممارسة: < / div>- boolean storeFile (سلسلة التحكم عن بعد ، InputStream المحلي) < / span >< / li>
- OutputStream storeFileStream (سلسلة عن بعد) < / span >< / li>< / ul >< / div>
بصرف النظر عن هذه الطرق الست ، هناك أيضا طريقتان أخريان يجب استدعاؤهما قبل وبعد تنزيل الملف: < / div>- setFileType(int fileType): يحدد نوع الملف، أي بروتوكول نقل الملفات. ASCII_FILE_TYPE أو FTP. BINARY_FILE_TYPE ، يستخدم لنقل الملف. النوع الافتراضي هو ASCII (نص عادي) ، ولكن يجب أن يكون ثنائيا حتى يعمل مع جميع الملفات. يجب استدعاء هذه الطريقة قبل بدء نقل الملف.
- < span style = "عائلة الخط:" ساعي جديد" , " ساعي" ، حافلة صغيرة؛" > منطقية completePendingCommand(): يجب استدعاء هذه الطريقة بعد اكتمال التنزيل لإكمال المعاملة. تعود < span style = "عائلة الخط:" ساعي جديد" , " ساعي" ، حافلة صغيرة؛" >صحيح< / سبان> إذا تم إكمال النقل بنجاح ، إذا لم يكن كذلك ؛ < span style = "عائلة الخط:" ساعي جديد" , " ساعي" ، حافلة صغيرة؛" >خطأ< / امتداد>. يجب التحقق من القيمة المرجعة لهذه الطريقة للتأكد من أن التحميل قد تم.
بشكل افتراضي، ينشئ FTP الاتصال عن طريق فتح منفذ للعميل ويسمح للخادم بالاتصال بهذا المنفذ. هذا هو الوضع النشط ، ولكن يتم حظره أحيانا بواسطة جدار الحماية ولا يعمل نقل الملفات. لحسن الحظ ، يحتوي بروتوكول FTP على وضع آخر وهو الوضع السلبي الذي يتم فيه إنشاء الاتصال ، عن طريق فتح منفذ في الخادم للعميل للاتصال. لا يتم حظر هذا الوضع بواسطة جدار الحماية.لذلك يوصى بالتبديل إلى الوضع السلبي قبل بدء نقل البيانات باستخدام استدعاء طريقة فئة FTPClient enterLocalPassiveMode().3- خطوات نقل ملف في Java
لكتابة الكود بشكل صحيح لنقل ملف إلى خادم FTP باستخدام Apache Commons Net API ، يجب اتباع الخطوات التالية:- Connect وقم بتسجيل الدخول إلى server.
- استخدام الوضع الخامل للاتصال.
- تغيير نوع الملف المراد نقله إلى binary.
- إنشاء نمط InputStream للملف المحلي.
- استدعاء إحدى الطرق المتجر... () لبدء نقل الملف. هناك سيناريوهان: < / li>
- باستخدام نمط InputStream< / span>: هذه هي أسهل طريقة لأنك تركت النظام يعتني بالإرسال والاستلام. لا يوجد رمز إضافي ، فقط قم بتمرير العنصر < span style = "عائلة الخط:" ساعي جديد" , " ساعي" ، حافلة صغيرة؛" >الإدخال ستريم< / سبان> في الطريقة المقابلة ، مثل الطريقة storeFile (سلسلة التحكم عن بعد ، InputStream المحلي) < / span >.< / li>
- Using < span style = "عائلة الخط:" ساعي جديد" , " ساعي" ، حافلة صغيرة؛" >OutputStream< / span>: هذا أكثر تعقيدا ، لكنك تكتسب مزيدا من التحكم في البيانات المنقولة. بشكل عام ، يتعين على المرء كتابة بضعة أسطر من التعليمات البرمجية لقراءة البايتات من < span style = "عائلة الخط:" ساعي جديد" , " ساعي" ، حافلة صغيرة؛" >الإدخال ستريم< / سبان> من الملف المحلي واكتب تلك البايتات إلى نمط OutputStream الذي يتم إرجاعه بواسطة طريقة المتجر... () ، مثل نمط storeFileStream (سلسلة عن بعد) < / span >.< / li>< / ul>
- إغلاق تدفقات البيانات < span style = "عائلة الخط:" ساعي جديد" , " ساعي" ، حافلة صغيرة؛" > المدخلات ستريم < / span > et   < span style = "عائلة الخط:" ساعي جديد" , " ساعي" ، حافلة صغيرة؛" >OutputStream< / span >.< / li>
- استدعاء الطريقة < span style = "عائلة الخط:" ساعي جديد" , " ساعي" ، حافلة صغيرة؛" >completePendingCommand()
لإكمال المعاملة.- قطع الاتصال بserver.
- Using < span style = "عائلة الخط:" ساعي جديد" , " ساعي" ، حافلة صغيرة؛" >OutputStream< / span>: هذا أكثر تعقيدا ، لكنك تكتسب مزيدا من التحكم في البيانات المنقولة. بشكل عام ، يتعين على المرء كتابة بضعة أسطر من التعليمات البرمجية لقراءة البايتات من < span style = "عائلة الخط:" ساعي جديد" , " ساعي" ، حافلة صغيرة؛" >الإدخال ستريم< / سبان> من الملف المحلي واكتب تلك البايتات إلى نمط OutputStream الذي يتم إرجاعه بواسطة طريقة المتجر... () ، مثل نمط storeFileStream (سلسلة عن بعد) < / span >.< / li>< / ul>
قيمة إرجاع الأساليب المتجر... () < / span > و completePendingCommand() للتأكد من اكتمال التحميل. - باستخدام نمط InputStream< / span>: هذه هي أسهل طريقة لأنك تركت النظام يعتني بالإرسال والاستلام. لا يوجد رمز إضافي ، فقط قم بتمرير العنصر < span style = "عائلة الخط:" ساعي جديد" , " ساعي" ، حافلة صغيرة؛" >الإدخال ستريم< / سبان> في الطريقة المقابلة ، مثل الطريقة storeFile (سلسلة التحكم عن بعد ، InputStream المحلي) < / span >.< / li>
يوضح هذا الرمز كيفية إرسال الملفات من الجهاز إلى خادم FTP باستخدام هاتين الطريقتين:4- برنامج تحميل Java
- boolean storeFile (سلسلة التحكم عن بعد ، InputStream المحلي) < / span >< / li>
- OutputStream storeFileStream (سلسلة عن بعد) < / span >< / li>< / ul > بعد استدعاء نمط storeFile () < / span> ، ليس من الضروري استدعاء completePendingCommand () < / span >. هنا هو الكود الكامل:
< pre class = "prettyprint lang-java" >import java.io.File ؛
import java.io.FileInputStream;
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;
من الفئة العامة FTPUploadFile {
الفراغ الثابت العام الرئيسي (سلسلة [] args) {
Server String = "ServerAddress" ؛
int port = 21 ؛
مستخدم السلسلة = "اسم المستخدم" ؛
كلمة مرور السلسلة = "كلمة المرور الخاصة بك" ؛
FTPClient ftpClient = FTPClient الجديد () ؛
جرب {
ftpClient.connect (الخادم ، المنفذ) ؛
ftpClient.login (المستخدم ، كلمة المرور) ؛
ftpClient.enterLocalPassiveMode();
ftpClient.setFileType(FTP. BINARY_FILE_TYPE) ؛
// النهج 1: تحميل ملف باستخدام ملف InputStream
= ملف جديد ("C: / plugins and styles.txt") ؛
مسار السلسلة = "الإضافات و styles.txt" ؛
InputStream inputStream = جديد FileInputStream (ملف) ؛
System.out.println ("بدء التحميل")؛
// إخراج upload
الدقة المنطقية = ftpClient.storeFile (المسار ، inputStream) ؛
// يغلق دفق القراءة
inputStream.close ();
if (res==true) {
System.out.println ("تم تنزيل الملف "+ path+" بنجاح") ؛
}
// النهج 2: تحميل ملف باستخدام ملف OutputStream
= ملف جديد ("C: / track 1.wma") ؛
path = "الصوت / المسار 1.wma" ؛
inputStream = ملف جديد InputStream (ملف) ؛
System.out.println ("بدء التحميل")؛
OutputStream outputStream = ftpClient.storeFileStream (المسار) ؛
بايت [] بايت = بايت جديد [4096] ؛
int buffer = 0 ؛
//طالما أننا لم نصل إلى نهاية الملف
System.out.println ("جار التنزيل ...") ؛
int المنقولة = 0 ؛
int في المئة = 0 ؛
// طالما أننا لم نصل إلى نهاية الملف
بينما ((buffer = inputStream.read (bytesIn)) != -1) {
//read البيانات بمخزن مؤقت يبلغ 4096 بايت
outputStream.write (بايت ، 0 ، مخزن مؤقت) ؛
نقل += المخزن المؤقت ؛
بالمائة = (int) (منقول * 100 / file.length ()) ؛
System.out.println(النسبة المئوية+"٪");
}
// إغلاق تدفقات قراءة الكتابة
inputStream.close ();
outputStream.close ();
// نتيجة التحميل
res = ftpClient.completePendingCommand ();
if (res) {
System.out.println ("تم تنزيل الملف "+path+" بنجاح");
}
} catch (IOException e) {
System.out.println(e.getMessage());
e.printStackTrace ();
} أخيرا {
جرب {
if (ftpClient.isConnected()) {
//close FTP
ftpClient.logout();
ftpClient.disconnect();
}
} الصيد (IOException ex) {
ex.printStackTrace ();
}
}
}
}إرجاع تنفيذ هذا الرمز أن النقل قد تم بنجاح:Start of upload
تم تنزيل المكونات الإضافية والملف styles.txt بنجاح
بدء التحميل
1٪
2٪
3٪
.
.
97٪
98٪
98٪
99٪
99٪
100٪
تم تنزيل ملف المسار 1.wma بنجاح - OutputStream storeFileStream (سلسلة عن بعد) < / span >< / li>< / ul > بعد استدعاء نمط storeFile () < / span> ، ليس من الضروري استدعاء completePendingCommand () < / span >. هنا هو الكود الكامل:
- OutputStream storeFileStream (سلسلة عن بعد) < / span >< / li>< / ul >< / div>
- OutputStream storeFileStream (سلسلة عن بعد) < / span >< / li>