Préface
Récemment, je dois interagir avec le serveur FTP dans mon projet. J'ai trouvé une classe d'outils sur le téléchargement FTP et le téléchargement sur Internet. Il existe environ deux types.
Le premier est une classe de motifs singleton.
Le deuxième type consiste à définir un autre service, qui implémente directement le téléchargement et le téléchargement de FTP via le service.
Ces deux sentiments ont des avantages et des inconvénients.
Le premier implémente la réutilisation du code, mais les informations de configuration doivent être écrites dans la classe, ce qui est plus compliqué à maintenir.
Le deuxième type est un framework Spring, les informations de configuration peuvent être injectées dynamiquement via le fichier Properties, mais le code ne peut pas être réutilisé.
Je prévois donc d'implémenter moi-même une classe d'outils pour intégrer les deux avantages ci-dessus. Soit dit en passant, certains problèmes courants pendant le processus de téléchargement ont également été résolus.
Parce que j'utilise le framework Spring, si la classe d'outils est déclarée Bean pour la gestion du printemps, c'est un singleton par défaut, donc je n'ai pas besoin d'implémenter à nouveau le singleton. Et parce qu'il s'agit d'un haricot, je peux injecter les propriétés du fichier de propriétés dans les propriétés du haricot pour se découpler. Ce qui suit est le code spécifique:
package com.cky.util; import java.io.file; import java.io.fileoutputStream; import java.io.ioexception; import java.io.inputstream; import java.io.outputstream; Importer org.apache.commons.net.ftp.ftpreply; import org.springframework.beans.factory.annotation.value; import org.springframework.sterereotype. // Injection automatique de @Value ("$ {ftp.host}") Hôte de chaîne privée; // FTP Server IP @Value ("$ {ftp.port}") Private int port; // FTP Server Port @Value ("$ {ftp.userName}") Private String Username; // username @ value ("$ {ftp.password}") Private String Password; // Password @Value ("$ {ftp.basepath}") String private String Basepath; // Exploiter le fichier de base du fichier // quand les test La méthode principale derrière le code / * public ftputil () {//system.out.println (this.toString ()); host = "192.168.100.77"; port = 21; username = "ftpuser"; mot de passe = "FTP54321"; BasEpath = "/ home / ftpuser /"; } * / / ** * * @param chemin le chemin du chemin pour télécharger le fichier sur le serveur * @param nom de fichier de téléchargement de fichier * @param input stream * @return * / public boolean fileupload (String path, string filen, inputStream input) {ftpClient ftp = new ftpclient (); essayez {ftp.connect (hôte, port); ftp.login (nom d'utilisateur, mot de passe); // Définissez le format de codage de fichier ftp.setControleCcoding ("UTF-8"); // Il y a deux modes de FTP Communication // Port (mode actif) Le client ouvre un nouveau port (> 1024) et envoie des commandes ou transmet des données via ce port. Au cours de cette période, le serveur utilise uniquement un port qu'il ouvre, tel que le client 21 // PASV (mode passif) envoie une commande PASV au serveur, le serveur ouvre un nouveau port (> 1024) et utilise ce port pour transmettre des données avec le port du client 21 // en raison du client incontrôlable, du ballon firef, etc., le port doit être ouvert par le serveur, et le mode passif FTP. // Définissez le mode de transmission sur le mode Stream ftp.setFileTransferMode (ftp.stream_transfer_mode); // Obtenez le code d'état pour déterminer si la connexion est réussie si (! Ftpreply.ispositivecompletion (ftp.getReplyCode ())) {Throw New RuntimeException ("FTP Server refuse de se connecter"); } // Accédez au répertoire racine du fichier téléchargé if (! Ftp.changeworkingDirectory (basepath)) {throw new RuntimeException ("Le répertoire racine n'existe pas, doit être créé"); } // juger si le répertoire existe if (! Ftp.changeworkingDirectory (path)) {String [] dirs = path.split ("/"); // Créer le répertoire pour (String dir: dirs) {if (null == dir || "". Equals (dir)) continue; // juge si le répertoire existe if (! Ftp.changeworkingDirectory (dir)) {// créer if (! Ftp.makedirectory (dir)) {lancez new runtimeException ("la création de subdirectory a échoué"); } // Entrez le répertoire nouvellement créé ftp.changeworkingDirectory (dir); }} // Définissez le type de fichier téléchargé sur le type binaire ftp.setFileType (ftp.binary_file_type); // Téléchargez le fichier if (! Ftp.storefile (nom de fichier, entrée)) {return false; } input.close (); ftp.logout (); Retour Vrai; }} catch (exception e) {lancer une nouvelle RuntimeException (e); } enfin {if (ftp.isconnected ()) {try {ftp.disconnect (); } catch (ioException e) {lancer une nouvelle RuntimeException (e); }}} return false; } / ** * * @param nom de fichier de fichier, note! Le nom de fichier ici est le nom de fichier plus le chemin, tel que: /2015/06/04/aa.jpg * @param store localPath à l'adresse locale * @return * / public boolean downloadfile (String filename, string localPath) {ftpclient ftp = new ftpClient (); essayez {ftp.connect (hôte, port); ftp.login (nom d'utilisateur, mot de passe); // Définissez le format de codage de fichier ftp.setControleCcoding ("UTF-8"); // Il existe deux modes de communication FTP // Le client du port (mode actif) ouvre un nouveau port (> 1024) et envoie des commandes ou transmet des données via ce port. Au cours de cette période, le serveur utilise uniquement un port qu'il ouvre, tel que le client 21 // PASV (mode passif) envoie une commande PASV au serveur, le serveur ouvre un nouveau port (> 1024) et utilise ce port pour transmettre des données avec le port du client 21 // le serveur a besoin pour ouvrir le port à partir du serveur car le client est incontrôlable, Firewall, etc., ftp.enterLocalPassiveMode (); // Définissez le mode de transmission sur le mode Stream ftp.setFileTransferMode (ftp.stream_transfer_mode); // Obtenez le code d'état pour déterminer si la connexion est réussie si (! Ftpreply.ispositivecompletion (ftp.getReplyCode ())) {Throw New RuntimeException ("FTP Server refuse de se connecter"); } int index = filename.LastIndexof ("/"); // Obtenez le chemin du chemin de la chaîne de fichiers Path = filename.substring (0, index); // obtient le nom de fichier String name = filename.substring (index + 1); // juge si le répertoire existe si (! Ftp.changeworkingDirectory (baspath + path)) {lancez new RuntimeException ("le chemin de fichier n'existe pas:" + baspath + path); } // Obtenez tous les fichiers dans ce répertoire ftpfile [] files = ftp.listFiles (); pour (FtpFile Fichier: fichiers) {// juger s'il existe un fichier cible //system.out.println("file name "+ file.getname () +" --- "+ name); if (file.getName (). equals (name)) {//system.out.println("file trouvé "); // Si trouvé, copiez le fichier cible dans le fichier local localfile = nouveau fichier (localPath + "/" + file.getName ()); OutputStream out = new FileOutputStream (localfile); ftp.RetReeveFile (file.getName (), out); out.close (); }} ftp.logout (); Retour Vrai; } catch (exception e) {lancer une nouvelle RuntimeException (e); } enfin {if (ftp.isconnected ()) {try {ftp.disconnect (); } catch (ioException e) {lancer une nouvelle RuntimeException (e); }}}} // Si l'une des deux fonctions est utilisée, l'autre doit être commenté sur le public static void main (String [] args) {// téléchargement test-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- e.printStackTrace (); } Enfin {} * / // Télécharger test------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------Utilisation spécifique
Étape 1: Configurez le ressort pour charger les fichiers de propriétés
applicationContext.xml
<contexte: propriété-placeholder location = "classpath: *. Propriétés" /> ftp.propertiesftp.host = 192.168.100.77ftp.port = 21ftp.username = ftpuserftp.password = ftp54321ftp.basepath = / home / ftpuser /
Étape 2: Déclarez la classe d'outils comme un haricot
Méthode XML
<bean id = "ftputil"> <propriété name = "host" value = "$ {ftp.host}"> </ propriété> <propriété name = "port" value = "$ {ftp.port}"> </ propriété> <propriété name = "username" value = "mot de passe" Value = "$ {ftp.password}"> </ propriété> <propriété name = "basepath" value = "$ {ftp.basepath}"> </paremac> </ank>Méthode d'annotation, balayage des composants
<Context: Component-Scan Base-Package = "com.cky.util"> </ Context: Component-Scan>
Partie 3: Injection et utilisation
@Autowired Private Ftputil ftputil;
Résumer
Ce qui précède est un résumé des problèmes de téléchargement et d'outil de téléchargement Spring FTP introduits par l'éditeur. J'espère que ce sera utile à tout le monde. Si vous avez des questions, veuillez me laisser un message et l'éditeur répondra à tout le monde à temps. Merci beaucoup pour votre soutien au site Web Wulin.com!