您好,登錄后才能下訂單哦!
怎么在Java中使用jsch.jar實現上傳下載?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
package com.wdy.tools.utils.sftputil; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.util.Arrays; import java.util.Collections; import java.util.Properties; import java.util.Vector; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import com.jcraft.jsch.Channel; import com.jcraft.jsch.ChannelSftp; import com.jcraft.jsch.JSch; import com.jcraft.jsch.Session; /** * 利用jsch.jar針對sftp的上傳和下載 * 需要jar包: * commons-lang3-3.2.1.jar * commons-logging.jar * jsch-0.1.53.jar * log4j-1.2.17.jar * @author wangdy * */ public class JschSftpUtils { private static final Log log = LogFactory.getLog(JschSftpUtils.class); /** * 利用JSch包實現SFTP下載文件 * (這里是將serverPath下的指定擴展名的文件,全部下載到localPath下) * @param ip 主機IP * @param user 主機登陸用戶名 * @param psw 主機登陸密碼 * @param port 主機ssh3登陸端口,如果取默認值,傳<=0的值,如-1 * @param localPath 下載的本地目錄的路徑 * @param serverPath 服務器目錄 * @param fileExetension 文件擴展名,格式如:'.txt' * @param isDelete 是否刪除該路徑下擴展名為fileExetension的遠程文件 * @throws Exception */ public static void sshSftpDownload(String ip, String user, String psw, int port, String serverPath, String localPath, String fileExtension, boolean isDelete) throws Exception { Session session = null; Channel channel = null; JSch jsch = new JSch(); if (port <= 0) { // 連接服務器,采用默認端口 session = jsch.getSession(user, ip); } else { // 采用指定的端口連接服務器 session = jsch.getSession(user, ip, port); } // 如果服務器連接不上,則拋出異常 if (session == null) { throw new Exception("session is null"); } // 設置登陸主機的密碼 session.setPassword(psw);// 設置密碼 // 設置第一次登陸的時候提示,可選值:(ask | yes | no) // session.setConfig("StrictHostKeyChecking", "no"); Properties sshConfig = new Properties(); sshConfig.put("StrictHostKeyChecking", "no"); session.setConfig(sshConfig); // 設置登陸超時時間ms // session.connect(640); session.connect(); log.info("Session connected."); log.info("Opening Channel."); try { // 創建sftp通信通道 channel = (Channel) session.openChannel("sftp"); channel.connect(); // channel.connect(1000); ChannelSftp sftp = (ChannelSftp) channel; log.info("Connected to " + ip + "."); // 進入服務器指定的文件夾 sftp.cd(serverPath); /** * 列出服務器指定的文件列表(可以加參數,指明要下載的文件類型) * 說明:如果fileExtension不為空,則下載指定擴展名的文件集; * 如果fileExtension為"",則下載該目錄下所有類型的文件,如果是文件夾的話,會報錯,如果您路徑下有以.連接的文件夾,請注意,這是不可以的,程序會在過濾到該文件夾時中斷 */ Vector<?> v = null; if (fileExtension != null && !"".equals(fileExtension)) { v = sftp.ls("*"+fileExtension); }else { try { v = sftp.ls("*.*");//ls -al | grep \"^-\"只顯示文件---// ls -al | grep "^d"只顯示目錄包括.和.. } catch (Exception e) { log.info("您操作的是一個文件夾!"); } } for (int i = 0; i < v.size(); i++) { // log.info("fileInfos: "+v.get(i)); String[] fileInfos = v.get(i).toString().replaceAll("\t", " ").split(" "); String fileName = fileInfos[fileInfos.length-1]; log.info("fileName is: "+fileName); // 以下代碼實現從服務器下載一個文件到 本地 InputStream instream = sftp.get(fileName); OutputStream outstream = new FileOutputStream(new File(localPath+"/"+fileName)); byte b[] = new byte[1024]; int n; while ((n = instream.read(b)) != -1) { outstream.write(b, 0, n); } outstream.flush(); outstream.close(); instream.close(); log.info("文件["+fileName+"]下載成功!---->>>>下載到目錄["+localPath+"]中."); //下載成功后,刪除文件 if (isDelete) { deleteOneFile(serverPath, fileName, sftp); log.info("文件["+fileName+"]刪除成功!"); } } } catch (Exception e) { e.printStackTrace(); } finally { session.disconnect(); channel.disconnect(); } } /** * 利用JSch包實現SFTP上傳文件 * @param ip 主機IP * @param user 主機登陸用戶名 * @param psw 主機登陸密碼 * @param port 主機ssh3登陸端口,如果取默認值,傳<=0的值,如-1 * @param localPath 本地目錄 * @param serverPath 服務器目錄 * @param fileExtension 上傳文件的擴展名 格式如:'.txt' */ public static void sshSftpUpload(String ip, String user, String psw, int port,String localPath, String serverPath, String fileExtension) throws Exception { Session session = null; Channel channel = null; JSch jsch = new JSch(); if (port <= 0) { // 連接服務器,采用默認端口 session = jsch.getSession(user, ip); } else { // 采用指定的端口連接服務器 session = jsch.getSession(user, ip, port); } // 如果服務器連接不上,則拋出異常 if (session == null) { log.info("session is null,服務器連接失敗"); throw new Exception("session is null,服務器連接失敗"); }else { log.info("Connected Success, ip is ["+ip+"]"); } // 設置登陸主機的密碼 session.setPassword(psw);// 設置密碼 // 設置第一次登陸的時候提示,可選值:(ask | yes | no) session.setConfig("StrictHostKeyChecking", "no"); // 設置登陸超時時間ms session.connect(960); try { // 創建sftp通信通道 channel = (Channel) session.openChannel("sftp"); channel.connect(1000); ChannelSftp sftp = (ChannelSftp) channel; // 進入服務器指定的文件夾 sftp.cd(serverPath); // 列出服務器指定的文件列表 // Vector v = sftp.ls("*.sh"); // for (int i = 0; i < v.size(); i++) { // System.out.println(v.get(i)); // } // 以下代碼實現從本地上傳一個文件到服務器,如果要實現下載,對換一下流就可以了 String[] files = getLocalFileNameArray(localPath);//獲取所有文件名數組 for (int i = 0; i < files.length; i++) { String fileName = files[i]; if (fileExtension != null && !"".equals(fileExtension)) {//如果擴展名不為空,則上傳該路徑下指定擴展名的文件 if (fileName.endsWith(fileExtension)) { OutputStream outstream = sftp.put(fileName);//要上傳到服務器的文件,可以另外設個名字,也可以用本地的名稱 InputStream instream = new FileInputStream(new File(localPath+"/"+fileName));//讀取本地文件 byte b[] = new byte[1024]; int n; while ((n = instream.read(b)) != -1) { outstream.write(b, 0, n); } outstream.flush(); outstream.close(); instream.close(); log.info("文件["+localPath+"/"+fileName+"]上傳成功!---->>>>上傳到目錄["+serverPath+"]中."); }else { log.info("警告:文件["+fileName+"]不是指定類型["+fileExtension+"]的文件"); } }else {//如果擴展名為空,則上傳該路徑下的所有文件 OutputStream outstream = sftp.put(fileName);//要上傳到服務器的文件,可以另外設個名字,也可以用本地的名稱 InputStream instream = new FileInputStream(new File(localPath+"/"+fileName));//本地文件 byte b[] = new byte[1024]; int n; while ((n = instream.read(b)) != -1) { outstream.write(b, 0, n); } outstream.flush(); outstream.close(); instream.close(); log.info("文件["+fileName+"]上傳成功!---->>>>上傳到目錄["+serverPath+"]中."); } } } catch (Exception e) { e.printStackTrace(); } finally { session.disconnect(); channel.disconnect(); } } /** * 利用JSch包實現SFTP下載、上傳文件(該方法暫不適用) * @param ip 主機IP * @param user 主機登陸用戶名 * @param psw 主機登陸密碼 * @param port 主機ssh3登陸端口,如果取默認值(默認值22),傳-1 * @param privateKey 密鑰文件路徑 * @param passphrase 密鑰的密碼 * */ public static void sshSftp(String ip, String user, String psw ,int port ,String privateKey ,String passphrase) throws Exception{ Session session = null; Channel channel = null; JSch jsch = new JSch(); //設置密鑰和密碼 if (privateKey != null && !"".equals(privateKey)) { if (passphrase != null && "".equals(passphrase)) { //設置帶口令的密鑰 jsch.addIdentity(privateKey, passphrase); } else { //設置不帶口令的密鑰 jsch.addIdentity(privateKey); } } if(port <=0){ //連接服務器,采用默認端口 session = jsch.getSession(user, ip); }else{ //采用指定的端口連接服務器 session = jsch.getSession(user, ip ,port); } //如果服務器連接不上,則拋出異常 if (session == null) { throw new Exception("session is null"); } //設置登陸主機的密碼 session.setPassword(psw);//設置密碼 //設置第一次登陸的時候提示,可選值:(ask | yes | no) session.setConfig("StrictHostKeyChecking", "no"); //設置登陸超時時間 session.connect(30000); try { //創建sftp通信通道 channel = (Channel) session.openChannel("sftp"); channel.connect(1000); ChannelSftp sftp = (ChannelSftp) channel; //進入服務器指定的文件夾 sftp.cd("domains"); //列出服務器指定的文件列表 Vector<?> v = sftp.ls("*.txt"); for(int i=0;i<v.size();i++){ log.info(v.get(i)); } //以下代碼實現從本地上傳一個文件到服務器,如果要實現下載,對換以下流就可以了 OutputStream outstream = sftp.put("1.txt"); InputStream instream = new FileInputStream(new File("c:/print.txt")); byte b[] = new byte[1024]; int n; while ((n = instream.read(b)) != -1) { outstream.write(b, 0, n); } outstream.flush(); outstream.close(); instream.close(); } catch (Exception e) { e.printStackTrace(); } finally { session.disconnect(); channel.disconnect(); } } //***************Utils******************// /** * 讀取指定路徑下的所有文件 * @param localPath 指定路徑 * @return String[] 文件名數組 */ public static String[] getLocalFileNameArray(String localPath){ File diskFile = new File(localPath); String[] fileNameList = diskFile.list() ; if(fileNameList!=null){ //按照文件名倒序排序 Arrays.sort(fileNameList,Collections.reverseOrder()); } return fileNameList ; } /** * 刪除指定目錄的,指定擴展名的遠程文件 * @param directory 要刪除文件的目錄 * @param sftp ChannelSftp實體 * @param fileExtension 文件擴展名(刪除遠程文件,擴展名不能為空) */ public void deleteAll(String directory, ChannelSftp sftp, String fileExtension) { try { sftp.cd(directory); Vector<?> v = null; if (fileExtension !=null && "".equals(fileExtension)) { v=sftp.ls("*"+fileExtension); }else { // v=sftp.ls("");//此處有風險 log.warn("FileExtension is not null! Please Check"); } for (int i = 0; i < v.size(); i++) { String[] fileInfos = v.get(i).toString().replaceAll("\t", " ").split(" "); String fileName = fileInfos[fileInfos.length-1]; sftp.rm(fileName); } } catch (Exception e) { e.printStackTrace(); } } /** * 刪除單個文件 * * @param directory * 要刪除文件所在目錄 * @param deleteFile * 要刪除的文件 * @throws Exception */ public static void deleteOneFile(String directory, String deleteFile, ChannelSftp sftp) throws Exception { sftp.cd(directory); sftp.rm(deleteFile); } }
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。