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

nodejs連接ftp上傳下載實(shí)現(xiàn)方法詳解【附:踩坑記錄】

 更新時(shí)間:2023年04月10日 14:34:17   作者:他強(qiáng)任他強(qiáng)03  
這篇文章主要介紹了nodejs連接ftp上傳下載實(shí)現(xiàn)方法,結(jié)合實(shí)例形式詳細(xì)分析了node.js使用ftp模塊實(shí)現(xiàn)針對(duì)ftp上傳、下載相關(guān)操作的方法,并附帶記錄了傳輸速度慢的解決方法,需要的朋友可以參考下

依賴

//ftp 模塊是目前找到的還不錯(cuò)的,對(duì)于ftp的基本功能都支持
npm install ftp

連接ftp

const ftp = require('ftp');//連接FTP
const client = new ftp();
client.on('ready',()=>{
    console.log('ftp client is ready');
});
client.connect({
    host : '***.***.***.***',
    port : '****',
    user : '***',
    password : '***',
    keepalive : 1000
});

ftp 獲取列表 list

//列出目標(biāo)目錄
function list(dirpath){
    return new Promise((resolve,reject)=>{
        client.list((err,files)=>{
            resolve({err : err,files : files});
        })
    });
}
async function test (){
    //list 列表功能
    let {err,files} = await list();
    if(err){
        console.log(err);
        return
    }
    console.log(`獲得文件列表:`+files.length);
    console.log(files);
}
test();

在這里插入圖片描述

ftp 目錄切換

//切換目錄
function cwd(dirpath){
    return new Promise((resolve,reject)=>{
        client.cwd(dirpath,(err,dir)=>{
            resolve({err : err,dir : dir});
        })
    });
}

FBI WARNING : 這里提醒下,在本示例中的所有代碼都在同一個(gè)文件中,后面會(huì)給出完整示例代碼。

有了目錄切換,那么在list函數(shù)中的dirpath就可以使用啦。如下:

//列出目標(biāo)目錄
//列出目標(biāo)目錄
async function list(dirpath){
    let {err : ea,dir } = await cwd(dirpath);
    return new Promise((resolve,reject)=>{
        client.list((err,files)=>{
            resolve({err : err,files : files})
        })
    });
}

ftp下載文件

//下載文件
async function get(filePath){
    const dirpath = path.dirname(filePath);
    const fileName = path.basename(filePath);
    let {err : ea,dir} = await cwd(dirpath);
    return new Promise((resolve,reject)=>{
        client.get(fileName,(err,rs)=>{
            let ws = fs.createWriteStream(fileName);
            rs.pipe(ws);
            resolve({err : err});
        });
    });
}

ftp上傳文件

//將文件上傳到ftp目標(biāo)地址
async function put(currentFile,targetFilePath){
    const dirpath = path.dirname(targetFilePath);
    const fileName = path.basename(targetFilePath);
    const rs = fs.createReadStream(currentFile);
    let {err : ea,dir} = await cwd(dirpath);//此處應(yīng)對(duì)err做處理
    if(ea){
        return Promise.resolve({err : ea});
    }
    return new Promise((resolve,reject)=>{
        client.put(rs,fileName,(err)=>{
            resolve({err : err});
        })
    });
}

完整代碼

