최근에 재개발 중에 파일을 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.io.inputStream; import java.util.arraylist; import java.util.date; java.util.date; org.apache.commons.logging.log; import org.apache.commons.logging.logfactory; import com.jcraft.jsch.channelsftp; import com.jcraft.jsch.jsch; import com.jcraft.jsch.ssess; public class ftp {// print private log final logger = logfactory.getlog (ftactors); 개인 정적 날짜 last_push_date = null; 개인 세션 sshsession; 개인 Channelsftp 채널; Private STATIC THREADLOCAL <FTP> SFTPLOCAL = NEW THREADLOCAL <FTP> (); private ftp (문자열 호스트, int 포트, 문자열 사용자 이름, 문자열 비밀번호)는 예외 {jsch jsch = new jsch (); jsch.getSession (사용자 이름, 호스트, 포트); // 세션을 가져옵니다 sshsession = jsch.getSession (사용자 이름, 호스트, 포트); sshsession.setpassword (비밀번호); // 서버/etc/ssh/sshd_config에서 gssapiAuthentication의 값을 yes to yes to no로 수정합니다. 이는 사용자의 원격 sshsession을 로그인 할 수 없음을 해결합니다. // 세션 객체의 속성을 설정합니다. 서버에 처음 액세스 할 때 예 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 Exception * /public static ftp getsftputil (문자열 호스트, int 포트, 문자열 사용자 이름, 문자열 암호) 예외 {// 로컬 스레드 가져 오기 ftp sftputil = sftplocal.get (); if (null == sftputil ||! sftputil.isconnected ()) {// 로컬 스레드를 방지하고 동시 처리 sftplocal.set (new FTP (호스트, 포트, 사용자 이름, 암호))를 구현하기위한 새 연결을 방지; } 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); }} / ** * 닫기 채널 * * @Throws Exception * / public void closeChannel () {if (null! = Channel) {try {channel.disconnect (); } catch (예외 e) {logger.error ( "SFTP 채널을 닫을 때 예외가 발생했습니다 :", e); }} if (null! = sshsession) {try {sshsession.disconnect (); } catch (예외 e) {logger.error ( "sftp Close 세션 예외 :", e); }}} /*** @param 디렉토리 ftp* @param uploadfile 로컬 파일 디렉토리* /public void upload (문자열 디렉토리, String uploadfile)를 업로드하기위한 디렉토리 (string directory, string uploadfile) 예외 {try {<br> // execute list display ls command channel.ls (directory); <br> // 드라이브 문자 CD 채널 (dribling letter switching); 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 (입력, file.getName ()); try {if (input! = null) input.close (); } catch (예외 e) {e.printstacktrace (); logger.error (file.getName () + "파일을 닫을 때 예외 ... 예외!" + e.getMessage ()); } if (file.exists ()) {boolean b = file.delete (); logger.info (file.getName () + "파일 업로드! 삭제 ID :" + b); }}}} catch (예외 e) {logger.error ( "[하위 디렉토리가 생성되고 있습니다] :", e); // subdirectory channel.mkdir (directory) 만들기; }} // 파일 가져 오기 공개 목록 <file> getFiles (String realPath, List <file> 파일) {file realFile = 새 파일 (realPath); if (realfile.isdirectory ()) {file [] subfiles = realfile.listfiles (new filefilter () {@override public boolean acccept (파일 파일) {if (null == last_push_date) {return;} else {long modifydate = file.lastModified (); }}); for (파일 : subfiles) {if (file.isdirectory ()) {getfiles (file.getabsolutepath (), 파일); } else {files.add (파일); } if (null == last_push_date) {last_push_date = 새 날짜 (file.lastModified ()); } else {long modifyDate = file.lastModified (); if (modifyDate> last_push_date.gettime ()) {last_push_date = 새 날짜 (modifyDate); }}}} return files; }}요약
위의 것은 Linux 서버에 대한 Java 원격 연결, 명령을 실행하고 편집기가 소개 한 파일을 업로드하는 것입니다. 모든 사람에게 도움이되기를 바랍니다. 궁금한 점이 있으면 메시지를 남겨주세요. 편집자는 제 시간에 모든 사람에게 답장 할 것입니다!