• 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()
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
  • 相关阅读:
    webpack——webpack环境安装、开发环境devServer、package.json指令相关、开发依赖和生产依赖、面试题
    MyBioSource 犬尿氨酸 ELISA试剂盒测定原理&预期用途
    《信息学奥赛一本通·初赛真题解析》
    反射机制篇
    伊朗黑客对以色列科技和教育领域发起破坏性网络攻击
    Vue全局事件防止重复点击(等待请求)【进阶版】
    字符驱动开发2
    112. 路径总和
    [Go WebSocket] 为什么我选用Go重构Python版本的WebSocket服务?
    Pytorch源码编译Libtorch
  • 原文地址:https://blog.csdn.net/pig_ning/article/details/134036188