NodeJs使用fs、FTP模块完成FTP文件上传

----------------------------リストとファイル読み込み-------------------------

const FTP = require('ftp');

const ftp = new FTP();

const fs = require('fs-extra');

// var watch = require('watch'); //用来监听目录变化

//当ftp连接成功时触发

ftp.on('ready', function () {

getlist('.') //可根据自己情况填写ftp服务器上的文件路径,我要获取的是ftp的根目录下的所有文件

 

// watch.createMonitor('/xx/xxx', monitor => {

// monitor.on("created", function (f, stat) {

// console.log('created')

// console.log(f)

// })

// })

 

// 下载远程文件“foo.txt”,并将其保存到本地文件系统:

// var Client = require('ftp');

// var fs = require('fs');

ftp.get('20190709121212.xml', function(err, stream) {

if (err) throw err;

stream.once('close', function() { ftp.end(); });

stream.pipe(fs.createWriteStream('foo.local-copy.xml'));

});

// connect to localhost:21 as anonymous

// c.connect();

});

 

ftp.connect({

 

host: '192.168.128.82', //自己ftp服务器地址

 

user: 'ftpuser',

 

password: '123456'

 

});

 

//查找文件

 

function getlist(path) {

//罗列出该文件夹内的文件列表

ftp.list(path, function (err, list) {

if (err) throw err;

list.forEach(function (item) {

if (item.type === 'd') {

//文件夹其实是一种特殊的文件,因此这里还存在两个「文件夹」:'.'和'..',但我们对它们不做处理

if (item.name === '.') return;

if (item.name === '..') return;

//然后,历遍一下这个文件夹

getlist(path + '/' + item.name);

} else {

if (item.size / 1024 > 100) {

return

} else {

let picPath = path + '/' + item.name

picPath = picPath.substring(1)

picPath = 'ftp://***.***.**.**' + picPath

console.log(picPath)

return picPath

}

}

});

});

}

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

https://www.jianshu.com/p/57fb61cd7a09

最近在做公司的项目,整个项目都是用的NodeJs写的。项目中,有一项要求是将本地文件夹下面的文件上传到FTP服务器上。由于本人也是一个node新手,一开始是想着看看官方文档的API,结合网站上面的Demo看看的,看了很多帖子,都没能理解,再不就是需要积分下载,本着学习的态度,写一下自己的思路与实现方法,希望能给遇到同样问题的人一个参考。

首先第一步,我们需要安装FTP模块和 fs文件模块,具体安装可以参考官方文档或者百度查找一下这里不做赘述。

下面开始代码的实现:

我们先引入 fs ftp 这两个模块(我这里是使用的 let [var] 做声明,也可以使用 const),card是我定义的一个对象,用来做一个动态传参。

 

模块引入

然后我们定义一下本地文件路径,再使用fsexistsSync方法判断文件目录是否存在,如果目录存在 返回 true ,如果目录不存在 返回false;下面我们就开始获取文件夹里面的文件了,使用到了fsreaddir方法,参数是文件目录;方法里我用到了forEach方法来循环获取文件目录下的文件。

 

获取本地文件夹下的所有文件

开始进行FTP的连接配置,以及FTP连接。我这里是在自己本地电脑搭建了一个ftp服务器,不知道怎么搭建FTP服务器的可以参考这个连接:https://jingyan.baidu.com/article/0bc808fc408fa91bd585b94f.html

开始进行FTP连接

ftp连接之后,我们开始进行事件监听,并对我们需要上传的文件进行处理,因为我们不知道本地目录下有多少文件,所以这里的参数就是读取出来的文件个数来进行一个循环处理。我们首先判断一下我们需要上传的FTP服务器上是否存在相对应的文件夹,filePath 是我们之前定义过的文件目录,ftp.get() 方法是获取文件(也可以是单个文件,我这里是获取的文件目录),如果目标文件夹不存在,那我们就使用 ftp.mkdir() 方法来创建一个文件夹,参数也是跟之前声明好的相对应。文件创建完成之后,我们就开始上传文件了,使用到了 ftp.put() 方法,相对应的参数为: 本地文件目录下的文件(filename是我们之前通过读取本地文件夹下的文件获取到的文件名,要带上文件路径,例如我要上传D盘下面的文件:D:/1.jpg)、目标文件名(这个是我要传到FTP的文件,也要带上文件路径,例如我要上传到FTP上面 test 文件夹下面去:test/1.jpg)、最后是一个回调函数。下面我们看一下具体的代码实现:

 

文件上传

好了,一个基于node 环境下 使用 fs、ftp 模块的FTP文件上传功能就完成了,下面我们就来验证一下:

 

本地文件夹下的文件

 

目标文件夹下的文件(FTP服务器上的文件目录)

在我 ftp 服务器根目录上没有 123 这个文件夹的情况下,ftp.mkdir() 方法会自动创建相对于的文件夹

说明:因为我本地搭建的 FTP服务器是指向我本地电脑E盘下的FTPUpload文件夹的,所以绝对不是我自己将电脑D盘的文件复制到E盘下的文件夹的哈,QAQ ...

下面我就把代码给大家贴出来,本篇温州仅仅只是作为个人记录和交流使用,若有不对之处还请批评指正  TAT...

let fs = require("fs");

let ftpClient = require('ftp');

let card = {idNo:"123"};

UploadFileToFTP();

async function UploadFileToFTP(){

    let fileDirectory = "D:/photo/test";

    if(fs.existsSync(fileDirectory)){

    fs.readdir(fileDirectory, function (err, files) {

    if (err) {

        console.log(err);

        return;

    }

      let count = files.length;

      let results = {};

      files.forEach(function (filename) {

        fs.readFile(filename, function (data) {

          results[filename] = data;

          console.log("success:"+filename);

                    // 对所有文件进行处理

                let ftp = new ftpClient();

                let filePath = `${card.idNo}`;            //目标文件地址

                let connectionProperties = {              //连接参数

                    host: "192.168.183.1",

                    port: "21",

                    user: "Tiamo",

                    password: "182431"

                };

                ftp.connect(connectionProperties);

                ftp.on('ready', async function(){

                 for(let i=0;i<files.length;i++){

                    var a =  new Promise(function (resolve, reject) {

                        //判断文件夹是否存在,不存在就创建文件夹

                        ftp.get(filePath, function (err) {

                            console.log("filePath:"+filePath);

                            if(err){

                                ftp.mkdir(`${card.idNo}`,false,function(){

                                    ftp.put(`${fileDirectory}`+"/"+`${filename}`,`${card.idNo}`+"/"+`${filename}`, function (err){

                            if (err) {

                                console.log("上传文件到服务器失败...");

                                reject(err);

                            }

                            console.log("上传文件到服务器成功...");

                            resolve(true);

                        });

                                });

                            }

                        })

                    })

                    console.log(i+"-文件处理中...");

                    let b  = await a;

                    console.log(b);

                  }

                  ftp.end();

                }).on('error', async function(e){

                  console.log(e);

                }

            );

        });

      });

    });

}

else {

    console.log(fileDirectory + "  Not Found!");

}

}



作者:仙女味的Tiamo
链接:https://www.jianshu.com/p/57fb61cd7a09
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值