日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

搭建SFTP服务器实现文件上传

發(fā)布時(shí)間:2023/12/31 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 搭建SFTP服务器实现文件上传 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1、前言

最近一直在做數(shù)據(jù)遷移接口的開發(fā),涉及到大文件的遠(yuǎn)程下載與上傳,其實(shí)倒沒有什么原理可言,無非就是兩臺機(jī)器互連之后,獲得文件流然后進(jìn)行傳輸,不過在這過程也遇到過一些小坑,故記錄下。

2、搭建SFTP服務(wù)器

我這里就在本地搭建一個(gè)SFTP服務(wù)器進(jìn)行測試,最簡單的辦法就是通過軟件來實(shí)現(xiàn),我這里推薦FreeSSHd,可以通過我的藍(lán)奏云網(wǎng)盤進(jìn)行下載:

https://wwr.lanzoui.com/igWkqqoczjg
密碼:aqge

首先下載安裝后之后進(jìn)行配置

1)點(diǎn)擊“Users”-“Add”,新增賬號,開發(fā)時(shí)需要通過賬號和密碼連接上SFTP服務(wù)器。

2)點(diǎn)擊“SSH”,修改端口號,默認(rèn)是22端口,以防22被其他應(yīng)用占用了,我這里改成了23端口,也可以自行修改成其他端口號,并且將下面兩個(gè)選項(xiàng)的√去掉,不然會出現(xiàn)問題。

3)點(diǎn)擊“Telnet”,這里也需要修改端口號。

4)點(diǎn)擊“Authentication”,這里把權(quán)限也改一下。

5)點(diǎn)擊“SFTP”,這里選擇的目錄就是我們要上傳文件的根目錄。

6)點(diǎn)擊“Server status”-“Click here to stop it”,至此,SFTP服務(wù)器啟動(dòng)成功。

3、開發(fā)實(shí)現(xiàn)

開發(fā)過程中遇到的坑就是創(chuàng)建文件夾,如果文件夾不存在,就會報(bào)錯(cuò),而且文件夾不能多級創(chuàng)建,比如/A/B/C這三個(gè)文件夾,不能一次性創(chuàng)建,必須單個(gè)單個(gè)創(chuàng)建,不然就會報(bào)權(quán)限不足的錯(cuò)誤,一開始我就是被這個(gè)報(bào)錯(cuò)誤解了,一直在權(quán)限的問題上糾結(jié),實(shí)則不是,我這里通過切割“/”的形式將字符串分割成數(shù)組,然后再通過遍歷依次創(chuàng)建文件夾,注意還要判斷文件夾是否已經(jīng)存在,不然也會報(bào)錯(cuò)。

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.net.URL; 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; /*** sftp工具類* @author chen**/ public class SFTPUtils { 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 服務(wù)器地址IP地址*/ private String host; /** FTP 端口*/ private int port; /** * 構(gòu)造基于密碼認(rèn)證的sftp對象 * @param userName * @param password * @param host * @param port */ public SFTPUtils(String username, String password, String host, int port) { this.username = username; this.password = password; this.host = host; this.port = port; } /** * 構(gòu)造基于秘鑰認(rèn)證的sftp對象 * @param userName * @param host * @param port * @param privateKey */ public SFTPUtils(String username, String host, int port, String privateKey) { this.username = username; this.host = host; this.port = port; this.privateKey = privateKey; } public SFTPUtils(){} /** * 連接sftp服務(wù)器 * * @throws Exception */ public void login(){ try { JSch jsch = new JSch(); if (privateKey != null) { jsch.addIdentity(privateKey);// 設(shè)置私鑰 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()}); } } /** * 關(guān)閉連接 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"); } } } /** * 將輸入流的數(shù)據(jù)上傳到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);String[] split = directory.split("/");String directoryStr = "";for(int i = 0;i<split.length;i++) {directoryStr+="/"+split[i];if(!isDirectory(directoryStr)) {sftp.mkdir(directoryStr);}}sftp.cd(directoryStr);}sftp.put(input, sftpFileName);log.info("file:{} is upload successful" , sftpFileName); } public boolean isDirectory(String directoryStr) throws SftpException {try {if(directoryStr=="") {return true;}sftp.cd(directoryStr);} catch (Exception e) {// TODO: handle exceptionreturn false;} return true;}/** * 上傳單個(gè)文件 * * @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 * 要上傳的字節(jié)數(shù)組 * @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 * 待上傳的數(shù)據(jù) * @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 字節(jié)數(shù)組 * @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 * 要?jiǎng)h除文件所在目錄 * @param deleteFile * 要?jiǎng)h除的文件 * @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 {SFTPUtils sftp = new SFTPUtils("root", "123456", "192.168.1.XXX", 23); sftp.login(); File file = new File("G:\\a.txt"); InputStream is = new FileInputStream(file);sftp.upload("/", "a.txt", is);sftp.logout(); } }

總結(jié)

以上是生活随笔為你收集整理的搭建SFTP服务器实现文件上传的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。