1. 程式人生 > >java通過sftp上傳文件

java通過sftp上傳文件

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
  1. <!-- sftp上傳依賴包 -->
  2. <dependency>
  3. <groupId>com.jcraft</groupId>
  4. <artifactId>jsch</artifactId>
  5. <version>0.1.53</version>
  6. </dependency>
jsch常用密碼登陸和密鑰認證的形式進行sftp服務器登陸。 第二步,編寫工具類,並采用main方法進行上傳測試,代碼如下

[java] view plain copy
  1. package com.guohuai.util;
  2. import java.io.ByteArrayInputStream;
  3. import java.io.File;
  4. import java.io.FileInputStream;
  5. import java.io.FileNotFoundException;
  6. import java.io.FileOutputStream;
  7. import java.io.IOException;
  8. import java.io.InputStream;
  9. import java.io.UnsupportedEncodingException;
  10. import java.util.Properties;
  11. import java.util.Vector;
  12. import org.apache.commons.io.IOUtils;
  13. import org.slf4j.Logger;
  14. import org.slf4j.LoggerFactory;
  15. import com.jcraft.jsch.Channel;
  16. import com.jcraft.jsch.ChannelSftp;
  17. import com.jcraft.jsch.JSch;
  18. import com.jcraft.jsch.JSchException;
  19. import com.jcraft.jsch.Session;
  20. import com.jcraft.jsch.SftpException;
  21. /**
  22. *
  23. * @ClassName: SFTPUtil
  24. * @Description: sftp連接工具類
  25. * @date 2017年5月22日 下午11:17:21
  26. * @version 1.0.0
  27. */
  28. public class SFTPUtil {
  29. private transient Logger log = LoggerFactory.getLogger(this.getClass());
  30. private ChannelSftp sftp;
  31. private Session session;
  32. /** FTP 登錄用戶名*/
  33. private String username;
  34. /** FTP 登錄密碼*/
  35. private String password;
  36. /** 私鑰 */
  37. private String privateKey;
  38. /** FTP 服務器地址IP地址*/
  39. private String host;
  40. /** FTP 端口*/
  41. private int port;
  42. /**
  43. * 構造基於密碼認證的sftp對象
  44. * @param userName
  45. * @param password
  46. * @param host
  47. * @param port
  48. */
  49. public SFTPUtil(String username, String password, String host, int port) {
  50. this.username = username;
  51. this.password = password;
  52. this.host = host;
  53. this.port = port;
  54. }
  55. /**
  56. * 構造基於秘鑰認證的sftp對象
  57. * @param userName
  58. * @param host
  59. * @param port
  60. * @param privateKey
  61. */
  62. public SFTPUtil(String username, String host, int port, String privateKey) {
  63. this.username = username;
  64. this.host = host;
  65. this.port = port;
  66. this.privateKey = privateKey;
  67. }
  68. public SFTPUtil(){}
  69. /**
  70. * 連接sftp服務器
  71. *
  72. * @throws Exception
  73. */
  74. public void login(){
  75. try {
  76. JSch jsch = new JSch();
  77. if (privateKey != null) {
  78. jsch.addIdentity(privateKey);// 設置私鑰
  79. log.info("sftp connect,path of private key file:{}" , privateKey);
  80. }
  81. log.info("sftp connect by host:{} username:{}",host,username);
  82. session = jsch.getSession(username, host, port);
  83. log.info("Session is build");
  84. if (password != null) {
  85. session.setPassword(password);
  86. }
  87. Properties config = new Properties();
  88. config.put("StrictHostKeyChecking", "no");
  89. session.setConfig(config);
  90. session.connect();
  91. log.info("Session is connected");
  92. Channel channel = session.openChannel("sftp");
  93. channel.connect();
  94. log.info("channel is connected");
  95. sftp = (ChannelSftp) channel;
  96. log.info(String.format("sftp server host:[%s] port:[%s] is connect successfull", host, port));
  97. } catch (JSchException e) {
  98. log.error("Cannot connect to specified sftp server : {}:{} \n Exception message is: {}", new Object[]{host, port, e.getMessage()});
  99. }
  100. }
  101. /**
  102. * 關閉連接 server
  103. */
  104. public void logout(){
  105. if (sftp != null) {
  106. if (sftp.isConnected()) {
  107. sftp.disconnect();
  108. log.info("sftp is closed already");
  109. }
  110. }
  111. if (session != null) {
  112. if (session.isConnected()) {
  113. session.disconnect();
  114. log.info("sshSession is closed already");
  115. }
  116. }
  117. }
  118. /**
  119. * 將輸入流的數據上傳到sftp作為文件
  120. *
  121. * @param directory
  122. * 上傳到該目錄
  123. * @param sftpFileName
  124. * sftp端文件名
  125. * @param in
  126. * 輸入流
  127. * @throws SftpException
  128. * @throws Exception
  129. */
  130. public void upload(String directory, String sftpFileName, InputStream input) throws SftpException{
  131. try {
  132. sftp.cd(directory);
  133. } catch (SftpException e) {
  134. log.warn("directory is not exist");
  135. sftp.mkdir(directory);
  136. sftp.cd(directory);
  137. }
  138. sftp.put(input, sftpFileName);
  139. log.info("file:{} is upload successful" , sftpFileName);
  140. }
  141. /**
  142. * 上傳單個文件
  143. *
  144. * @param directory
  145. * 上傳到sftp目錄
  146. * @param uploadFile
  147. * 要上傳的文件,包括路徑
  148. * @throws FileNotFoundException
  149. * @throws SftpException
  150. * @throws Exception
  151. */
  152. public void upload(String directory, String uploadFile) throws FileNotFoundException, SftpException{
  153. File file = new File(uploadFile);
  154. upload(directory, file.getName(), new FileInputStream(file));
  155. }
  156. /**
  157. * 將byte[]上傳到sftp,作為文件。註意:從String生成byte[]是,要指定字符集。
  158. *
  159. * @param directory
  160. * 上傳到sftp目錄
  161. * @param sftpFileName
  162. * 文件在sftp端的命名
  163. * @param byteArr
  164. * 要上傳的字節數組
  165. * @throws SftpException
  166. * @throws Exception
  167. */
  168. public void upload(String directory, String sftpFileName, byte[] byteArr) throws SftpException{
  169. upload(directory, sftpFileName, new ByteArrayInputStream(byteArr));
  170. }
  171. /**
  172. * 將字符串按照指定的字符編碼上傳到sftp
  173. *
  174. * @param directory
  175. * 上傳到sftp目錄
  176. * @param sftpFileName
  177. * 文件在sftp端的命名
  178. * @param dataStr
  179. * 待上傳的數據
  180. * @param charsetName
  181. * sftp上的文件,按該字符編碼保存
  182. * @throws UnsupportedEncodingException
  183. * @throws SftpException
  184. * @throws Exception
  185. */
  186. public void upload(String directory, String sftpFileName, String dataStr, String charsetName) throws UnsupportedEncodingException, SftpException{
  187. upload(directory, sftpFileName, new ByteArrayInputStream(dataStr.getBytes(charsetName)));
  188. }
  189. /**
  190. * 下載文件
  191. *
  192. * @param directory
  193. * 下載目錄
  194. * @param downloadFile
  195. * 下載的文件
  196. * @param saveFile
  197. * 存在本地的路徑
  198. * @throws SftpException
  199. * @throws FileNotFoundException
  200. * @throws Exception
  201. */
  202. public void download(String directory, String downloadFile, String saveFile) throws SftpException, FileNotFoundException{
  203. if (directory != null && !"".equals(directory)) {
  204. sftp.cd(directory);
  205. }
  206. File file = new File(saveFile);
  207. sftp.get(downloadFile, new FileOutputStream(file));
  208. log.info("file:{} is download successful" , downloadFile);
  209. }
  210. /**
  211. * 下載文件
  212. * @param directory 下載目錄
  213. * @param downloadFile 下載的文件名
  214. * @return 字節數組
  215. * @throws SftpException
  216. * @throws IOException
  217. * @throws Exception
  218. */
  219. public byte[] download(String directory, String downloadFile) throws SftpException, IOException{
  220. if (directory != null && !"".equals(directory)) {
  221. sftp.cd(directory);
  222. }
  223. InputStream is = sftp.get(downloadFile);
  224. byte[] fileData = IOUtils.toByteArray(is);
  225. log.info("file:{} is download successful" , downloadFile);
  226. return fileData;
  227. }
  228. /**
  229. * 刪除文件
  230. *
  231. * @param directory
  232. * 要刪除文件所在目錄
  233. * @param deleteFile
  234. * 要刪除的文件
  235. * @throws SftpException
  236. * @throws Exception
  237. */
  238. public void delete(String directory, String deleteFile) throws SftpException{
  239. sftp.cd(directory);
  240. sftp.rm(deleteFile);
  241. }
  242. /**
  243. * 列出目錄下的文件
  244. *
  245. * @param directory
  246. * 要列出的目錄
  247. * @param sftp
  248. * @return
  249. * @throws SftpException
  250. */
  251. public Vector<?> listFiles(String directory) throws SftpException {
  252. return sftp.ls(directory);
  253. }
  254. public static void main(String[] args) throws SftpException, IOException {
  255. SFTPUtil sftp = new SFTPUtil("lanhuigu", "123456", "192.168.200.12", 22);
  256. sftp.login();
  257. //byte[] buff = sftp.download("/opt", "start.sh");
  258. //System.out.println(Arrays.toString(buff));
  259. File file = new File("D:\\upload\\index.html");
  260. InputStream is = new FileInputStream(file);
  261. sftp.upload("/data/work", "test_sftp_upload.csv", is);
  262. sftp.logout();
  263. }
  264. }

java通過sftp上傳文件