使用node ftp上传文件夹到
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上传文件夹到相关推荐
- ftp 文件夹 上传到服务器,ftp上传文件夹到服务器 远程路径
ftp上传文件夹到服务器 远程路径 内容精选 换一换 WinSCP工具可以实现在本地与远程计算机之间安全地复制文件.与使用FTP上传代码相比,通过 WinSCP 可以直接使用服务器账户密码访问服务器, ...
- 用ftp上传到服务器视频文件夹,ftp 上传文件夹到服务器
ftp 上传文件夹到服务器 内容精选 换一换 上传的文件和上传的文件夹中包含的文件支持的格式请参见支持的文件格式.文件上传:从本地上传:在Projects Explorer视图中选中一个文件夹,依次单 ...
- ftp 上传文件夹_命令行连接FTP服务器
Windows下: 打开命令行窗口,输入 ftp,进入ftp命令模式: 输入 open ip地址 端口,进入ftp服务器,如open 172.16.3.77 2121.如下图: 输入Windows下的 ...
- ftp 上传文件夹_建站上传下载FTP工具
做网站的朋友,经常要在本地和服务器之间上传下载源码,给大家推荐两款好用的FTP上传下载工具,便于大家开发维护站点. 一.FileZilla FileZilla比其他任何一款FTP软件都要简单 多协议支 ...
- linux ftp 文件夹上传,shell---两句命令打造FTP上传文件夹
简单代码如下:需上传目录为/root/sk #!/bin/bash sss=`find /root/sk -type d -printf '%P\n'| awk '{if ($0 == "& ...
- ftp 上传文件夹_ftp工具哪个好?Viper FTP for Mac激活版带给大家
ftp工具哪个好?Viper FTP mac版是Macos上一款ftp管理工具,使您可以访问各种远程服务器,以便管理和传输文件.Viper FTP for mac拥有简单,干净,直观的文件管理器,使您 ...
- ftp上传文件夹_ftp同步软件哪个好,ftp同步软件哪个好,6款好用推荐
ftp同步软件哪个好呢?不知道大家用过ftp同步工具吗?小编用过几款ftp同步工具很好用.有的软件有定时上传下载的功能,定时这个功能是真的很棒了,节省了很多时间而且还很方便快捷.下面小编就来推荐六款好 ...
- 间隔定时拍照摄像头FTP上传文件夹图片命名规则
自定义路径命名: F:\FTP服务器\20211116\images F:\FTP服务器:选择保存的磁盘.文件夹 20211116:自定义创建文件夹的年月日 Images:自定义保存图片的文件夹 FT ...
- 如何设置ftp服务器上传文件夹至不同路径,设置ftp服务器上传文件夹
设置ftp服务器上传文件夹 内容精选 换一换 上传单个或多个本地文件或文件夹至OBS指定路径.待上传的文件可以是任何类型:文本文件.图片.视频等等.上传本地文件或文件夹时,请确保本地文件或文件夹在上传 ...
最新文章
- 清远工贸职业技术学校清远大学城网
- Windows 7技巧之Telnet组件消失之迷
- shell自动化巡检
- 保护系统 用数据库加密实现数据安全
- python获得项目根目录路径root path
- 掏出来的“耳屎经济”
- tcpdump抓包最常用的命令
- apache配置多https域名对应单个证书和多个不同的https域名对应多个不同的证书
- 在Apache上调试Asp.net 1.1/2.0代码
- unity中绘制战争迷雾
- 在局域网访问_Jupyter notebook设置局域网访问方法
- CodeBlocks使用静态链接库
- 10分钟利用django搭建一个博客
- 华为手机怎么查看ip 网关
- WIN7打开远程桌面连接设置
- 基尔霍夫定律(Kirchhoff laws)
- C语言中short和unsigned short的取值问题和计算机组成原理
- 游戏模型制作的注意事项 项目模型规范总结
- 【DDD落地实践系列】DDD领域驱动设计如何进行工程化落地
- 项目笔记:Arduino读取SD卡