----------------------------リストとファイル読み込み-------------------------
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是我定义的一个对象,用来做一个动态传参。
模块引入
然后我们定义一下本地文件路径,再使用fs的existsSync方法判断文件目录是否存在,如果目录存在 返回 true ,如果目录不存在 返回false;下面我们就开始获取文件夹里面的文件了,使用到了fs的readdir方法,参数是文件目录;方法里我用到了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
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。