nodejs连接ftp上传下载实现方法详解【附:踩坑记录】

 更新时间:2023年04月10日 14:34:17   作者:他强任他强03  
这篇文章主要介绍了nodejs连接ftp上传下载实现方法,结合实例形式详细分析了node.js使用ftp模块实现针对ftp上传、下载相关操作的方法,并附带记录了传输速度慢的解决方法,需要的朋友可以参考下

依赖

//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

//列出目标目录
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函数中的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');//连接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
});
//列出目标目录
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');//连接FTP
const client = new ftp();
client.on('ready',()=>{
    console.log('ftp client is ready');
});
client.connect({
    host : '***.***.***.***',
    port : '****',
    user : '***',
    password : '***',
    keepalive : 1000,
    pasvTimeout:1000
});

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

相关文章

  • NodeJS实现不可逆加密与密码密文保存的方法

    NodeJS实现不可逆加密与密码密文保存的方法

    这篇文章主要介绍了NodeJS实现不可逆加密与密码密文保存的方法,简单讲述了不可逆加密与密码密文保存的原理并结合实例形式分析了nodejs相关加密操作实现技巧,需要的朋友可以参考下
    2018-03-03
  • 手动下载Chrome并解决puppeteer无法使用问题

    手动下载Chrome并解决puppeteer无法使用问题

    本篇文章主要介绍了手动下载Chrome并解决puppeteer无法使用问题,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-11-11
  • NodeJS中Buffer模块详解

    NodeJS中Buffer模块详解

    这篇文章主要介绍了NodeJS中Buffer模块详解,十分的详细,需要的朋友可以参考下
    2015-01-01
  • 浅谈nodejs中创建cluster

    浅谈nodejs中创建cluster

    集群是一组相互独立的、通过高速网络互联的计算机,它们构成了一个组,并以单一系统的模式加以管理。一个客户与集群相互作用时,集群像是一个独立的服务器。集群配置是用于提高可用性和可缩放性。本文将详细介绍如何在nodejs中创建cluster。
    2021-06-06
  • Node.js基础入门之模块与npm包管理器使用详解

    Node.js基础入门之模块与npm包管理器使用详解

    Node.js是一个基于Chrome V8引擎的JavaScript运行时。类似于Java中的JRE,.Net中的CLR。本文将详细为大家介绍Node.js中的模块与npm包管理器的使用,需要的可以参考一下
    2022-03-03
  • Node.js实现一个HTTP服务器的方法示例

    Node.js实现一个HTTP服务器的方法示例

    这篇文章主要介绍了Node.js实现一个HTTP服务器的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05
  • Node.js中安全调用系统命令的方法(避免注入安全漏洞)

    Node.js中安全调用系统命令的方法(避免注入安全漏洞)

    这篇文章主要介绍了Node.js中安全调用系统命令的方法(避免注入安全漏洞),本文讲解的一般是连接字符串会时出的安全问题情况,需要的朋友可以参考下
    2014-12-12
  • 一文带你了解Node.js中的path模块

    一文带你了解Node.js中的path模块

    Node.js和Python技术类似, 都致力于能够实现跨平台的通用代码。 为此,针对路径的拼接, Node.js提供了path模块,本文就来讲讲path模块的使用
    2023-03-03
  • nodejs实现黑名单中间件设计

    nodejs实现黑名单中间件设计

    最近写的项目中涉及到防止灌水的功能,于是设计了黑名单中间件,跟大家分享一下,同时也希望大家有好的建议能够拍砖.
    2014-06-06
  • package.json各个属性说明详解

    package.json各个属性说明详解

    这篇文章主要介绍了package.json各个属性说明详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03

最新评论