node.js - 上传文件至阿里云oss
deploy.js
const fs = require('fs')
const path = require('path')
const util = require('util')
const OSS = require('ali-oss')/*因为,在Node.js中,许多核心模块的函数都是采用回调函数的形式进行异步操作的,即在操作完成后调用回调函数来处理结果。但是,使用回调函数的编码风格可能会导致回调地狱(callback hell)的问题,使代码难以阅读和维护。所以,为了解决这个问题,Node.js提供了util.promisify方法,它可以将回调风格的函数转换为返回Promise的函数,通过这种方式,可以使用async/await或.then()链式调用等方式来处理异步操作,使代码更加清晰和易于理解。这两句代码的作用是:将Node.js中的回调风格的函数fs.readdir 和 fs.stat转换为基于Promise的函数,这里,util.promisify被用来转换fs.readdir和fs.stat这两个具有回调函数的函数,转换后,promisifyReaddir和promisifyStat就变成了可以返回Promise的函数,可以使用await或.then()来处理它们的异步结果。
*/
const promisifyReaddir = util.promisify(fs.readdir)
const promisifyStat = util.promisify(fs.stat)// 阿里云的oss配置
const client = new OSS({region: 'oss-dnfdnfdnf',accessKeyId: 'Even-Dnf-dnf',accessKeySecret: 'Even-dnf-dnf-DNF',bucket: 'orange-dnf'
})/*(__dirname):node自带参数,返回的是当前文件所在目录path.resolve():将当前文件所在目录(__dirname)与相对路径'./dist'拼接起来,得到一个绝对路径,表示要上传的本地文件夹的路径
*/
const publicPath = path.resolve(__dirname, './dist')// 异步函数run,它递归遍历指定文件夹中的所有文件和文件夹,并将文件上传到阿里云OSS
async function run(proPath = '') {/*(fs.readdir):读取,指定路径下的文件和文件夹,返回一个包含文件和文件夹名称的数组,${publicPath}${proPath}:表示要读取的文件夹路径*/const dir = await promisifyReaddir(`${publicPath}${proPath}`)// 开始一个循环,遍历文件夹dir中的每个项for (let i = 0; i < dir.length; i++) {// (fs.stat):获取当前项的状态信息,返回一个包含文件或文件夹的详细信息的对象const stat = await promisifyStat(path.resolve(`${publicPath}${proPath}`, dir[i]))// 这个if...else,判断当前项是文件还是文件夹if (stat.isFile()) {// 如果当前项是文件,创建一个可读流(fs.createReadStream)来读取文件内容,将文件内容存储在fileStream变量中const fileStream = fs.createReadStream(path.resolve(`${publicPath}${proPath}`, dir[i]))// 打印出正在上传的文件的路径console.log(`上传文件: ${proPath}/${dir[i]}`)/* 使用OSS客户端的putStream方法,将文件流上传到阿里云OSS中的指定路径proPath:文件在文件夹中的相对路径,dir[i]表示文件名,fileStream表示文件内容流*/const result = await client.putStream(`${proPath}/${dir[i]}`, fileStream)} else if (stat.isDirectory()) {// 如果,当前项是文件夹,递归调用run函数,传递当前文件夹的路径,以处理嵌套的文件夹结构await run(`${proPath}/${dir[i]}`)}}
}run()相关文章:
node.js - 上传文件至阿里云oss
deploy.js const fs require(fs) const path require(path) const util require(util) const OSS require(ali-oss)/*因为,在Node.js中,许多核心模块的函数都是采用回调函数的形式进行异步操作的,即在操作完成后调用回调函数来处理结果。…...
xxl-job项目集成实战,全自动项目集成,可以直接使用到项目中
如果你看官方文档,在研究透,至少也得几天时间,如果你直接看我的文档,快速用到项目中,也就10分钟就搞好了。 xxl-job功能确实很强大,而且使用的人比较多,既然在使用xxl-job,那肯定是…...
Qt生成PDF报告
文章目录 一、示意图二、实现部分代码总结 一、示意图 二、实现部分代码 //! 生成测试报告 void MainWindow::createPdf(QString filename, _pdf_msg_& msg, const QMap<QString, int>& ok, const QMap<QString, int>& err) {//QDir dir;if(!dir.exis…...
Jenkins 安装全攻略:从入门到精通
目录 一:安装文件夹准备 1.打开,/home/admin目录 2.新建三个文件夹 二:安装tomcat 1.打开tomcat目录进行tomcat安装 2.解压tomcat文件 3.开放端口号 4.启动tomcat 5.浏览器访问tomcat 三:安装Maven 1.打开maven目录进行…...
迎重阳,话养老:平安养老险如何助力国民“养老梦”?
10月23日,我们将迎来传统节日重阳节,又称敬老节,自古就有祭祖、登高、赏菊三大风俗,流传至今,已成为人们孝老敬老的重要节日。 随着老龄化日益加深,在“敬老”的同时如何“备老”成为人民群众长期热议的话题…...
微信小程序获取用户信息
个人博客 微信小程序获取用户信息 个人微信公众号,求关注,求收藏,求指错。 文章概叙 本文主要讲的是小程序获取用户信息的,更新测试时间是2023-10-25 更改原因 首先,官网上的解释是这样的,为了安全合…...
Mysql 索引原理和优化方式
一、索引原理 什么是索引 索引是存储引擎用于快速找到记录的一种数据结构。可以联想到字典中的目录。 索引的分类 (1) Hash 索引 Hash 索引是比较常见的一种索引,他的单条记录查询的效率很高,时间复杂度为1。但是,…...
Ubuntu安装VM TOOLS解决虚拟机无法和WINDOWS粘贴复制问题
1:首先使用VMware Workstation安装一个Ubuntu的系统。 2:现在已经不建议安装VM TOOLS。建议安装OPEN-VM-TOOLS。 3:进入系统使用下面的命令安装。 sudo apt install open-vm-tools 4:提示下面错误,Package open-vm…...
【Docker】Docker Swarm介绍与环境搭建
为什么不建议在生产环境中使用Docker Compose 多机器如何管理?如何跨机器做scale横向扩展?容器失败退出时如何新建容器确保服务正常运行?如何确保零宕机时间?如何管理密码,Key等敏感数据? Docker Swarm介…...
国产CAN总线收发芯片DP1042 兼容替换TJA1042
说明 1 简述 DP1042是一款应用于 CAN 协议控制器和物理总线之间的接口芯片,可应用于卡车、公交、小汽车、工业控制等领域,支持 5Mbps CAN FD 灵活数据速率,具有在总线与 CAN 协议控制器之间进行差分信号传输的能力,完全兼容“ISO…...
[架构之路-243]:目标系统 - 纵向分层 - 架构是表面轮廓、内部骨架、未来蓝图,企业组织架构、信息系统架构、软件架构、应用程序就架构
目录 一、什么是架构 1.1 架构是表面轮廓 1.2 架构是内部骨架 1.3 架构是蓝图,是愿景 1.4 架构是数据流、控制流、管理流、同步流 1.5 数据、控制、同步、管理的比较 二、架构的层级 2.1 企业组织架构 2.2 企业系统架构 2.2 信息系统架构 2.3 软件架构 …...
【接口技术】定时计数器习题
1:8253芯片有______个端口地址。 【可选】 2 3 4 6 解答:4 2:8253芯片有______种工作方式。 【可选】 3 4 5 6 解答:6 3: 8253芯片内部有完全独立的______。 【可选】 6个16位计数通道 3个16位计数通道 6个8位计…...
DC电源模块的的散热结构合理布局
BOSHIDA DC电源模块的的散热结构合理布局 DC电源模块在工业控制、通讯、汽车电子等领域广泛应用。然而,随着功率密度不断提高,DC电源模块产生的热量也越来越大,散热问题变得越来越突出。为了保障电路的稳定性和可靠性,必须采取合…...
Fedora Linux 38下安装音频与视频的解码器和播放器
Fedora Linux 38 操作系统安装好后,默认是没有音频与视频的解码器的,音频与视频的播放体验非常差劲。但是第三方的软件源中有解码器和播放器的软件,需要我们自己手动安装。、 连接互联网,打开Shell命令行: 1. sudo d…...
边缘计算:云计算的延伸
云计算已经存在多年,并已被证明对大大小小的企业都有好处;然而,直到最近边缘计算才变得如此重要。它是指发生在网络边缘的一种数据处理,更接近数据的来源地。 这将有助于提高效率并减少延迟以及设备和云之间的数据传输成本。边缘…...
【经验分享】在Kylin桌面版操作系统中配置openGauss的ODBC数据源
引言 openGauss是一款开源的关系型数据库管理系统,它提供了强大的功能和性能,可以满足各种企业级应用的需求。与此同时,ODBC(Open Database Connectivity)是一个标准的数据库访问接口,它允许应用程序通过统…...
WSL——ubuntu中anaconda换源(conda、pip)
1、conda 打开Ubuntu,输入下列命令。 conda config --set show_channel_urls yes 在文件管理器地址栏,输入:\\wsl$。打开Ubuntu根路径,其中显示了.condarc文件。 以文本形式打开,并输入要换的源,保存即可。…...
IP地址在网络安全中的关键作用
IP地址(Internet Protocol Address)是互联网世界中的重要标识符,它在网络安全领域发挥着至关重要的作用。这些地址不仅帮助设备在网络上找到彼此,还在多个方面有助于维护网络的完整性、机密性和可用性。本文将探讨IP地址在网络安全…...
Android.mk 中覆盖应用包名
项目场景: 一般来讲应用包名都是配置在 AndroidManifest.xml 中的,但遇到特殊情况,需要修改源码中应用包名 通常都会先去改 AndroidManifest.xml package 但改为后编译发现一顿错误,原因是 java 类中已经指定了 R 文件包名&…...
如何最有效地使用ChatGPT:提问技巧与策略
前言 在如今信息技术高速发展的时代,像ChatGPT这样的大型自然语言处理模型为我们提供了一个强大的工具,以获取各种信息和答案。然而,要充分利用这一工具,您需要掌握一些提问技巧与策略,以确保获得最准确和有用的回答。…...
7个实用技巧彻底解决Hugo-PaperMod导航菜单不显示问题
7个实用技巧彻底解决Hugo-PaperMod导航菜单不显示问题 【免费下载链接】hugo-PaperMod A fast, clean, responsive Hugo theme. 项目地址: https://gitcode.com/GitHub_Trending/hu/hugo-PaperMod 在使用Hugo-PaperMod主题搭建个人博客时,导航菜单不显示是最…...
赣州琴行哪家最可靠
在赣州,选择一家可靠的琴行对于孩子的钢琴启蒙和成长至关重要。今天我们就来聊聊赣州的几家知名琴行,看看哪家最适合您的孩子。1. 可六琴行:专注儿童钢琴启蒙,天天练琴模式为什么选择可六琴行?1.1 专注儿童钢琴启蒙具体…...
罗技鼠标宏终极指南:如何用Lua脚本实现绝地求生无后座力射击
罗技鼠标宏终极指南:如何用Lua脚本实现绝地求生无后座力射击 【免费下载链接】logitech-pubg PUBG no recoil script for Logitech gaming mouse / 绝地求生 罗技 鼠标宏 项目地址: https://gitcode.com/gh_mirrors/lo/logitech-pubg 想要在《绝地求生》中实…...
ThinkPHP6+UniApp实战:手把手教你用宝塔面板部署Niushop V5.5.0多门店商城(含全插件配置)
ThinkPHP6UniApp实战:宝塔面板部署Niushop V5.5.0多门店商城全流程解析 在数字化转型浪潮中,电商系统的快速部署能力已成为技术团队的核心竞争力之一。本文将带您深入实战,从零开始完成Niushop V5.5.0多门店商城系统的完整部署。不同于基础教…...
开源OCR工具Umi-OCR:本地化部署与高效识别实践指南
开源OCR工具Umi-OCR:本地化部署与高效识别实践指南 【免费下载链接】Umi-OCR Umi-OCR: 这是一个免费、开源、可批量处理的离线OCR软件,适用于Windows系统,支持截图OCR、批量OCR、二维码识别等功能。 项目地址: https://gitcode.com/GitHub_…...
RV1106平台下基于设备树的GPIO驱动开发实战
1. RV1106平台GPIO驱动开发入门指南 刚拿到RV1106开发板的时候,我最头疼的就是怎么控制那些GPIO引脚。作为嵌入式Linux开发者,GPIO控制可以说是最基础也最常用的功能。不同于单片机直接操作寄存器的方式,Linux系统下需要通过设备树和驱动框架…...
EVA-01开发者案例:Qwen2.5-VL-7B集成至MAGI类AI平台实现多源视觉融合
EVA-01开发者案例:Qwen2.5-VL-7B集成至MAGI类AI平台实现多源视觉融合 1. 引言:当视觉AI遇见机甲美学 想象一下,你正在处理一份复杂的市场分析报告,里面混杂着数据图表、产品照片和手写笔记。传统的AI工具要么只能看文字…...
多模态扩展:OpenClaw结合Qwen3.5-4B-Claude处理截图信息
多模态扩展:OpenClaw结合Qwen3.5-4B-Claude处理截图信息 1. 为什么需要多模态能力 作为一个长期依赖文本交互的技术爱好者,我最初对OpenClaw的理解停留在"能通过自然语言控制电脑的AI助手"层面。直到上个月需要处理大量产品截图中的文字信息…...
Cursor试用限制如何解决?go-cursor-help工具三合一方案详解
Cursor试用限制如何解决?go-cursor-help工具三合一方案详解 【免费下载链接】go-cursor-help 解决Cursor在免费订阅期间出现以下提示的问题: Youve reached your trial request limit. / Too many free trial accounts used on this machine. Please upgrade to pro…...
LFM2.5-1.2B-Thinking-GGUF快速问答效果展示:对比云端大模型的响应速度与成本
LFM2.5-1.2B-Thinking-GGUF快速问答效果展示:对比云端大模型的响应速度与成本 1. 本地轻量模型的惊艳表现 最近在测试LFM2.5-1.2B-Thinking-GGUF这个轻量级模型时,它的表现着实让我惊喜。这个只有12亿参数的模型,在本地CPU环境下运行&#…...
