บทความนี้ได้แชร์กับคุณสองวิธีในการอัปโหลดและดาวน์โหลดไฟล์ Java FTP สำหรับการอ้างอิงของคุณ เนื้อหาเฉพาะมีดังนี้
วิธีแรก:
แพ็คเกจ com.cloudpower.util; นำเข้า java.io.file; นำเข้า java.io.fileinputstream; นำเข้า java.io.fileoutputstream; นำเข้า java.io.ioException; นำเข้า sun.net.telnetinputstream; นำเข้า sun.net.telnetoutputtream; ftp* @title: ftp.java* @author: Zhou Lingbin*/คลาสสาธารณะ FTP {/*** ชื่อไฟล์ท้องถิ่น*/สตริงส่วนตัว LocalFileName; / *** ชื่อไฟล์ระยะไกล*/ สตริงส่วนตัว remotefilename; / *** ไคลเอนต์ ftp*/ private ftpclient ftpclient; /***การเชื่อมต่อเซิร์ฟเวอร์*@param IP Server IP*@param พอร์ตพอร์ตพอร์ต*@param ชื่อผู้ใช้ชื่อผู้ใช้*@param รหัสผ่าน*@param พา ธ พา ธ เซิร์ฟเวอร์*@author zhou lingbin*@date 2012-7-11*/โมฆะสาธารณะเชื่อมต่อ (สตริง ip, พอร์ต Method // ftpClient = new ftpClient (); // ftpClient.openserver (IP, พอร์ต); // วิธีที่สอง ftpClient = new ftpClient (IP); ftpclient.login (ผู้ใช้, รหัสผ่าน); // ตั้งค่าเป็นระบบส่งกำลังแบบไบนารี ftpClient.binary (); System.out.println ("ความสำเร็จในการเข้าสู่ระบบ!"); if (path.length ()! = 0) {// สลับไดเรกทอรีบนระบบระยะไกลเป็นไดเรกทอรีที่ระบุโดยพารามิเตอร์พา ธ ftpClient.cd (พา ธ ); } ftpClient.binary (); } catch (ioexception ex) {ex.printstacktrace (); โยน RuntimeException ใหม่ (Ex); }} / *** ปิดการเชื่อมต่อ* @author Zhou Lingbin* @date 2012-7-11* / โมฆะสาธารณะ closeconnect () {ลอง {ftpClient.loseserver (); System.out.println ("ตัดการเชื่อมต่อความสำเร็จ"); } catch (ioexception ex) {system.out.println ("ไม่ตัดการเชื่อมต่อ"); Ex.PrintStackTrace (); โยน RuntimeException ใหม่ (Ex); }} / *** อัปโหลดไฟล์* @param localfile ไฟล์ local* @param remotefile ไฟล์รีโมท* @author zhou lingbin* @date 2012-7-11* / โมฆะสาธารณะอัปโหลด (สตริง localfile, สตริงระยะไกล this.remotefilename = RemoteFile; TelnetOutputStream OS = NULL; FileInputStream คือ = null; ลอง {// เพิ่มไฟล์รีโมตลงในสตรีมเอาต์พุต OS = ftpClient.put (this.remotefilename); // รับสตรีมอินพุตของไฟล์ไฟล์โลคัลไฟล์ file_in = ไฟล์ใหม่ (this.localfilename); IS = ใหม่ FileInputStream (file_in); // สร้างบัฟเฟอร์ไบต์ [] bytes = ไบต์ใหม่ [1024]; int c; ในขณะที่ ((c = is.read (ไบต์))! = -1) {os.write (ไบต์, 0, c); } system.out.println ("อัปโหลดความสำเร็จ"); } catch (ioexception ex) {system.out.println ("ไม่อัปโหลด"); Ex.PrintStackTrace (); โยน RuntimeException ใหม่ (Ex); } ในที่สุด {ลอง {ถ้า (คือ! = null) {is.close (); }} catch (ioexception e) {e.printstacktrace (); } ในที่สุด {ลอง {ถ้า (os! = null) {os.close (); }} catch (ioexception e) {e.printstacktrace (); }}}} / ** * ดาวน์โหลดไฟล์ * @param RemoteFile Remote File Path (ฝั่งเซิร์ฟเวอร์) * @param LocalFile Local File Path (ไคลเอนต์) * @author Zhou Lingbin * @date 2012-7-11 * / โมฆะสาธารณะ fileOutputStream OS = null; ลอง {// รับชื่อไฟล์บนเครื่องระยะไกลและใช้ TelnetInputStream เพื่อถ่ายโอนไฟล์ไปยังพื้นที่ท้องถิ่น IS = ftpClient.get (RemoteFile); ไฟล์ file_in = ไฟล์ใหม่ (localfile); OS = ใหม่ fileOutputStream (file_in); ไบต์ [] ไบต์ = ไบต์ใหม่ [1024]; int c; ในขณะที่ ((c = is.read (ไบต์))! = -1) {os.write (ไบต์, 0, c); } system.out.println ("ดาวน์โหลดความสำเร็จ"); } catch (ioexception ex) {system.out.println ("ไม่ดาวน์โหลด"); Ex.PrintStackTrace (); โยน RuntimeException ใหม่ (Ex); } ในที่สุด {ลอง {ถ้า (คือ! = null) {is.close (); }} catch (ioexception e) {e.printstacktrace (); } ในที่สุด {ลอง {ถ้า (os! = null) {os.close (); }} catch (ioexception e) {e.printstacktrace (); }}}} โมฆะคงที่สาธารณะหลัก (สตริง agrs []) {สตริง 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"); // ดาวน์โหลดสำหรับ (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 {ส่วนตัว ftpClient ftpClient = new ftpClient (); การเข้ารหัสสตริงแบบคงที่ส่วนตัว = system.getProperty ("file.encoding"); /** * คำอธิบาย: อัปโหลดไฟล์ไปยังเซิร์ฟเวอร์ ftp * * @ @version1.0 * @param url * ftp server hostname * @param พอร์ต * พอร์ตเซิร์ฟเวอร์ ftp * @param ชื่อผู้ใช้ * ftp login accent * @param password * ftp passwate * @param server FTP Server * @param อินพุต * สตรีมอินพุตไฟล์ท้องถิ่น * @return return True ประสบความสำเร็จไม่เช่นนั้นเท็จ */ public Static Boolean uploadFile (url สตริง, พอร์ต int, ชื่อผู้ใช้สตริง, รหัสผ่านสตริง, เส้นทางสตริง, ชื่อไฟล์สตริง, อินพุตอินพุต) ลอง {int ตอบกลับ; // หากใช้พอร์ตเริ่มต้นคุณสามารถเชื่อมต่อโดยตรงกับเซิร์ฟเวอร์ FTP FTPClient.Connect (URL); // ftp.connect (url, พอร์ต); // เชื่อมต่อกับเซิร์ฟเวอร์ ftp // เข้าสู่ระบบไปยัง ftpclient.login (ชื่อผู้ใช้, รหัสผ่าน); ftpclient.setControlencoding (การเข้ารหัส); // ตรวจสอบว่าการเชื่อมต่อนั้นสำเร็จตอบกลับ = ftpClient.getReplyCode (); if (! ftpreply.ispositiveCompletion (ตอบกลับ)) {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 ()) {ลอง {ftpClient.disconnect (); } catch (ioexception ioe) {}}} ผลการส่งคืน; }/*** อัปโหลดไฟล์โลคัลไปยังเซิร์ฟเวอร์ ftp**/โมฆะสาธารณะ testuploadFromDisk () {ลอง {fileInputStream ใน = ใหม่ fileInputStream (ไฟล์ใหม่ ("e: /number.txt")); Boolean Flag = UploadFile ("127.0.0.1", 21, "zlb", "123", "/", "haha.txt", ใน); System.out.println (Flag); } catch (filenotfoundException e) {e.printStackTrace (); }} /** * คำอธิบาย: ดาวน์โหลดไฟล์จากเซิร์ฟเวอร์ ftp * * @ @เวอร์ชัน 1.0 * @param url * ftp server hostname * @param พอร์ต * พอร์ตเซิร์ฟเวอร์ ftp * @param ชื่อผู้ใช้ * ftp login password * @param to filto -to fildo * ท้องถิ่นหลังจากดาวน์โหลด * @return */ public Static Boolean downfile (url สตริง, พอร์ต int, string username, รหัสผ่านสตริง, สตริง remotepath, ชื่อไฟล์สตริง, สตริง localpath) {boolean result = false; ลอง {int ตอบกลับ; ftpclient.setControlencoding (การเข้ารหัส); / * * เพื่ออัปโหลดและดาวน์โหลดไฟล์ภาษาจีนบางแห่งแนะนำให้ใช้สองประโยคต่อไปนี้แทน * สตริงใหม่ (remotepath.getBytes (การเข้ารหัส), "ISO-8859-1") การแปลงรหัส * หลังจากการทดสอบไม่สามารถผ่านได้ */// ftpClientConfig conf = ใหม่ ftpClientConfig (ftpClientConfig.syst_nt); // conf.setserverlanguagecode ("zh"); ftpclient.connect (url, พอร์ต); // หากใช้พอร์ตเริ่มต้นคุณสามารถเชื่อมต่อโดยตรงกับเซิร์ฟเวอร์ FTP โดย ftpclient.login (ชื่อผู้ใช้รหัสผ่าน); // เข้าสู่ระบบ // ตั้งค่าประเภทการถ่ายโอนไฟล์เป็น binary ftpclient.setFileType (ftpClient.binary_file_type); // รับรหัสตอบกลับเข้าสู่ระบบ FTP ตอบ = ftpClient.getReplyCode (); // ตรวจสอบว่าการเข้าสู่ระบบนั้นสำเร็จถ้า (! ftpreply.ispositiveCompletion (ตอบกลับ)) {ftpClient.disconnect (); System.err.println ("เซิร์ฟเวอร์ FTP ปฏิเสธการเชื่อมต่อ"); ผลการกลับมา; } // ถ่ายโอนไปยังไดเรกทอรีเซิร์ฟเวอร์ FTP ไปยังไดเรกทอรีที่ระบุ ftpClient.changeWorkingDirectory (สตริงใหม่ (remotepath.getBytes (การเข้ารหัส), "ISO-8859-1")); // รับรายการไฟล์ ftpfile [] fs = ftpClient.listfiles (); สำหรับ (ftpfile ff: fs) {ถ้า (ff.getName (). เท่ากับ (ชื่อไฟล์)) {ไฟล์ localfile = ไฟล์ใหม่ (localPath + "/" + ff.getName ()); OutputStream คือ = ใหม่ fileOutputStream (localFile); ftpClient.RetrieveFile (ff.getName (), IS); is.close (); }} ftpClient.logout (); ผลลัพธ์ = จริง; } catch (ioexception e) {e.printstacktrace (); } ในที่สุด {if (ftpClient.isconnected ()) {ลอง {ftpClient.disconnect (); } catch (ioexception ioe) {}}} ผลการส่งคืน; }/** * ดาวน์โหลดไฟล์บนเซิร์ฟเวอร์ ftp ไปยัง local * */public void testdownfile () {ลอง {boolean flag = downfile ("127.0.0.1", 21, "zlb", "123", "/", "haha.txt", "d:/"); System.out.println (Flag); } catch (exception e) {e.printstacktrace (); }} โมฆะคงที่สาธารณะหลัก (สตริง [] args) {ftpapche fa = new ftpapche (); fa.testdownfile (); -
ด้วยวิธีนี้คุณต้องให้ความสนใจกับปัญหาของรหัสภาษาจีนที่อ่านไม่ออก หากคุณตั้งค่าไม่ถูกต้องชื่อไฟล์ที่อัปโหลดอาจเป็นรหัสที่อ่านไม่ออก บางครั้งมันไม่สามารถอัปโหลดได้เลย แน่นอนคุณจะไม่แจ้งให้คุณทราบเพราะไม่มีข้อยกเว้น ฉันพบวิธีแก้ปัญหาออนไลน์มากมายและมีความคิดเห็นที่แตกต่างกันมากมาย เกือบทั้งหมดถูกคัดลอกมาจากรุ่นเดียวและฉันยังไม่ได้รับการทดสอบด้วยตัวเอง ฉันได้รับความเดือดร้อนมากมายสำหรับเรื่องนี้ มันถูกแบ่งออกเป็นสองวิธีต่อไปนี้:
1. เพิ่มสามประโยคต่อไปนี้เพื่อแก้ปัญหา
ftpClient.setControlencoding ("GBK");
ftpClientConfig conf = ใหม่ 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");
รหัสทั้งหมดข้างต้นได้รับการทดสอบด้วยตัวเองฉันหวังว่าพวกเขาจะสามารถแก้ปัญหาสำหรับทุกคนได้!