最近、再開発中にファイルをLinuxサーバーにアップロードする必要性に遭遇しましたが、今ではコードノートを整理しました。
この接続メソッドは同時実行の問題を考慮し、FTP接続を作成するとき、各接続オブジェクトはに保存されます
ThreadLocal <FTP>各スレッドがFTPの開閉に影響を与えないことを確認します。
パッケージcom.test.utils; Import java.io.bufferedinputStream; Import java.io.file; Import java.io.filefilter; Import java.io.fileinputStream; Import java.ionputStream; Import java.util.arraylist; Import java.util.util.date; import Java.util.date; org.apache.commons.logging.log; Import org.apache.commons.logging.logactory; import com.jcraft.jsch.channelftp; Import com.jcraft.jsch.jsch; Import com.jcraft.jsch.session; public class ftp {// print log log log final logjers.get. private static date last_push_date = null;プライベートセッションsshsession;プライベートチャネルFTPチャネル。 private static threadlocal <ftp> sftplocal = new threadlocal <ftp>(); private ftp(string host、int port、string username、string password)スロー例外{jsch jsch = new jsch(); jsch.getsession(username、host、port); //セッションsshsession = jsch.getSession(username、host、port)を取得します。 sshsession.setPassWord(パスワード); //サーバーのgssapiauthenticationの値を変更します//セッションオブジェクトのプロパティを設定します。サーバーに初めてアクセスするときは、yes sshsession.setconfig( "stricthostkeychecking"、 "no")を入力する必要はありません。 sshsession.connect(); // sftpチャネルチャネル=(channelsftp)sshsession.openchannel( "sftp");を取得します。 channel.connect(); logger.info( "接続ftpに正常に!" + sshsession); } / ** *接続 * * @return * / private boolean isconnected(){return null!= channel && channel.isconnected(); } /** *ローカルスレッドに保存されているSFTPクライアントを取得 * * @return * @throws例外 * /public static ftp getSftputil(string host、int port、string username、string password)スロー例外{//ローカルスレッドftp sftputil = sftplocal.get(); if(null == sftputil ||!sftputil.isconnected()){//ローカルスレッドを防止し、同時処理sftplocal.set(new ftp(host、port、username、password))を実装するために新しい接続を防ぎます); } return sftplocal.get(); } / ***ローカルスレッドを保存するSFTPクライアントをリリースします* / public static void release(){if(null!= sftplocal.get()){sftplocal.get()。closechannel(); logger.info( "close connection" + sftplocal.get()。sshsession); sftplocal.set(null); }} / ** * close channel * * @throws例外 * / public void closechannel(){if(null!= channel){try {channel.disconnect(); } catch(Exception e){logger.error( "SFTPチャネルを閉じるときに例外が発生しました:"、e); }} if(null!= sshsession){try {sshsession.disconnect(); } catch(Exception e){logger.error( "sftp close session例外:"、e); }}} /*** @paramディレクトリftpをアップロードするためのディレクトリ* @param uploadfileローカルファイルディレクトリ** /public void upload(string directory、string uploadfile)スロー{try {<br> // execute list ls command channel.ls(ディレクトリ); <br> List <file> files = getFiles(uploadFile、new ArrayList <file>()); for(int i = 0; i <files.size(); i ++){file file = files.get(i); inputstream input = new BufferedInputStream(new FileInputStream(file)); Channel.put(input、file.getName()); try {if(input!= null)input.close(); } catch(Exception e){e.printstacktrace(); logger.error(file.getName() + "ファイルを閉じるときの例外...例外!" + e.getMessage()); } if(file.exists()){boolean b = file.delete(); logger.info(file.getname() + "file uploded!delete id:" + b); }}}} catch(Exception E){logger.error( "[subdirectoryが作成されている]:"、e); // Subdirectory Channel.mkdir(ディレクトリ)を作成します。 }} // get file public list <file> getFiles(string realpath、list <file> files){file realfile = new file(realpath); if(realfile.isdirectory()){file [] subfiles = realfile.listfiles(new filefilter(){@override public boolean accept(file file){if(null == last_push_date){return true;} else {long modifiedate = file.lastmodified( }}); for(file file:subfiles){if(file.isdirectory()){getFiles(file.getabsolutepath()、files); } else {files.add(file); } 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ファイル; }}要約します
上記は、LinuxサーバーへのJavaリモート接続、コマンドを実行し、エディターが導入したファイルをアップロードします。私はそれが誰にでも役立つことを願っています。ご不明な点がございましたら、メッセージを残してください。編集者は、すべての人に時間内に返信します!