当前位置: 首页 > news >正文

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()

相关文章:

  • Postman如何做接口自动化测试?
  • java.sql.SQLException: ORA-28000: the account is locked
  • C#8.0本质论第十章--合式类型
  • 【MySQL索引与优化篇】InnoDB数据存储结构
  • 【JavaScript】快速学习JS
  • 聊聊“JVM 调优JVM 性能优化”是怎么个事?
  • Transit path
  • javaswing/gui+mysql的学生信息管理系统
  • 代码随想录 | Day61 and 62
  • 77 全排列
  • 考虑温度影响的vumat子程序在木材受火后强度分析中的应用
  • RK3568-clock
  • 使用 @antfu/eslint-config 配置 eslint (包含兼容uniapp方法)
  • 【JAVA学习笔记】46 - (43)第十一章作业
  • PHP 同城服务共享茶室小程序系统是如何实现的?
  • PyTorch入门学习(六):神经网络的基本骨架使用
  • sass和 scss的区别?
  • 如何查找特定基因集合免疫基因集 炎症基因集
  • 竞赛 深度学习卫星遥感图像检测与识别 -opencv python 目标检测
  • EdgeCloudSim官方Sample运行——Windows+IntelliJ IDEA+Matlab
  • 山东滕州市醉驾交通事故肇事人员已被刑拘
  • 安赛乐米塔尔深化在华战略布局,VAMA总经理:做中国汽车板竞争力前三
  • 五一假期,长三角铁路张家港、台州等多个车站客发量创新高
  • 山大齐鲁医院回应护士论文现“男性确诊子宫肌瘤”:给予该护士记过处分、降级处理
  • 李学明谈笔墨返乡:既耕春圃,念兹乡土
  • 贵州黔西游船发生侧翻事故,游客:事发时能见度只有一米,所乘船只停靠礁石避险