欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間: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)針對ftp上傳、下載相關(guān)操作的方法,并附帶記錄了傳輸速度慢的解決方法,需要的朋友可以參考下

依賴

//ftp 模塊是目前找到的還不錯的,對于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 : 這里提醒下,在本示例中的所有代碼都在同一個文件中,后面會給出完整示例代碼。

有了目錄切換,那么在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)對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 : '***',//這個就不提供啦
    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)對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();

踩坑記錄:

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

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

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
});

再次測試,傳輸速度慢的問題得到解決!

相關(guān)文章

  • NodeJS 創(chuàng)建目錄和文件的方法實(shí)例分析

    NodeJS 創(chuàng)建目錄和文件的方法實(shí)例分析

    這篇文章主要介紹了NodeJS 創(chuàng)建目錄和文件的方法,涉及node.js中fs模塊mkdir、writeFile及目錄判斷existsSync等方法的功能與相關(guān)使用技巧,需要的朋友可以參考下
    2023-04-04
  • 深入淺析Node.js 事件循環(huán)

    深入淺析Node.js 事件循環(huán)

    Node.js 是單進(jìn)程單線程應(yīng)用程序,但是通過事件和回調(diào)支持并發(fā),所以性能非常高,本文給大家介紹nodejs事件循環(huán)相關(guān)知識,對此感興趣的朋友快來學(xué)習(xí)吧
    2015-12-12
  • node+axios實(shí)現(xiàn)下載外網(wǎng)文件到本地

    node+axios實(shí)現(xiàn)下載外網(wǎng)文件到本地

    這篇文章主要為大家介紹了node+axios實(shí)現(xiàn)下載外網(wǎng)文件到本地示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • node.js中的fs.statSync方法使用說明

    node.js中的fs.statSync方法使用說明

    這篇文章主要介紹了node.js中的fs.statSync方法使用說明,本文介紹了fs.statSync的方法說明、語法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • 在?node?中使用?koa-multer?庫上傳文件的方式詳解

    在?node?中使用?koa-multer?庫上傳文件的方式詳解

    本文主要介紹了上傳單個文件、多個文件,文件數(shù)量大小限制、限制文件上傳類型和對上傳的圖片進(jìn)行不同大小的裁剪,對node使用?koa-multer?庫上傳文件相關(guān)知識感興趣的朋友一起看看吧
    2024-01-01
  • NodeJS之優(yōu)缺點(diǎn)及適用場景討論

    NodeJS之優(yōu)缺點(diǎn)及適用場景討論

    這篇文章主要介紹了NodeJS之優(yōu)缺點(diǎn)及適用場景討論,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • 深入理解node.js之path模塊

    深入理解node.js之path模塊

    本篇文章主要介紹了深入理解node.js之path模塊,詳細(xì)介紹了path模塊的用法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • Nginx設(shè)置為Node.js的前端服務(wù)器方法總結(jié)

    Nginx設(shè)置為Node.js的前端服務(wù)器方法總結(jié)

    在本篇文章中小編給大家分享了關(guān)于Nginx設(shè)置為Node.js的前端服務(wù)器的方法和實(shí)例,需要的朋友們學(xué)習(xí)下。
    2019-03-03
  • 詳解node.js的http模塊實(shí)例演示

    詳解node.js的http模塊實(shí)例演示

    這篇文章主要介紹了詳解node.js的http模塊實(shí)例演示,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • node.js 用socket實(shí)現(xiàn)聊天的示例代碼

    node.js 用socket實(shí)現(xiàn)聊天的示例代碼

    本篇文章主要介紹了node.js 用socket實(shí)現(xiàn)聊天的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10

最新評論