文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

nodejs怎么连接ftp实现上传下载

2023-07-06 00:09

关注

这篇文章主要介绍“nodejs怎么连接ftp实现上传下载”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“nodejs怎么连接ftp实现上传下载”文章能帮助大家解决问题。

依赖

//ftp 模块是目前找到的还不错的,对于ftp的基本功能都支持npm install ftp

连接ftp

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

ftp 获取列表 list

//列出目标目录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();

nodejs怎么连接ftp实现上传下载

ftp 目录切换

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

FBI WARNING : 这里提醒下,在本示例中的所有代码都在同一个文件中,后面会给出完整示例代码。

有了目录切换,那么在list函数中的dirpath就可以使用啦。如下:

//列出目标目录//列出目标目录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目标地址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);//此处应对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');//连接FTPconst 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});//列出目标目录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目标地址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);//此处应对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();

踩坑记录:

测试过程中发现,有的ftp服务器传输速度正常,而有的ftp服务器传输速度则是非常慢!慢到平均一张十几K的图片都能传十几秒的程度!经过检查发现,这类ftp是采用的被动连接模式。

对此,查找github官方文档https://github.com/mscdex/node-ftp , 发现connect函数中有一个pasvTimeout选项涉及到被动连接超时设置,于是测试了一下,将上面的连接代码改成如下:

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

再次测试,传输速度慢的问题得到解决!

关于“nodejs怎么连接ftp实现上传下载”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网行业资讯频道,小编每天都会为大家更新不同的知识点。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