const ftp = require('ftp');//連接FTP
const path = require('path');
const client = new ftp();
const fs = require('fs');
client.on('ready',()=>{
    console.log('ftp client is ready');
});
client.on('close',()=>{
    console.log('ftp client has close')
});
client.on('end',()=>{
    console.log('ftp client has end')
});
client.on('error',(err)=>{
    console.log('ftp client has an error : '+ JSON.stringify(err))
});
client.connect({
    host : '***',//這個(gè)就不提供啦
    port : '***',
    user : '***',
    password : '***',
    keepalive : 1000
});
//列出目標(biāo)目錄
async function list(dirpath){
    let {err : ea,dir } = await cwd(dirpath);
    return new Promise((resolve,reject)=>{
        client.list((err,files)=>{
            resolve({err : err,files : files})
        })
    });
}
//切換目錄
function cwd(dirpath){
    return new Promise((resolve,reject)=>{
        client.cwd(dirpath,(err,dir)=>{
            resolve({err : err,dir : dir});
        })
    });
}
//下載文件
async function get(filePath){
    const dirpath = path.dirname(filePath);
    const fileName = path.basename(filePath);
    let {err : ea,dir} = await cwd(dirpath);
    return new Promise((resolve,reject)=>{
        client.get(fileName,(err,rs)=>{
            let ws = fs.createWriteStream(fileName);
            rs.pipe(ws);
            resolve({err : err});
        });
    });
}
//將文件上傳到ftp目標(biāo)地址
async function put(currentFile,targetFilePath){
    const dirpath = path.dirname(targetFilePath);
    const fileName = path.basename(targetFilePath);
    const rs = fs.createReadStream(currentFile);
    let {err : ea,dir} = await cwd(dirpath);//此處應(yīng)對(duì)err做處理
    if(ea){
        return Promise.resolve({err : ea});
    }
    return new Promise((resolve,reject)=>{
        client.put(rs,fileName,(err)=>{
            resolve({err : err});
        })
    });
}
async function test (){
    //list 列表功能
    let {err,files} = await list('/attachment/byycampus/resource');
    if(err){
        console.log(err);
        return
    }
    console.log(`獲得文件列表:`+files.length);
    console.log(files);
    //下載文件
    let {err : ea} = await get('/attachment/byycampus/resource/201812/14/201812141035222541381967.jpg');
    if(ea){
        console.log(ea);
        return;
    }
    console.log('文件下載成功')
    //文件上傳
    let {err : eb} = await put('201812141035222541381967.jpg','/attachment/a.jpg');
    if(eb){
        console.log(eb);
        return;
    }
    console.log('文件上傳成功')
}
test();

踩坑記錄:

筆者測(cè)試過(guò)程中發(fā)現(xiàn),有的ftp服務(wù)器傳輸速度正常,而有的ftp服務(wù)器傳輸速度則是非常慢!慢到平均一張十幾K的圖片都能傳十幾秒的程度!經(jīng)過(guò)檢查發(fā)現(xiàn),這類ftp是采用的被動(dòng)連接模式。

對(duì)此,查找github官方文檔https://github.com/mscdex/node-ftp , 發(fā)現(xiàn)connect函數(shù)中有一個(gè)pasvTimeout選項(xiàng)涉及到被動(dòng)連接超時(shí)設(shè)置,于是筆者測(cè)試了一下,將上面的連接代碼改成如下:

const ftp = require('ftp');//連接FTP
const client = new ftp();
client.on('ready',()=>{
    console.log('ftp client is ready');
});
client.connect({
    host : '***.***.***.***',
    port : '****',
    user : '***',
    password : '***',
    keepalive : 1000,
    pasvTimeout:1000
});

再次測(cè)試,傳輸速度慢的問(wèn)題得到解決!

