最近在做公司的项目,整个项目都是用的NodeJs写的。项目中,有一项要求是将本地文件夹下面的文件上传到FTP服务器上。由于本人也是一个node新手,一开始是想着看看官方文档的API,结合网站上面的Demo看看的,看了很多帖子,都没能理解,再不就是需要积分下载,本着学习的态度,写一下自己的思路与实现方法,希望能给遇到同样问题的人一个参考。
首先第一步,我们需要安装FTP模块和 fs文件模块,具体安装可以参考官方文档或者百度查找一下这里不做赘述。
下面开始代码的实现:
我们先引入 fs 跟 ftp 这两个模块(我这里是使用的 let [var] 做声明,也可以使用 const),card是我定义的一个对象,用来做一个动态传参。
然后我们定义一下本地文件路径,再使用fs的existsSync方法判断文件目录是否存在,如果目录存在 返回 true ,如果目录不存在 返回false;下面我们就开始获取文件夹里面的文件了,使用到了fs的readdir方法,参数是文件目录;方法里我用到了forEach方法来循环获取文件目录下的文件。
开始进行FTP的连接配置,以及FTP连接。我这里是在自己本地电脑搭建了一个ftp服务器,不知道怎么搭建FTP服务器的可以参考这个连接:https://jingyan.baidu.com/article/0bc808fc408fa91bd585b94f.html
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 服务器根目录上没有 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!");
}
}