SFTP上传下载文件工具类
生活随笔
收集整理的這篇文章主要介紹了
SFTP上传下载文件工具类
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
最近有個需求:前臺傳遞文件(圖片)到后臺,需要將此上傳到遠程服務器上,再次記錄下整個流程和涉及到的工具類
工具類:
package com.jsyd.ict.ictservicemanager.util.file;import com.jcraft.jsch.*; import org.apache.commons.io.IOUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory;import java.io.*; import java.util.Properties; import java.util.Vector;/**** SFTP工具類* @author wangyang* @version 1.0* @date 2021/3/18 17:12*/ public class SFtpUtil {private static final Log LOG = LogFactory.getLog(SFtpUtil.class);private ChannelSftp sftp;private Session session;/** FTP 登錄用戶名*/private String username;/** FTP 登錄密碼*/private String password;/** 私鑰 */private String privateKey;/** FTP 服務器地址IP地址*/private String host;/** FTP 端口*/private int port;public SFtpUtil(String username, String password, String host, int port) {this.username = username;this.password = password;this.host = host;this.port = port;}/*** 構造基于秘鑰認證的sftp對象* @param username* @param host* @param port* @param privateKey*/public SFtpUtil(String username, String host, int port, String privateKey) {this.username = username;this.host = host;this.port = port;this.privateKey = privateKey;}public SFtpUtil(){}/*** 連接sftp服務器** @throws Exception*/public void login(){try {JSch jsch = new JSch();if (privateKey != null) {// 設置私鑰jsch.addIdentity(privateKey);LOG.info("sftp connect by private key file");}session = jsch.getSession(username, host, port);LOG.info("Session is build");if (password != null) {session.setPassword(password);}Properties config = new Properties();config.put("StrictHostKeyChecking", "no");session.setConfig(config);session.connect();LOG.info("Session is connected");Channel channel = session.openChannel("sftp");channel.connect();LOG.info("channel is connected");sftp = (ChannelSftp) channel;LOG.info(String.format("sftp server host:[%s] port:[%s] is connect successfull", host, port));} catch (JSchException e) {LOG.error("Cannot connect to specified sftp server");}}/*** 關閉連接 server*/public void logout(){if (sftp != null) {if (sftp.isConnected()) {sftp.disconnect();LOG.info("sftp is closed already");}}if (session != null) {if (session.isConnected()) {session.disconnect();LOG.info("sshSession is closed already");}}}/*** 將輸入流的數據上傳到sftp作為文件** @param directory* 上傳到該目錄* @param sftpFileName* sftp端文件名* @param input* 輸入流* @throws SftpException* @throws Exception*/public void upload(String directory, String sftpFileName, InputStream input) throws SftpException{try {sftp.cd(directory);} catch (SftpException e) {LOG.warn("directory is not exist");sftp.mkdir(directory);sftp.cd(directory);}sftp.put(input, sftpFileName);LOG.info("file upload successful");}/*** 上傳單個文件** @param directory* 上傳到sftp目錄* @param uploadFile* 要上傳的文件,包括路徑* @throws FileNotFoundException* @throws SftpException* @throws Exception*/public void upload(String directory, String uploadFile) throws FileNotFoundException, SftpException{File file = new File(uploadFile);upload(directory, file.getName(), new FileInputStream(file));}/*** 將byte[]上傳到sftp,作為文件。注意:從String生成byte[]是,要指定字符集。** @param directory* 上傳到sftp目錄* @param sftpFileName* 文件在sftp端的命名* @param byteArr* 要上傳的字節數組* @throws SftpException* @throws Exception*/public void upload(String directory, String sftpFileName, byte[] byteArr) throws SftpException{upload(directory, sftpFileName, new ByteArrayInputStream(byteArr));}/*** 將字符串按照指定的字符編碼上傳到sftp** @param directory* 上傳到sftp目錄* @param sftpFileName* 文件在sftp端的命名* @param dataStr* 待上傳的數據* @param charsetName* sftp上的文件,按該字符編碼保存* @throws UnsupportedEncodingException* @throws SftpException* @throws Exception*/public void upload(String directory, String sftpFileName, String dataStr, String charsetName) throws UnsupportedEncodingException, SftpException{upload(directory, sftpFileName, new ByteArrayInputStream(dataStr.getBytes(charsetName)));}/*** 下載文件** @param directory* 下載目錄* @param downloadFile* 下載的文件* @param saveFile* 存在本地的路徑* @throws SftpException* @throws FileNotFoundException* @throws Exception*/public void download(String directory, String downloadFile, String saveFile) throws SftpException, FileNotFoundException{if (directory != null && !"".equals(directory)) {sftp.cd(directory);}File file = new File(saveFile);sftp.get(downloadFile, new FileOutputStream(file));LOG.info("file is download successful");}/*** 下載文件* @param directory 下載目錄* @param downloadFile 下載的文件名* @return 字節數組* @throws SftpException* @throws IOException* @throws Exception*/public byte[] download(String directory, String downloadFile) throws SftpException, IOException{if (directory != null && !"".equals(directory)) {sftp.cd(directory);}InputStream is = sftp.get(downloadFile);byte[] fileData = IOUtils.toByteArray(is);LOG.info("file is download successful");return fileData;}/*** 獲取指定的流* @param directory* @return* @throws SftpException*/public InputStream download(String directory) throws SftpException {return sftp.get(directory);}/*** 刪除文件** @param directory* 要刪除文件所在目錄* @param deleteFile* 要刪除的文件* @throws SftpException* @throws Exception*/public void delete(String directory, String deleteFile) throws SftpException{sftp.cd(directory);sftp.rm(deleteFile);}/*** 列出目錄下的文件** @param directory* 要列出的目錄* @param directory* @return* @throws SftpException*/public Vector<?> listFiles(String directory) throws SftpException {return sftp.ls(directory);}public static void main(String[] args) throws SftpException, IOException { // SFTPUtil sftp = new SFTPUtil("24kGentle", "123@@321", "192.168.23.34", 22); // sftp.login(); // //byte[] buff = sftp.download("/home/data", "start.sh"); // //System.out.println(Arrays.toString(buff)); // File file = new File("D:\\upload\\index.html"); // InputStream is = new FileInputStream(file); // // sftp.upload("/24kGentle/work", "test_sftp_upload.csv", is); // sftp.logout();} }總結
以上是生活随笔為你收集整理的SFTP上传下载文件工具类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 太可怕了! 五一外出还敢连WiFi?
- 下一篇: 你天天看手机,手机也在看你