const ftp = require('ftp');//连接FTP
const path = require('path');
const client = new ftp();
const fs = require('fs');//本地文件夹路径;
const localDirPath = '/test/';
//远程地址,打开ftp以后的地址,不需要加入host;
const remotePath = '/';
const uploadFiles = [];
const mkDirPromiseArr = [];const connectionProperties = {host: '',                       //ftp地址;user: '',                       //用户名;password: '',                   //密码;port: 21                        //端口;
};
client.connect(connectionProperties);
client.on('ready', () => {console.log('ftp client is ready');start();
});async function start() {const { err: ea, dir } = await cwd(remotePath);//此处应对err做处理if (ea) {client.mkdir(remotePath, true, (err) => {if (err) {console.log('创建' + remotePath + '文件夹失败');upload();} else {console.log('创建' + remotePath + '成功');upload();}});} else {upload();}function upload() {const filesPath = { files: [] };getDirAllFilePath(localDirPath, filesPath);remoteMkDir(filesPath, '');console.log('准备上传...');setTimeout(() => {Promise.all(mkDirPromiseArr).then(() => {console.log('开始上传...');const tasks = uploadFile();runPromiseArray(tasks).then(() => {client.end();console.warn('上传完成~');});});}, 3000);}
}// 获取本地的文件地址和路径;
function getDirAllFilePath(paths, parent) {const files = fs.readdirSync(paths);files.forEach(item => {if (item != '.DS_Store') {const path = `${paths}/${item}`;if (isDir(path)) {getDirAllFilePath(path, parent[item] = { files: [] });} else if (isFile(path)) {parent.files.push(item);}}})
}//创建远程确实的文件夹;
async function remoteMkDir(obj, _path) {for (const key in obj) {if (key === 'files') {for (let i = 0, len = obj[key].length; i < len; i++) {const promise = new Promise(async resolve => {let p = '';if (_path) {p = _path + '/';}const filePathName = p + obj[key][i];uploadFiles.push({ path: filePathName, fileName: obj[key][i] });const ph = remotePath + filePathName.substring(0, filePathName.lastIndexOf('/') + 1);let { err: ea, dir } = await cwd(ph);//此处应对err做处理if (ea) {client.mkdir(ph, true, (err) => {if (err) {console.log('mkdir' + ph + 'err', err);resolve(null);return;}console.log('mkdir ' + ph + '  success');resolve(null);});} else {resolve(null);}});mkDirPromiseArr.push(promise);}} else {let p = '';if (_path) {p = _path + '/';}remoteMkDir(obj[key], p + key);}}
}//上传文件;
function uploadFile() {const tasks = [];const resourcesPath = localDirPath;//目标路径文件夹;const checkPath = remotePath;for (let i = 0, len = uploadFiles.length; i < len; i++) {const task = () => {return new Promise(async (resolve, reject) => {const _path = uploadFiles[i].path;const targetPath = checkPath + _path;const putPath = resourcesPath + '/' + _path;const dirpath = path.dirname(targetPath);const fileName = path.basename(targetPath);client.cwd(dirpath, (cwdErr, dir) => {client.pwd((pwdErr, cwd) => {if (pwdErr) {resolve(pwdErr)} else {client.get(fileName, (err, res) => {if (res) {console.log(`${targetPath} =====================已经存在了`);resolve(true);} else {const rs = fs.createReadStream(putPath);client.put(rs, fileName, (putErr, data) => {if (putErr) {resolve(err);} else {console.log(targetPath + '文件上传成功');resolve(true);}})}});}});})});}tasks.push(task);}return tasks;
}//执行Promise的队列动作;
function runPromiseArray(parray) { //这个方法可以放到G里let p = Promise.resolve();for (let promise of parray) {p = p.then(promise);}return p;
}//切换目录
async function cwd(dirpath) {return new Promise((resolve, reject) => {client.cwd(dirpath, (err, dir) => {resolve({ err: err, dir: dir });})});
}function isFile(filepath) {  //判断是否是文件 Booleanlet stat = fs.statSync(filepath)return stat.isFile()
}function isDir(filepath) {  //判断是否是文件夹 Booleanlet stat = fs.statSync(filepath);return stat.isDirectory();
}

希望对大家有用;

使用node ftp上传文件夹到相关推荐

  1. ftp 文件夹 上传到服务器,ftp上传文件夹到服务器 远程路径

    ftp上传文件夹到服务器 远程路径 内容精选 换一换 WinSCP工具可以实现在本地与远程计算机之间安全地复制文件.与使用FTP上传代码相比,通过 WinSCP 可以直接使用服务器账户密码访问服务器, ...

  2. 用ftp上传到服务器视频文件夹,ftp 上传文件夹到服务器

    ftp 上传文件夹到服务器 内容精选 换一换 上传的文件和上传的文件夹中包含的文件支持的格式请参见支持的文件格式.文件上传:从本地上传:在Projects Explorer视图中选中一个文件夹,依次单 ...

  3. ftp 上传文件夹_命令行连接FTP服务器

    Windows下: 打开命令行窗口,输入 ftp,进入ftp命令模式: 输入 open ip地址 端口,进入ftp服务器,如open 172.16.3.77 2121.如下图: 输入Windows下的 ...

  4. ftp 上传文件夹_建站上传下载FTP工具

    做网站的朋友,经常要在本地和服务器之间上传下载源码,给大家推荐两款好用的FTP上传下载工具,便于大家开发维护站点. 一.FileZilla FileZilla比其他任何一款FTP软件都要简单 多协议支 ...

  5. linux ftp 文件夹上传,shell---两句命令打造FTP上传文件夹

    简单代码如下:需上传目录为/root/sk #!/bin/bash sss=`find /root/sk -type d -printf '%P\n'| awk '{if ($0 == "& ...

  6. ftp 上传文件夹_ftp工具哪个好?Viper FTP for Mac激活版带给大家

    ftp工具哪个好?Viper FTP mac版是Macos上一款ftp管理工具,使您可以访问各种远程服务器,以便管理和传输文件.Viper FTP for mac拥有简单,干净,直观的文件管理器,使您 ...

  7. ftp上传文件夹_ftp同步软件哪个好,ftp同步软件哪个好,6款好用推荐

    ftp同步软件哪个好呢?不知道大家用过ftp同步工具吗?小编用过几款ftp同步工具很好用.有的软件有定时上传下载的功能,定时这个功能是真的很棒了,节省了很多时间而且还很方便快捷.下面小编就来推荐六款好 ...

  8. 间隔定时拍照摄像头FTP上传文件夹图片命名规则

    自定义路径命名: F:\FTP服务器\20211116\images F:\FTP服务器:选择保存的磁盘.文件夹 20211116:自定义创建文件夹的年月日 Images:自定义保存图片的文件夹 FT ...

  9. 如何设置ftp服务器上传文件夹至不同路径,设置ftp服务器上传文件夹

    设置ftp服务器上传文件夹 内容精选 换一换 上传单个或多个本地文件或文件夹至OBS指定路径.待上传的文件可以是任何类型:文本文件.图片.视频等等.上传本地文件或文件夹时,请确保本地文件或文件夹在上传 ...

最新文章

  1. 清远工贸职业技术学校清远大学城网
  2. Windows 7技巧之Telnet组件消失之迷
  3. shell自动化巡检
  4. 保护系统 用数据库加密实现数据安全
  5. python获得项目根目录路径root path
  6. 掏出来的“耳屎经济”
  7. tcpdump抓包最常用的命令
  8. apache配置多https域名对应单个证书和多个不同的https域名对应多个不同的证书
  9. 在Apache上调试Asp.net 1.1/2.0代码
  10. unity中绘制战争迷雾
  11. 在局域网访问_Jupyter notebook设置局域网访问方法
  12. CodeBlocks使用静态链接库
  13. 10分钟利用django搭建一个博客
  14. 华为手机怎么查看ip 网关
  15. WIN7打开远程桌面连接设置
  16. 基尔霍夫定律(Kirchhoff laws)
  17. C语言中short和unsigned short的取值问题和计算机组成原理
  18. 游戏模型制作的注意事项 项目模型规范总结
  19. 【DDD落地实践系列】DDD领域驱动设计如何进行工程化落地
  20. 项目笔记:Arduino读取SD卡

热门文章

  1. Linux基础之(六)之服sshd服务
  2. photo-sphere-viewer
  3. [转载]教练,我也想再要一个同桌
  4. 3021什么意思_3021违章代码罚款金额和含义
  5. 保姆级-红米AC2100之breed不死后台刷写openwrt官方版第三方改良版
  6. 微信小程序的分包功能
  7. 那些优秀论文是怎么写的?
  8. 前端工程师需要学习ps 吗_【百度前端工程师面试】前端开发技术要会PS-看准网...
  9. 分块与莫队(详详详解)
  10. [NC200190]矩阵消除游戏