Artikel ini telah berbagi dengan Anda dua cara untuk mengunggah dan mengunduh file Java FTP untuk referensi Anda. Konten spesifiknya adalah sebagai berikut
Metode pertama:
Paket com.cloudpower.util; import java.io.file; impor java.io.fileInputStream; import java.io.fileoutputStream; import java.io.ioException; impor sun.net.telnetinputStream; impor sun.net.telnetoututputstream; Impor sun.netpeT; Ftp* @title: ftp.java* @author: zhou lingbin*/kelas publik ftp {/*** nama file lokal*/private string localfileName; / *** Nama File Jarak Jauh*/ Private String RemoteFileName; / *** klien ftp*/ private ftpClient ftpClient; /***koneksi server*@param ip server ip*@param port server port*@param nama pengguna pengguna*@param kata sandi kata sandi*@param path server path*@author zhou lingbin*@date 2012-7-11*/public void connectServer (string ip, int port, string user, string password, string path) {try {//* metode // ftpClient = ftpClient baru (); // ftpclient.openserver (ip, port); // metode kedua ftpClient = ftpClient baru (IP); ftpClient.login (pengguna, kata sandi); // diatur ke Binary Transmission ftpClient.Binary (); System.out.println ("Login Success!"); if (path.length ()! = 0) {// Sakelar direktori pada sistem jarak jauh ke direktori yang ditentukan oleh jalur parameter ftpclient.cd (path); } ftpclient.binary (); } catch (ioException ex) {ex.printstacktrace (); Lempar RuntimeException baru (EX); }} / *** Tutup koneksi* @author zhou lingbin* @date 2012-7-11* / public void closeConnect () {coba {ftpclient.closeServer (); System.out.println ("Putuskan Sukses"); } catch (ioException ex) {System.out.println ("Not Disconnect"); Ex.PrintStackTrace (); Lempar RuntimeException baru (EX); }} / *** Unggah file* @param localfile file lokal* @param file jarak jauh* @author zhou lingbin* @date 2012-7-11* / unggah public void (string localfile, string remoteFile) {this.localfilename = localfile; this.remoteFileName = remoteFile; TelnetoutputStream os = null; FileInputStream adalah = null; coba {// tambahkan file jarak jauh ke aliran output OS = ftpClient.put (this.remoteFileName); // Dapatkan aliran input file file lokal file_in = file baru (this.localfilename); is = new fileInputStream (file_in); // Buat Buffer Byte [] bytes = byte baru [1024]; int c; while ((c = is.read (bytes))! = -1) {os.write (bytes, 0, c); } System.out.println ("Unggah sukses"); } catch (ioException ex) {System.out.println ("Not Unggah"); Ex.PrintStackTrace (); Lempar RuntimeException baru (EX); } akhirnya {coba {if (is! = null) {is.close (); }} catch (ioException e) {E.PrintStackTrace (); } akhirnya {coba {if (os! = null) {os.close (); }} catch (ioException e) {E.PrintStackTrace (); }}}} / ** * Unduh File * @param RemoteFile Remote File Path (sisi server) * @param localfile local file path (klien) * @author zhou lingbin * @Date 2012-7-11 * / download public void (string remoteFile, string localfile) {telnetinputeam is = null; null; null; null; FileOutputStream OS = null; Coba {// Dapatkan nama file di mesin jarak jauh dan gunakan telnetinputStream untuk mentransfer file ke area lokal. IS = ftpClient.get (RemoteFile); File file_in = file baru (localfile); OS = FileOutputStream baru (file_in); byte [] bytes = byte baru [1024]; int c; while ((c = is.read (bytes))! = -1) {os.write (bytes, 0, c); } System.out.println ("Unduh Sukses"); } catch (ioException ex) {System.out.println ("not download"); Ex.PrintStackTrace (); Lempar RuntimeException baru (EX); } akhirnya {coba {if (is! = null) {is.close (); }} catch (ioException e) {E.PrintStackTrace (); } akhirnya {coba {if (os! = null) {os.close (); }} catch (ioException e) {E.PrintStackTrace (); }}}} public static void main (string agrs []) {string filePath [] = {"/temp/aa.txt", "/temp/regist.log"}; String localfilePath [] = {"c: //tmp//1.txt", "c: //tmp//2.log"}; Ftp fu = ftp baru (); /** Gunakan nomor port default, nama pengguna, kata sandi, dan direktori root untuk terhubung ke server FTP*/fu.connectserver ("127.0.0.1", 22, "anonim", "ieuser@", "/temp"); // unduh untuk (int i = 0; i <filepath.length; i ++) {fu.download (filepath [i], localfilePath [i]); } String localfile = "e: //number.txt"; String remoteFile = "/temp/haha.txt"; // unggah fu.upload (localfile, remotefile); fu.closeconnect (); }}
Tidak ada yang bisa dikatakan tentang metode ini, itu relatif sederhana, dan tidak ada masalah kode kacau Cina. Tampaknya ada cacat dan tidak dapat mengoperasikan file besar. Teman yang tertarik bisa mencobanya.
Metode kedua:
kelas publik ftpapche {private static ftpClient ftpClient = new ftpclient (); private static string encoding = System.getProperty ("File.encoding"); /** * Description: Upload file to the FTP server* * @Version1.0 * @param url * FTP server hostname * @param port * FTP server port* @param username * FTP login account* @param password * FTP login password* @param path * FTP server saves the directory, if it is the root directory, it is "/" * @param filename * File name uploaded to the Server ftp * input @param * aliran input file lokal * @Return mengembalikan true berhasil, sebaliknya false */ public static boolean unggah (string url, port int, nama pengguna string, kata sandi string, jalur string, nama file string, inputStream input) {boolean hasil = false; coba {int balasan; // Jika port default digunakan, Anda dapat langsung terhubung ke server FTP ftpClient.connect (url); // ftp.connect (url, port); // sambungkan ke server ftp // masuk ke ftpclient.login (nama pengguna, kata sandi); ftpClient.setControlencoding (encoding); // Verifikasi bahwa koneksi berhasil Balas = ftpclient.getReplyCode (); if (! ftpreply.ispositiveCompletion (balasan)) {System.out.println ("Koneksi gagal"); ftpclient.disconnect (); hasil pengembalian; } // Transfer Direktori Kerja ke Direktori Boolean Change = ftpClient.ChangeworkingDirectory (PATH); ftpClient.setFileType (ftp.binary_file_type); if (ubah) {result = ftpclient.storefile (string baru (filename.getbytes (encoding), "iso-8859-1"), input); if (result) {System.out.println ("Diunggah dengan sukses!"); }} input.close (); ftpclient.logout (); } catch (ioException e) {e.printstacktrace (); } akhirnya {if (ftpclient.isconnected ()) {coba {ftpclient.disconnect (); } catch (ioException IoE) {}}} hasil pengembalian; }/*** Unggah file lokal ke server ftp**/public void testUploadFromDisk () {coba {fileInputStream in = new fileInputStream (file baru ("e: /number.txt")); bendera boolean = unggahfile ("127.0.0.1", 21, "zlb", "123", "/", "haha.txt", in); System.out.println (flag); } catch (FileNotFoundException e) {e.printstacktrace (); } } /** * Description: Download file from the FTP server* * @Version1.0 * @param url * FTP server hostname * @param port * FTP server port* @param username * FTP login account* @param password * FTP login password* @param remotePath * Relative path on the FTP server* @param fileName * File name to be downloaded* @param localPath * Path to Simpan ke lokal setelah unduh * @return */ public static boolean downfile (string url, int port, string nama pengguna, kata sandi string, string remotePath, string fileName, string localpath) {boolean hasil = false; coba {int balasan; ftpClient.setControlencoding (encoding); / * * Untuk mengunggah dan mengunduh file Cina, beberapa tempat merekomendasikan untuk menggunakan dua kalimat berikut, bukan * string baru (remotePath.getbytes (pengkodean), "iso-8859-1") transcoding. * Setelah pengujian, itu tidak dapat dilewati. */// ftpClientConfig conf = ftpClientConfig baru (ftpClientConfig.syst_nt); // conf.setserverlanguagecode ("zh"); ftpclient.connect (url, port); // Jika port default digunakan, Anda dapat langsung terhubung ke server FTP dengan ftpclient.login (nama pengguna, kata sandi); // login // atur jenis transfer file ke ftpclient.setFileType (ftpclient.binary_file_type); // Dapatkan kode respons login FTP Balas = ftpClient.getReplyCode (); // Pastikan login berhasil if (! Ftpreply.ispositiveCompletion (balasan)) {ftpclient.disconnect (); System.err.println ("Server FTP menolak koneksi."); hasil pengembalian; } // Transfer ke direktori server FTP ke direktori yang ditentukan ftpclient.changeworkingdirectory (string baru (remotePath.getbytes (encoding), "iso-8859-1")); // Dapatkan daftar file ftpfile [] fs = ftpclient.listFiles (); untuk (ftpfile ff: fs) {if (ff.getName (). Equals (fileName)) {file localfile = file baru (localpath + "/" + ff.getName ()); OutputStream adalah = FileOutputStream baru (LocalFile); ftpClient.Retrievefile (ff.getName (), IS); is.close (); }} ftpclient.logout (); Hasil = Benar; } catch (ioException e) {e.printstacktrace (); } akhirnya {if (ftpclient.isconnected ()) {coba {ftpclient.disconnect (); } catch (ioException IoE) {}}} hasil pengembalian; }/** * Unduh file di server FTP ke lokal * */public void testdownFile () {coba {boolean flag = downfile ("127.0.0.1", 21, "zlb", "123", "/", "haha.txt", "D:/"); System.out.println (flag); } catch (Exception e) {E.PrintStackTrace (); }} public static void main (string [] args) {ftpapche fa = ftpapche baru (); fa.testdownfile (); }}
Dengan cara ini, Anda perlu memperhatikan masalah kode kacau Cina. Jika Anda mengaturnya secara tidak benar, nama file yang diunggah dapat menjadi kode yang kacau. Terkadang tidak dapat diunggah sama sekali. Tentu saja, Anda tidak akan meminta Anda karena tidak ada pengecualian. Saya telah menemukan banyak solusi online, dan ada banyak pendapat berbeda. Hampir semuanya disalin dari satu versi, dan saya belum diuji sendiri. Saya telah banyak menderita untuk ini. Ini secara kasar dibagi menjadi dua solusi berikut:
1. Tambahkan tiga kalimat berikut untuk menyelesaikannya
ftpClient.setControlencoding ("GBK");
FtpClientConfig conf = ftpClientConfig baru (ftpClientConfig.syst_nt);
conf.setserverlanguagecode ("zh");
Jawaban: Setelah pengujian, itu tidak berhasil, masalah di atas masih ada
2. Ini mirip dengan metode di atas, tetapi saya pikir metode ini lebih dapat diandalkan
Pertama, tambahkan kalimat ftpclient.setControlencoding ("GBK"); Dan kemudian, transkode semua orang Cina menjadi format "iso-8859-1", sebagai berikut:
ftpClient.ChangeworkingDirectory (string baru (remotePath.getbytes ("gbk"), "iso-8859-1"));
Jawaban: Setelah pengujian, itu masih tidak berhasil. Alasan saya mengatakan metode ini lebih dapat diandalkan. Silakan lanjutkan membaca.
Pertama, mari kita bicara tentang mengapa kita perlu mentranskode:
Karena dalam protokol FTP, nama file ditentukan untuk dikodekan sebagai ISO-8859-1, nama direktori atau nama file perlu ditranskode.
Pertanyaan selanjutnya adalah, pengkodean apa yang harus kita konversi ke format ini. Oleh karena itu, ada solusi kedua-mengonversi format GBK menjadi format ISO-8859-1. Selain itu, beberapa orang juga mengatakan bahwa ini harus dilakukan. Bahkan, saya pikir alasan mengapa mereka dapat mengatakan ini adalah kebetulan yang lengkap. Prinsipnya yang sebenarnya adalah bahwa karena format pengkodean yang ditentukan oleh protokol FTP adalah "ISO-8859-1", kami benar-benar harus mengonversi format dan kemudian secara otomatis mengonversinya ke format pengkodean sistem sendiri ketika server menerima file. Oleh karena itu, kunci bukan untuk menentukan format, tetapi untuk bergantung pada format pengkodean server FTP. Oleh karena itu, jika format pengkodean sistem FTP adalah "GBK", metode kedua pasti akan berhasil; Namun, jika format pengkodean sistem adalah "UTF-8", masih akan ada kode yang kacau. Oleh karena itu, kita hanya dapat memperoleh format pengkodean sistem melalui kode, dan kemudian mengonversinya ke format pengkodean ISO-8859-1 melalui format pengkodean ini. Metode akuisisi adalah sebagai berikut:
private static string encoding = System.getProperty ("File.encoding");
Semua kode di atas telah diuji sendiri, saya harap mereka dapat menyelesaikan masalah untuk semua orang!