iis服务器助手广告广告
返回顶部
首页 > 资讯 > 服务器 >nodeftp上传文件夹到服务器案例详解
  • 132
分享到

nodeftp上传文件夹到服务器案例详解

nodeftp上传文件夹服务器 2023-05-14 17:05:57 132人浏览 薄情痞子
摘要

完整代码示例如下: const ftp = require('ftp');//连接FTP const path = require('path'); const client = n

完整代码示例如下:

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) {  //判断是否是文件 Boolean
    let stat = fs.statSync(filepath)
    return stat.isFile()
}
function isDir(filepath) {  //判断是否是文件夹 Boolean
    let stat = fs.statSync(filepath);
    return stat.isDirectory();
}

笔者解读一下:代码中的localDirPath为本地需要读取其中文件,并使用ftp上传的文件夹。

注意:这里的上传是针对文件夹中所有的文件夹与文件进行遍历后的上传,实际应用中,我们可能只需要上传指定的文件,对此,笔者修改后的脚本如下:

const ftp = require('ftp');//连接FTP
const path = require('path');
const client = new ftp();
const fs = require('fs');

//本地文件夹路径;
const localDirPath = path.join(__dirname,'/imgtmp/');//待遍历的本地目录
//远程ftp服务器文件路径
let remotePath = '/yourWEB/images/';
const upFileList = ["202304/202304061415075072.png","202304/202304061415075073.png"];//手动设置需要上传的文件
const uploadFiles = [];
const mkDirPromiseArr = [];
client.on('ready',()=>{
    console.log('ftp client is ready');
});
const connconfig = {
    host: '',                       //ftp地址;
    user: '',                       //用户名;
    password: '',                   //密码;
    port: 21                        //端口;
}

client.connect(connconfig);
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() {
        console.log("mkDirPromiseArr==>",mkDirPromiseArr);
        // const filesPath = { files: [] };
        // getDirAllFilePath(localDirPath, filesPath);
        const filesPath = { files: upFileList };//直接给定需要上传的文件列表
        // console.log("遍历之后的filesPath===>",filesPath);
        remoteMkDir(filesPath, '');
        console.log('准备上传...');
        setTimeout(() => {
            Promise.all(mkDirPromiseArr).then(() => {
                console.log('开始上传...');
                const tasks = uploadFile();
                runPromiseArray(tasks).then(() => {
                    client.end();
                    console.warn('上传完成~');
                });
            });
        }, 1000);
    }
}
 
// 获取本地的文件地址和路径;
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];
                    // const filePathName = path.dirname(obj[key][i]);
                    const fileName = path.basename(obj[key][i]);
                    // uploadFiles.push({ path: filePathName, fileName: obj[key][i] });
                    uploadFiles.push({ path: filePathName, fileName: fileName });
                    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 _path = uploadFiles[i];
                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) {  //判断是否是文件 Boolean
    let stat = fs.statSync(filepath)
    return stat.isFile()
}
 
function isDir(filepath) {  //判断是否是文件夹 Boolean
    let stat = fs.statSync(filepath);
    return stat.isDirectory();
}

PS:笔者此处使用了一个upFileList数组保存了需要上传到服务器的图片文件路径(包括文件夹与文件名),感兴趣的朋友可以测试一下看看效果~

--结束END--

本文标题: nodeftp上传文件夹到服务器案例详解

