Récemment, j'ai rencontré la nécessité de télécharger des fichiers sur des serveurs Linux pendant le réaménagement, et maintenant j'ai trié les notes de code.
Cette méthode de connexion prend en compte le problème de concurrence et lors de la création d'une connexion FTP, chaque objet de connexion est stocké dans
ThreadLocal <ftp> pour garantir que chaque thread n'a aucun effet sur l'ouverture et la fermeture de FTP.
package com.test.utils; import java.io.bufferedInputStream; import java.io.file; import java.io.fileFilter; import java.io.fileinputStream; import java.itil.date; import java.util.List; import; org.apache.commons.logging.log; import org.apache.commons.logging.logfactory; importer com.jcraft.jsch.channelsftp; import com.jcraft.jsch.jsch; import com.jcraft.jsch.Session; public class ftp {// imprimer log log private static logger final logger final logger = Logfactory.getLog (ftp.class); Date statique privée last_push_date = null; Session privée SSHSESSION; canal privé Channel; TikeLocal statique privé <ftp> sftplocal = new ThreadLocal <ftp> (); FTP privé (String Host, int Port, String Username, String Motway) lève l'exception {jsch jsch = new JSCH (); jsch.getSession (nom d'utilisateur, hôte, port); // Obtenir la session sshSession = jsch.getSession (nom d'utilisateur, hôte, port); sshSession.SetPassword (mot de passe); // Modifiez la valeur de GSSAPIATUTHENTICATION dans le serveur / etc / ssh / sshd_config à oui à non, ce qui résout l'incapacité de l'utilisateur à se connecter à distance sshSession.setConfig ("userauth.gssapi-with-mic", "non"); // Définir les propriétés de l'objet de session. Lorsque vous accédez au serveur pour la première fois, vous n'avez pas besoin de saisir oui sshSession.setConfig ("stricThostKeyChing", "non"); sshSession.Connect (); // obtient le canal SFTP canal = (canauxftp) sshSession.Opennannel ("SFTP"); canal.connect (); Logger.info ("Connected FTP avec succès!" + SSHSession); } / ** * est-il connecté * * @return * / private booléen isConnected () {return null! = Channel && channel.isconnected (); } / ** * Obtenez le client SFTP stocké dans le thread local * * @return * @throws exception * / public static ftp getFftpUtil (String host, int port, string username, String Motway) lève exception {// Obtenez le thread local ftp sftputil = sftplocal.get (); if (null == sftpUtil ||! sftpUtil.isconnected ()) {// Empêchez la nouvelle connexion pour empêcher le thread local et implémentez le traitement concurrent sftplocal.set (nouveau FTP (hôte, port, nom d'utilisateur, mot de passe)); } return sftplocal.get (); } / ** * Libérez le client SFTP qui stocke le thread local * / public static void release () {if (null! = Sftplocal.get ()) {sftplocal.get (). ClosEchannel (); Logger.info ("Close Connection" + sftplocal.get (). SshSession); sftplocal.set (null); }} / ** * Close Channel * * @throws Exception * / public void clarchannel () {if (null! = Canal) {try {channel.disconnect (); } catch (exception e) {logger.error ("Exception s'est produite lors de la fermeture du canal SFTP:", e); }} if (null! = sshSession) {try {sshSession.disconnect (); } catch (exception e) {logger.error ("Sftp Close Session Exception:", e); }}} / ** * @param Directory Le répertoire de téléchargement ftp * @param uploadFile Directory de fichiers local * * / public void upload (string répertoire, string uploadfile) lève exception {trnty {<br> // Exécuter la liste de la liste de la liste LS Command Channel.ls (Directory); List <fichle> files = getFiles (uploadFile, new ArrayList <Fichier> ()); pour (int i = 0; i <files.size (); i ++) {file file = file.get (i); InputStream input = new BufferedInputStream (new FileInputStream (fichier)); channel.put (input, file.getName ()); essayez {if (input! = null) input.close (); } catch (exception e) {e.printStackTrace (); logger.error (file.getName () + "Exception lors de la fermeture du fichier ... Exception!" + e.getMessage ()); } if (file.exists ()) {boolean b = file.delete (); Logger.info (file.getName () + "Fichier Uploaded! Delete ID:" + b); }}}} catch (exception e) {logger.error ("[sous-répertoire est en cours de création]:", e); // Créer un sous-répertoire Channel.mkdir (répertoire); }} // Obtenir le fichier public list <File> getFiles (String realPath, list <fichle> fichiers) {file realFile = new File (realPath); if (realFile.isDirectory ()) {file [] subfiles = realfile.listFiles (new FileFilter () {@Override public booléan accepte (fichier file) {if (null == last_push_date) {return true;} else {long modifyDate = file.lastModified (); return ModifyDate> Last_push_Date. }); pour (fichier file: subfiles) {if (file.isdirectory ()) {getFiles (file.getAbsolutePath (), fichiers); } else {files.add (fichier); } if (null == last_push_date) {last_push_date = new Date (file.lastModified ()); } else {long modifyDate = file.lastModified (); if (modifyDate> last_push_date.getTime ()) {last_push_date = new Date (modifyDate); }}}} return fichiers; }}Résumer
Ce qui précède est la connexion à distance Java à Linux Server, exécuter des commandes et télécharger des fichiers introduits par l'éditeur. J'espère que ce sera utile à tout le monde. Si vous avez des questions, laissez-moi un message. L'éditeur répondra à tout le monde à temps!