最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java如何上傳文件到sftp服務(wù)器

 更新時間:2026年04月21日 09:25:04   作者:@豬大腸  
本文主要講述了如何使用JSch庫將數(shù)據(jù)文件上傳到SFTP服務(wù)器,并分享了過程中遇到的一些坑,例如目錄創(chuàng)建、文件刪除等問題,以及如何使用SFTP通道執(zhí)行命令、文件上傳等操作,通過本文,讀者可以了解SFTP上傳文件的基本步驟和注意事項,同時也提供了一些解決方法

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簽名錯誤問題的解決方法分析

    這篇文章主要介紹了微信js sdk invalid signature簽名錯誤問題的解決方法,結(jié)合實例形式分析了微信簽名錯誤問題相關(guān)解決方法,需要的朋友可以參考下
    2019-04-04
  • 基于dubbo分組group的一些總結(jié)

    基于dubbo分組group的一些總結(jié)

    這篇文章主要介紹了關(guān)于dubbo分組group的一些總結(jié),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • springboot 在xml里讀取yml的配置信息的示例代碼

    springboot 在xml里讀取yml的配置信息的示例代碼

    這篇文章主要介紹了springboot 在xml里讀取yml的配置信息的示例代碼,代碼簡單易懂,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • Java IO流學(xué)習(xí)總結(jié)之文件傳輸基礎(chǔ)

    Java IO流學(xué)習(xí)總結(jié)之文件傳輸基礎(chǔ)

    這篇文章主要介紹了Java IO流學(xué)習(xí)總結(jié)之文件傳輸基礎(chǔ),文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java io流的小伙伴們有很好的幫助,需要的朋友可以參考下
    2021-04-04
  • Spring學(xué)習(xí)教程之AOP模塊的概述

    Spring學(xué)習(xí)教程之AOP模塊的概述

    AOP 從功能的角度來講,可能看作OOP編程方式的一種補充,提供了一種不同的代碼或者系統(tǒng)組織方式,下面這篇文章主要給大家介紹了關(guān)于Spring學(xué)習(xí)教程之AOP模塊的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2018-05-05
  • Spring Boot 定制與優(yōu)化內(nèi)置的Tomcat容器實例詳解

    Spring Boot 定制與優(yōu)化內(nèi)置的Tomcat容器實例詳解

    本文主要記錄對內(nèi)置容器優(yōu)化和定制的方式,用于自己加深對SpringBoot理解。本文給大家介紹的非常詳細(xì),具有參考借鑒價值,需要的朋友參考下吧
    2017-12-12
  • Java?web開發(fā)環(huán)境的搭建超完整步驟

    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 Bean六種作用域的適用場景和使用方式

    Spring Bean六種作用域的適用場景和使用方式

    本文主要介紹了Spring Bean六種作用域的適用場景和使用方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • Java使用Gateway自定義負(fù)載均衡過濾器

    Java使用Gateway自定義負(fù)載均衡過濾器

    這篇文章主要介紹了Java使用Gateway自定義負(fù)載均衡過濾器,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • Spring通過@Lazy解決構(gòu)造方法形式的循環(huán)依賴問題

    Spring通過@Lazy解決構(gòu)造方法形式的循環(huán)依賴問題

    這篇文章主要給大家介紹了Spring如何通過@Lazy解決構(gòu)造方法形式的循環(huán)依賴問題,文中有詳細(xì)的代碼示例,對大家的學(xué)習(xí)活工作有一定的幫助,具有一定的參考價值,需要的朋友可以參考下
    2023-10-10

最新評論

扎鲁特旗| 巴中市| 荥经县| 洛阳市| 什邡市| 长海县| 高州市| 偃师市| 定兴县| 安顺市| 余庆县| 尚志市| 海晏县| 巴楚县| 靖安县| 宁阳县| 英吉沙县| 宁乡县| 广昌县| 扶风县| 麻栗坡县| 隆化县| 樟树市| 兴化市| 攀枝花市| 洛浦县| 浮山县| 赤峰市| 淅川县| 樟树市| 北安市| 含山县| 南阳市| 张家口市| 大新县| 荥阳市| 丹东市| 韩城市| 公主岭市| 漾濞| 天镇县|