本文链接: https://www.lsjlt.com/news/203338.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • nodeftp上传文件夹到服务器案例详解
    完整代码示例如下: const ftp = require('ftp');//连接FTP const path = require('path'); const client = n...
    99+
    2023-05-14
    node ftp 上传 文件夹 服务器
  • MobaXterm上传下载文件、文件夹到服务器上
      首先通过SSH与服务器建立连接,不懂的可查阅相关资料,CSDN里有很多介绍。 上传下载文件 可以在命令输入窗口,无需输入命令,按ctrl单击的同时鼠标右键出现以下左图,选择receive file using Z-modem或者send...
    99+
    2023-08-31
    linux
  • node ftp怎么上传文件夹到服务器
    今天小编给大家分享一下node ftp怎么上传文件夹到服务器的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。完整代码...
    99+
    2023-07-05
  • ASP.NET 上传文件到共享文件夹的示例
    目录上传文件代码  web.config   工具方法    常量  具体上传文件代码创建共享文件夹参考资料 上传文件代码   web.config  <!--上...
    99+
    2024-04-02
  • JavaScript 上传文件限制参数案例详解
    项目场景: 1,上传文件限制 功能作用: 1,防止前端操作上传异常文件 2,限制符合的规则,优化展示模型 功能实现: 1,获取file实例 2,执行校验规则方法 代码如下: //...
    99+
    2024-04-02
  • JavaScript 使用Ckeditor+Ckfinder文件上传案例详解
    目录一、准备工作二、解压三、开始集成一、准备工作 Ckeditor_4.5.7_full + Ckfinder_java_2.6.0 二、解压 1.解压ckeditor,和平常文件解...
    99+
    2024-04-02
  • TypeScript前端上传文件到MinIO示例详解
    目录什么是MinIO本地Docker部署测试服务器上传的APITypeScript实现1. XMLHttpRequest2. Fetch API3. Axios从后端获取临时上传链接...
    99+
    2022-11-13
    TypeScript前端上传到MinIO TypeScript前端文件上传
  • 详解Vue ElementUI手动上传excel文件到服务器
    目录概述属性设置处理逻辑概述 具体需求场景如下: 选择excel文件后,需要把导入的excel文件手动上传到后台服务器,并将导入成功后的统计结果显示出来。官网也有手动上传的示例,通...
    99+
    2024-04-02
  • 云服务器怎么上传文件夹
    在使用云服务器的过程中,用户需要注册一个账号,然后登录到云服务器上,在管理界面中找到文件夹,然后选择上传文件夹。在上传文件夹的过程中,用户需要输入文件夹的路径,并确保上传的文件夹已经存在,否则上传的文件夹将被删除。上传完成后,用户可以在自己...
    99+
    2023-10-28
    文件夹 上传 服务器
  • 华为云服务器上传文件夹
    在华为云服务器上,可以上传和下载文件夹。以下是一些常见的操作步骤: 首先,需要登录华为云服务器账号,并根据要求设置云服务器的操作权限。 接下来,使用华为云服务器的“文件上传”功能,上传一个需要共享的文件夹。这个文件夹可能有多个用户共享,...
    99+
    2023-10-26
    华为 文件夹 上传
  • 腾讯云服务器如何上传文件夹到电脑
    如果您使用的是腾讯云服务器,以下是上传文件夹到电脑的方法: 登录您的腾讯云账号(QQ、微信或浏览器都可登录),打开网页浏览器,选择您要上传的文件夹。 进入文件夹页面,点击“创建新任务”。 在“创建新任务”界面,输入要上传的文件夹名称,选...
    99+
    2023-10-27
    腾讯 文件夹 上传
  • 文件上传到云服务器
    首先,上传文件需要使用云服务器提供的API。云服务器通常会提供多个API,用于将用户上传的文件自动推送到云服务器上的多个存储设备中。在上传文件之前,需要先使用相应的API向云服务器申请上传文件的权限,然后云服务器会将文件保存在服务器上,并向...
    99+
    2023-10-27
    文件上传 服务器
  • 网站上传到云服务器的文件夹是什么
    在上传到云服务器的文件夹通常是根据服务器操作系统和配置而定的,没有固定的名称。一般来说,在云服务器上存储网站文件的文件夹可以是任何名...
    99+
    2023-09-27
    云服务器
  • Java 上传文件到MinIO服务器上
    一、MinIO配置 主界面: 2.创建桶的文件路径 你可以设置任意想要配置的路径  3.管理桶权限 这里Prefix写 * 是为了匹配所有请求路径 Access: readonly就可以通过url访问图片了。 二、SpringBoo...
    99+
    2023-10-02
    java spring boot okhttp
  • 怎么往云服务器上传文件夹
    第一步:选择一个云服务 在选择一个云服务之前,您需要考虑以下几点: 可靠性:选择一个有稳定的服务和安全措施的云服务提供商。确保您选择的云服务商能够为您提供高水平的安全保障,以防止数据丢失和泄漏。 容量:您需要确定云服务的容量和大小,以满...
    99+
    2023-10-28
    文件夹 上传 服务器
  • 怎么向华为云服务器上传文件夹到桌面
    打开华为云应用商店 在华为云应用商店中,可以下载和安装华为云的各种应用。首先,需要在华为云应用商店中搜索需要上传的文件夹,找到“文件夹上传”应用。然后点击安装按钮,系统会自动启动上传功能。 创建新文件夹 打开文件夹上传按钮后,可以...
    99+
    2023-10-27
    华为 文件夹 桌面
  • Ajax 文件上传进度监听之upload.onprogress案例详解
    $.ajax实现 <!DOCTYPE html> <html lang="en"> <head> <meta charset...
    99+
    2024-04-02
  • 手机怎么用云服务器传文件到u盘上面的文件夹
    打开手机上的文件管理器或者文件浏览器,进入云服务器的网站。 在网站上选择需要上传的文件夹或文件,并选择上传的文件类型和大小。 在上传按钮旁边点击“上传”或“下载”按钮。 在上传页面上输入上传密码,并确认上传。 上传成功后,在下方可以看到上...
    99+
    2023-10-28
    文件夹 服务器 文件
  • 阿里云服务器传输文件到本地文件夹
    1. 使用SCP命令传输文件 SCP(Secure Copy)是一种安全的文件传输协议,可以在本地和远程服务器之间进行文件传输。以下是使用SCP命令将文件从阿里云服务器传输到本地文件夹的步骤: 打开终端或命令提示符,并确保已经安装了SC...
    99+
    2023-10-27
    阿里 文件夹 传输文件
  • 腾讯云服务器如何上传文件夹
    腾讯云服务器可以上传文件夹,但需要按照以下步骤进行操作: 在腾讯云服务器的网站上,点击“服务器”选项,然后点击下方的“上传”选项。 在弹出的对话框中,输入要上传的文件夹路径及文件名,确认无误后点击“确定”按钮。 上传后,在下方的文件夹列...
    99+
    2023-10-26
    腾讯 文件夹 上传
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作