java通過sftp上傳文件
阿新 • • 發佈:2017-09-14
lin div 連接 identity 密鑰認證 工具類 ransient equals put
轉載:http://blog.csdn.net/yhl_jxy/article/details/72633034
Linux操作系統我們經常使用ssh中的ftp,sftp連接服務器,做相應操作。
如何通過java代碼的形式采用sftp連接到服務器,進行文件上傳下載等操作呢?
第一步,引入依賴包
[html] view plain copy- <!-- sftp上傳依賴包 -->
- <dependency>
- <groupId>com.jcraft</groupId>
- <artifactId>jsch</artifactId>
- <version>0.1.53</version>
- </dependency>
[java] view plain copy
- package com.guohuai.util;
- import java.io.ByteArrayInputStream;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileNotFoundException;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.UnsupportedEncodingException;
- import java.util.Properties;
- import java.util.Vector;
- import org.apache.commons.io.IOUtils;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- import com.jcraft.jsch.Channel;
- import com.jcraft.jsch.ChannelSftp;
- import com.jcraft.jsch.JSch;
- import com.jcraft.jsch.JSchException;
- import com.jcraft.jsch.Session;
- import com.jcraft.jsch.SftpException;
- /**
- *
- * @ClassName: SFTPUtil
- * @Description: sftp連接工具類
- * @date 2017年5月22日 下午11:17:21
- * @version 1.0.0
- */
- public class SFTPUtil {
- private transient Logger log = LoggerFactory.getLogger(this.getClass());
- 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;
- /**
- * 構造基於密碼認證的sftp對象
- * @param userName
- * @param password
- * @param host
- * @param 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,path of private key file:{}" , privateKey);
- }
- log.info("sftp connect by host:{} username:{}",host,username);
- 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 : {}:{} \n Exception message is: {}", new Object[]{host, port, e.getMessage()});
- }
- }
- /**
- * 關閉連接 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 in
- * 輸入流
- * @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:{} is upload successful" , sftpFileName);
- }
- /**
- * 上傳單個文件
- *
- * @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" , downloadFile);
- }
- /**
- * 下載文件
- * @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" , downloadFile);
- return fileData;
- }
- /**
- * 刪除文件
- *
- * @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 sftp
- * @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("lanhuigu", "123456", "192.168.200.12", 22);
- sftp.login();
- //byte[] buff = sftp.download("/opt", "start.sh");
- //System.out.println(Arrays.toString(buff));
- File file = new File("D:\\upload\\index.html");
- InputStream is = new FileInputStream(file);
- sftp.upload("/data/work", "test_sftp_upload.csv", is);
- sftp.logout();
- }
- }
java通過sftp上傳文件