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

最近在做公司的项目,整个项目都是用的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!");

}

}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容