java如何上傳文件到sftp服務(wù)器
java上傳文件到sftp服務(wù)器
最近公司有個數(shù)據(jù)對接需求,合作方那邊是使用我們這邊的系統(tǒng)進(jìn)行出單的,數(shù)據(jù)首先也是在我們這邊。
后面他們自己開發(fā)了業(yè)務(wù)系統(tǒng),需要我們這邊定時把每天的數(shù)據(jù)傳送到那邊去。
他們那邊開發(fā)部門要求我們這邊,按一定的格式導(dǎo)出加簽加密的數(shù)據(jù)文件到他們的sftp服務(wù)器上面去。
sftp代碼之前同事有寫過類似的代碼,就把他的給我啦,既然有了代碼,當(dāng)然要消化成自己的知識啦!
這個過程中也遇到一些坑,就是我們上傳到sftp目錄的時候,文件一多我們就得隔開文件夾,一般都是按年月隔開的,但是sftp切換目錄后,如果目錄不存在,我們就新建目錄,這樣的邏輯是沒毛病,但是它沒辦法一次建多級目錄,比如/home 下面可以建/home/2022/ 沒辦法建/home/2022/03(會報異常),所以這個的話我們還得用循環(huán)來做。
代碼
先給大家看下代碼:
String userName = "";//賬號
String password = ""; //密碼
String host = ""; //ip
int port=8889; //端口號
String sftpUrl = "/application/data"; //上傳到sftp服務(wù)器 路徑
String publicUrl = "E://"; //要上傳的文件
String yyyy = DateUtils.formatDate(new Date(), "yyyy");
String mm = DateUtils.formatDate(new Date(), "MM");
String uploadUrl = sftpUrl + "/" + yyyy + "/" + mm;
//存儲目錄地址
List dirs = new ArrayList();
dirs.add(0, sftpUrl + "/" + yyyy + "/");
dirs.add(1, sftpUrl + "/" + yyyy + "/" + mm + "/");
try {
//1.獲取會話
JSch jSch = new JSch();
Session session = jSch.getSession(userName, host, port);
session.setPassword(password);
Properties properties = new Properties();
properties.put("StrictHostKeyChecking", "no");
session.setConfig(properties);
session.connect();
//2.獲取上傳的管道
Channel channel = session.openChannel("sftp");
channel.connect();
sftp = (ChannelSftp) channel;
if (!(uploadUrl == null || uploadUrl.trim().length() == 0)) {
for (int index = 0; index < dirs.size(); index++) {
//目錄不存在,新建目錄
try {
sftp.cd(uploadUrl);//進(jìn)入指定目錄
break;
} catch (SftpException e1) {
try {
sftp.cd(dirs.get(index).toString());
} catch (SftpException e2) {
try {
sftp.mkdir(dirs.get(index).toString());
sftp.cd(dirs.get(index).toString());
} catch (SftpException e3) {
logger.error("SFTP切換目錄出錯!", e3);
}
}
}
}
}
//讀取源文件流(客戶端文件)
InputStream client_fileInput = new FileInputStream(publicUrl );
sftp.put(client_fileInput, “上傳后的文件名”);
//傳送到服務(wù)端
//5.關(guān)閉
sftp.disconnect();
client_fileInput.close();
channel.disconnect();
session.disconnect();
logger.info("sftp傳輸成功");
} catch (Exception e) {
logger.info("sftp傳輸失敗: " + e.toString());
e.printStackTrace();
}
一般上傳完文件后,需要刪除本地的文件以免占用空間
/**
* 迭代刪除文件夾
* @param dirPath 文件夾路徑
*/
public static void deleteDir(String dirPath) {
File file = new File(dirPath);
if(!file.exists()){
return;
}
if(file.isFile())
{
file.delete();
}else {
File[] files = file.listFiles();
if(files == null) {
file.delete();
}else {
for (int i = 0; i < files.length; i++) {
deleteDir(files[i].getAbsolutePath());
}
file.delete();
}
}
}
這里我遇到個坑,就是你們發(fā)現(xiàn)文件夾或者文件沒刪除或者沒刪除干凈,就要檢查一下流有沒有關(guān)閉,傳遞流的時候最好不要直接 xxx方法(new FileInputStream),用下面這種方式比較好,好排查問題,哈哈。
FileInputStream file=new FileInputStream(“”); xxx方法(file);file.close();
sftp連接過程
2.1、JSch簡介
JSch庫可以實現(xiàn)Java連接Linux服務(wù)器并操作命令、文件等,支持常用的各種授權(quán)模式。
3.1、JSch建立會話連接
從JSch對象中獲取Session,用于連接,并設(shè)置連接信息,賬號、密碼、服務(wù)器地址、端口號。
3.2 、設(shè)置連接的參數(shù)配置
StrictHostKeyChecking=no 最不安全的級別,當(dāng)然也沒有那么多煩人的提示了,相對安全的內(nèi)網(wǎng)測試時建議使用。如果連接server的key在本地不存在,那么就自動添加到文件中(默認(rèn)是known_hosts),并且給出一個警告。 StrictHostKeyChecking=ask 默認(rèn)的級別。如果連接和key不匹配,給出提示,并拒絕登錄。 StrictHostKeyChecking=yes 最安全的級別,如果連接與key不匹配,就拒絕連接,不會提示詳細(xì)信息。
3.3、獲取文件上傳的通道
通過以上的步驟,我們與sftp服務(wù)器建立了連接后,我們需要獲取文件的傳輸通道Channel,并指定為sftp服務(wù),隨便進(jìn)行connect()連接。
3.3、常用命令
獲取了sftp通道,我們可以類似在linux下簡單做一些shell指令操作:
mkdir()方法 創(chuàng)建目錄,只允許創(chuàng)建一級目錄cd()方法 切換目錄put()方法 上傳文件rm()方法 刪除文件
還有很多,大家可以直接看對象的對應(yīng)方法就知道了,方法命名跟我們平時用的linux命令差不多。
用完一定要記得關(guān)閉各種連接跟流呀?。。。。。?/strong>
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
微信js sdk invalid signature簽名錯誤問題的解決方法分析
這篇文章主要介紹了微信js sdk invalid signature簽名錯誤問題的解決方法,結(jié)合實例形式分析了微信簽名錯誤問題相關(guān)解決方法,需要的朋友可以參考下2019-04-04
springboot 在xml里讀取yml的配置信息的示例代碼
這篇文章主要介紹了springboot 在xml里讀取yml的配置信息的示例代碼,代碼簡單易懂,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-09-09
Java IO流學(xué)習(xí)總結(jié)之文件傳輸基礎(chǔ)
這篇文章主要介紹了Java IO流學(xué)習(xí)總結(jié)之文件傳輸基礎(chǔ),文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java io流的小伙伴們有很好的幫助,需要的朋友可以參考下2021-04-04
Spring Boot 定制與優(yōu)化內(nèi)置的Tomcat容器實例詳解
本文主要記錄對內(nèi)置容器優(yōu)化和定制的方式,用于自己加深對SpringBoot理解。本文給大家介紹的非常詳細(xì),具有參考借鑒價值,需要的朋友參考下吧2017-12-12
Java?web開發(fā)環(huán)境的搭建超完整步驟
這篇文章主要介紹了如何安裝和配置IDEA?2020.1.1?X64版本軟件,包括創(chuàng)建Java?Web項目、配置Tomcat、部署Tomcat?API以及創(chuàng)建和配置Servlet,通過這些步驟,新手可以快速搭建起Javaweb開發(fā)環(huán)境,需要的朋友可以參考下2024-11-11
Spring通過@Lazy解決構(gòu)造方法形式的循環(huán)依賴問題
這篇文章主要給大家介紹了Spring如何通過@Lazy解決構(gòu)造方法形式的循環(huán)依賴問題,文中有詳細(xì)的代碼示例,對大家的學(xué)習(xí)活工作有一定的幫助,具有一定的參考價值,需要的朋友可以參考下2023-10-10