相關(guān)文章

  • NodeJS實(shí)現(xiàn)不可逆加密與密碼密文保存的方法

    NodeJS實(shí)現(xiàn)不可逆加密與密碼密文保存的方法

    這篇文章主要介紹了NodeJS實(shí)現(xiàn)不可逆加密與密碼密文保存的方法,簡(jiǎn)單講述了不可逆加密與密碼密文保存的原理并結(jié)合實(shí)例形式分析了nodejs相關(guān)加密操作實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2018-03-03
  • 手動(dòng)下載Chrome并解決puppeteer無(wú)法使用問(wèn)題

    手動(dòng)下載Chrome并解決puppeteer無(wú)法使用問(wèn)題

    本篇文章主要介紹了手動(dòng)下載Chrome并解決puppeteer無(wú)法使用問(wèn)題,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-11-11
  • NodeJS中Buffer模塊詳解

    NodeJS中Buffer模塊詳解

    這篇文章主要介紹了NodeJS中Buffer模塊詳解,十分的詳細(xì),需要的朋友可以參考下
    2015-01-01
  • 淺談nodejs中創(chuàng)建cluster

    淺談nodejs中創(chuàng)建cluster

    集群是一組相互獨(dú)立的、通過(guò)高速網(wǎng)絡(luò)互聯(lián)的計(jì)算機(jī),它們構(gòu)成了一個(gè)組,并以單一系統(tǒng)的模式加以管理。一個(gè)客戶與集群相互作用時(shí),集群像是一個(gè)獨(dú)立的服務(wù)器。集群配置是用于提高可用性和可縮放性。本文將詳細(xì)介紹如何在nodejs中創(chuàng)建cluster。
    2021-06-06
  • Node.js基礎(chǔ)入門之模塊與npm包管理器使用詳解

    Node.js基礎(chǔ)入門之模塊與npm包管理器使用詳解

    Node.js是一個(gè)基于Chrome?V8引擎的JavaScript運(yùn)行時(shí)。類似于Java中的JRE,.Net中的CLR。本文將詳細(xì)為大家介紹Node.js中的模塊與npm包管理器的使用,需要的可以參考一下
    2022-03-03
  • Node.js實(shí)現(xiàn)一個(gè)HTTP服務(wù)器的方法示例

    Node.js實(shí)現(xiàn)一個(gè)HTTP服務(wù)器的方法示例

    這篇文章主要介紹了Node.js實(shí)現(xiàn)一個(gè)HTTP服務(wù)器的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • Node.js中安全調(diào)用系統(tǒng)命令的方法(避免注入安全漏洞)

    Node.js中安全調(diào)用系統(tǒng)命令的方法(避免注入安全漏洞)

    這篇文章主要介紹了Node.js中安全調(diào)用系統(tǒng)命令的方法(避免注入安全漏洞),本文講解的一般是連接字符串會(huì)時(shí)出的安全問(wèn)題情況,需要的朋友可以參考下
    2014-12-12
  • 一文帶你了解Node.js中的path模塊

    一文帶你了解Node.js中的path模塊

    Node.js和Python技術(shù)類似,?都致力于能夠?qū)崿F(xiàn)跨平臺(tái)的通用代碼。?為此,針對(duì)路徑的拼接,?Node.js提供了path模塊,本文就來(lái)講講path模塊的使用
    2023-03-03
  • nodejs實(shí)現(xiàn)黑名單中間件設(shè)計(jì)

    nodejs實(shí)現(xiàn)黑名單中間件設(shè)計(jì)

    最近寫(xiě)的項(xiàng)目中涉及到防止灌水的功能,于是設(shè)計(jì)了黑名單中間件,跟大家分享一下,同時(shí)也希望大家有好的建議能夠拍磚.
    2014-06-06
  • package.json各個(gè)屬性說(shuō)明詳解

    package.json各個(gè)屬性說(shuō)明詳解

    這篇文章主要介紹了package.json各個(gè)屬性說(shuō)明詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03

最新評(píng)論

文化| 无为县| 清流县| 宿州市| 宁晋县| 即墨市| 龙陵县| 平乡县| 榆树市| 新昌县| 南宁市| 商丘市| 鄄城县| 泗阳县| 增城市| 宁明县| 浦北县| 富平县| 府谷县| 桐城市| 丰宁| 长春市| 恩施市| 望奎县| 安远县| 广饶县| 偏关县| 顺平县| 镇原县| 盐源县| 盘山县| 临沧市| 长沙县| 静海县| 鄄城县| 景洪市| 呈贡县| 津市市| 永宁县| 资兴市| 江口县|