Cet article a partagé avec vous deux façons de télécharger et de télécharger des fichiers Java FTP pour votre référence. Le contenu spécifique est le suivant
La première méthode:
Package com.cloudpower.util; import java.io.file; import java.io.fileInputStream; import java.io.fileoutputStream; importer java.io.ioexception; importer sun.net.telnetinputstream; @Title: ftp.java * @author: zhou lingbin * / classe publique ftp {/ ** * nom de fichier local * / chaîne privée localFileName; / ** * Nom du fichier distant * / chaîne privée RemoteFileName; / ** * FTP Client * / private ftpClient ftpClient; / ** * Connexion du serveur * @param ip serveur ip * @param port de serveur de serveur * @param nom d'utilisateur * @param mot de passe mot de passe * @param path du serveur path * @author zhou lingbin * @date 2012-7-11 * / public void Connectserver (String ip, int, utilisateur de chaîne, String mot de passe, String Path) {try {/ *******. méthode // ftpClient = new ftpclient (); // ftpclient.openserver (ip, port); // la deuxième méthode ftpClient = new ftpClient (ip); ftpclient.login (utilisateur, mot de passe); // défini sur la transmission binaire ftpclient.binary (); System.out.println ("Login Success!"); if (path.length ()! = 0) {// Communiquez le répertoire sur le système distant au répertoire spécifié par le paramètre Path ftpClient.cd (path); } ftpclient.binary (); } catch (ioException ex) {ex.printStackTrace (); lancer un nouveau RuntimeException (ex); }} / ** * Fermez la connexion * @author zhou lingbin * @date 2012-7-11 * / public void closeConnect () {try {ftpclient.closeServer (); System.out.println ("Débrancher le succès"); } catch (ioException ex) {System.out.println ("pas déconnecter"); ex.printStackTrace (); lancer un nouveau RuntimeException (ex); }} / ** * Fichier de téléchargement * @param Fichier local local local * @Param RemoteFile Fichier 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 est = null; essayez {// ajouter le fichier distant au flux de sortie os = ftpclient.put (this.remoteFileName); // obtient le flux d'entrée du fichier de fichier local fichier_in = nouveau fichier (this.localFileName); is = new FileInputStream (file_in); // Créer un octet tampon [] octets = nouveau octet [1024]; INT C; while ((c = is.read (octets))! = -1) {os.write (octets, 0, c); } System.out.println ("Télécharger le succès"); } catch (ioException ex) {System.out.println ("Not Télécharger"); ex.printStackTrace (); lancer un nouveau RuntimeException (ex); } enfin {try {if (is! = null) {is.close (); }} catch (ioException e) {e.printStackTrace (); } enfin {try {if (os! = null) {os.close (); }} catch (ioException e) {e.printStackTrace (); }}}} / ** * Télécharger le fichier * @Param RemoteFile Remote Fichier Chemin (côté serveur) * @param LocalFile Local File Path (Client) * @author Zhou Lingbin * @Date 2012-7-11 * / public void Download (String Remotefile, String Localfile) {telnetinInputStream Is = Null; FileoutputStream os = null; Essayez {// Obtenez le nom de fichier sur la machine distante et utilisez TelneTinputStream pour transférer le fichier vers la zone locale. is = ftpClient.get (RemoteFile); File file_in = new File (localfile); OS = new FileOutputStream (file_in); octet [] octets = nouveau octet [1024]; INT C; while ((c = is.read (octets))! = -1) {os.write (octets, 0, c); } System.out.println ("Télécharger le succès"); } catch (ioException ex) {System.out.println ("pas télécharger"); ex.printStackTrace (); lancer un nouveau RuntimeException (ex); } enfin {try {if (is! = null) {is.close (); }} catch (ioException e) {e.printStackTrace (); } enfin {try {if (os! = null) {os.close (); }} catch (ioException e) {e.printStackTrace (); }}}} public static void main (String agrs []) {String filepath [] = {"/temp/aa.txt", "/tempist/regist.log"}; String localFilePath [] = {"c: //tmp//1.txt", "c: //tmp//2.log"}; Ftp fu = new ftp (); / * * Utilisez le numéro de port par défaut, le nom d'utilisateur, le mot de passe et le répertoire racine pour se connecter au serveur FTP * / fu.connectServer ("127.0.0.1", 22, "anonymous", "ieuser @", "/ temp"); // Télécharger pour (int i = 0; i <filepath.length; i ++) {fu.Download (filepath [i], localFilePath [i]); } String localfile = "e: //number.txt"; String RemoteFile = "/Temp/haha.txt"; // Télécharger FU.upload (LocalFile, RemoteFile); fu.closeConnect (); }}
Il n'y a rien à dire sur cette méthode, c'est relativement simple et il n'y a pas de problème de code brouillé chinois. Il semble qu'il y ait un défaut et ne peut pas utiliser de fichiers volumineux. Les amis intéressés peuvent l'essayer.
La deuxième méthode:
classe publique ftpapche {private static ftpClient ftpClient = new ftpClient (); Encoding de chaîne statique privée = System.getProperty ("file.encoding"); / ** * Description: Téléchargez le fichier sur le serveur FTP * * @ version1.0 * @param url * FTP Server Hostname * @Param Port * FTP Server Port * @param nom d'utilisateur * FTP CONCOUPE * @param mot de passe * FTP Login Motword FTP Server * @param entrée * Stream d'entrée de fichier local * @return renvoie true avec succès, sinon Faux * / public static boolean uploadfile (URL de chaîne, port int, nom d'utilisateur de chaîne, mot de passe de chaîne, chemin de chaîne, nom de fichier de chaîne, entrée InputStream) {boolean result = false; essayez {int réponse; // Si le port par défaut est utilisé, vous pouvez vous connecter directement au serveur FTP ftpClient.connect (URL); // ftp.connect (URL, port); // Connectez-vous au serveur FTP // Connectez-vous à ftpclient.login (nom d'utilisateur, mot de passe); ftpClient.setControleCcoding (codage); // Vérifiez que la connexion est une réponse réussie = ftpClient.getReplyCode (); if (! ftpreply.ispositivecompletion (réponse)) {System.out.println ("Connexion Échec"); ftpClient.disconnect (); Résultat de retour; } // Transférer le répertoire de travail vers le répertoire spécifié Boolean Change = ftpClient.changeworkingDirectory (path); ftpClient.setFileType (ftp.binary_file_type); if (modifier) {result = ftpclient.storefile (new String (filename.getBytes (Encoding), "ISO-8859-1"), entrée); if (result) {System.out.println ("Téléchargé avec succès!"); }} input.close (); ftpClient.logout (); } catch (ioException e) {e.printStackTrace (); } enfin {if (ftpclient.isconnected ()) {try {ftpClient.disconnect (); } catch (ioException ioe) {}}} Retour Result; } / ** * Téléchargez les fichiers locaux sur le serveur FTP * * / public void TESTUPLOADFROMDISK () {try {fileInputStream dans = new FileInputStream (new File ("e: /Number.txt")); booléen flag = uploadfile ("127.0.0.1", 21, "zlb", "123", "/", "haha.txt", in); System.out.println (drapeau); } catch (filenotFoundException e) {e.printStackTrace (); }} / ** * Description: Téléchargez le fichier depuis le serveur FTP * * @ version1.0 * @param URL * FTP Server Hostname * @Param Port * FTP Server Port * @param Username * FTP Login Compte * @param mot de passe * FTP Mot de passe de connexion * @Param Remotepath * PATH RELATING LOCALPE * @PARAM FILENAM Enregistrer sur local après téléchargement * @return * / public static boolean downfile (URL de chaîne, port int, nom d'utilisateur de chaîne, mot de passe de chaîne, chaîne remotepath, nom de file, chaîne localPath) {booléen result = false; essayez {int réponse; ftpClient.setControleCcoding (codage); / * * Afin de télécharger et de télécharger des fichiers chinois, certains endroits recommandent d'utiliser les deux phrases suivantes au lieu de * Nouvelle chaîne (Remotepath.getBytes (Encoding), "ISO-8859-1"). * Après les tests, il ne peut pas être passé. * /// ftpclientconfig conf = new ftpclientconfig (ftpclientconfig.syst_nt); // conf.setserverlanguagecode ("zh"); ftpClient.connect (URL, port); // Si le port par défaut est utilisé, vous pouvez vous connecter directement au serveur FTP par ftpclient.login (nom d'utilisateur, mot de passe); // Login // Définissez le type de transfert de fichier sur binaire ftpclient.setFileType (ftpclient.binary_file_type); // Obtenez le code de réponse de connexion FTP Répondre = ftpClient.getReplyCode (); // Vérifiez que la connexion est réussie si (! Ftpreply.ispositivecompletion (réponse)) {ftpClient.disconnect (); System.err.println ("FTP Server Refused Connection."); Résultat de retour; } // Transférer vers le répertoire FTP Server vers le répertoire spécifié ftpClient.changeworkingDirectory (nouvelle chaîne (RemotePath.getBytes (Encoding), "ISO-8859-1")); // obtient la liste de fichiers ftpfile [] fs = ftpclient.listFiles (); for (ftpfile ff: fs) {if (ff.getName (). equals (fileName)) {file localfile = new file (localPath + "/" + ff.getName ()); OutputStream est = new FileOutputStream (localFile); ftpClient.RetReeveFile (ff.getName (), IS); is.close (); }} ftpclient.logout (); résultat = true; } catch (ioException e) {e.printStackTrace (); } enfin {if (ftpclient.isconnected ()) {try {ftpClient.disconnect (); } catch (ioException ioe) {}}} Retour Result; } / ** * Téléchargez le fichier sur le serveur FTP vers le TestDownFile de TestDown (Public void Public * / Public Void () {try {boolean flag = downfile ("127.0.0.1", 21, "zlb", "123", "/", "haha.txt", "d: /"); System.out.println (drapeau); } catch (exception e) {e.printStackTrace (); }} public static void main (string [] args) {ftpapche fa = new ftpapche (); fa.TestdownFile (); }}
De cette façon, vous devez faire attention au problème du code brouillé chinois. Si vous le définissez à tort, le nom de fichier téléchargé peut être un code brouillé. Parfois, il ne peut pas être téléchargé du tout. Bien sûr, vous ne vous inviterez pas car il n'y a pas d'exception. J'ai trouvé de nombreuses solutions en ligne, et il existe de nombreuses opinions différentes. Presque tous ont été copiés à partir d'une seule version, et je n'ai pas été testé par moi-même. J'ai beaucoup souffert pour ça. Il est à peu près divisé en les deux solutions suivantes:
1. Ajoutez les trois phrases suivantes pour le résoudre
ftpClient.setControleCcoding ("gbk");
FtpClientConfig conf = new ftpClientConfig (ftpclientconfig.syst_nt);
Conf.SetServerLanguageCode ("Zh");
Réponse: Après les tests, cela ne fonctionne tout simplement pas, le problème ci-dessus existe toujours
2. Il est similaire à la méthode ci-dessus, mais je pense que cette méthode est plus fiable
Tout d'abord, ajoutez la phrase ftpclient.setControleCcoding ("gbk"); Et puis, transcode tous les chinois au format "ISO-8859-1", comme suit:
ftpClient.changeworkingDirectory (new String (remotepath.getBytes ("gbk"), "iso-8859-1"));
Réponse: Après les tests, cela ne fonctionne toujours pas. La raison pour laquelle j'ai dit cette méthode est plus fiable. Veuillez continuer à lire.
Tout d'abord, parlons de la raison pour laquelle nous devons transcoder:
Étant donné que dans le protocole FTP, le nom de fichier est spécifié pour être codé sous le nom d'ISO-8859-1, le nom du répertoire ou le nom du fichier doit être transcodé.
La question suivante est: quel codage devrions-nous nous convertir à ce format. Par conséquent, il existe une deuxième solution - convertissant le format GBK au format ISO-8859-1. De plus, certaines personnes disent également que cela doit être fait. En fait, je pense que la raison pour laquelle ils peuvent dire que c'est une coïncidence complète. Son vrai principe est que comme le format de codage spécifié par le protocole FTP est "ISO-8859-1", nous devons vraiment convertir le format, puis le convertir automatiquement au format de codage du système lorsque le serveur reçoit le fichier. Par conséquent, la clé n'est pas de spécifier le format, mais de dépendre du format de codage du serveur FTP. Par conséquent, si le format de codage du système FTP est "GBK", la deuxième méthode réussira certainement; Cependant, si le format de codage du système est "UTF-8", il y aura toujours du code brouillé. Par conséquent, nous ne pouvons obtenir que le format de codage du système via le code, puis le convertir au format de codage de ISO-8859-1 via ce format de codage. La méthode d'acquisition est la suivante:
Encoding de chaîne statique privée = System.getProperty ("file.encoding");
Tous les codes ci-dessus ont été testés par vous-même, j'espère qu'ils pourront résoudre le problème pour tout le monde!