最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

阿里云OSS實踐文件直傳基于服務(wù)端

 更新時間:2022年06月13日 16:29:35   作者:賴一鳴  
這篇文章主要為大家介紹了阿里云OSS實踐文件直傳基于服務(wù)端實現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

前言

在日常開發(fā)中,客戶端上傳文件的一般流程是:客戶端向服務(wù)端發(fā)送文件,再由服務(wù)端將文件轉(zhuǎn)儲到專門的存儲服務(wù)器或云計算廠商的儲存服務(wù)(例如阿里云 OSS)上,這樣做的一個弊端是上傳環(huán)節(jié)占用服務(wù)器的帶寬,個位數(shù)的并發(fā)上傳就能把帶寬占滿,從而導(dǎo)致用戶體驗下降。而如果直接將文件從客戶端直傳到第三方的存儲服務(wù)上,就可以避免這個問題。

本文以阿里云 OSS(Object Storage Service,對象存儲服務(wù))為例,詳細(xì)說明將文件從客戶端直傳 OSS 的整體流程,并提供了完整的代碼演示。

優(yōu)缺點

從“客戶端 — 服務(wù)器 — OSS”的傳輸模式,變更為“客戶端 — OSS”的模式,最大的好處是,省掉了上傳服務(wù)器的這一步,上傳效率更高,速度更快(相比較于一般服務(wù)器的帶寬,可以認(rèn)為 OSS 的寬帶是“幾乎無限”的)。

當(dāng)然該模式也有缺點,那就是增加了很多額外的開發(fā)工作量,主要包含 2 部分:

(1)服務(wù)端增加生成上傳 OSS 憑證的代碼。

(2)客戶端增加從服務(wù)端獲取上傳 OSS 憑證的代碼和對直傳 OSS 進行適配。

整體而言,直傳模式除了增加一點開發(fā)工作量以外,從架構(gòu)層面,幾乎沒有任何缺點。

流程

實際上,整個流程非常簡單,包含了兩步:

(1)客戶端向服務(wù)端發(fā)送請求,獲取直傳 OSS 的憑證。

(2)客戶端向 OSS 上傳文件,并攜帶該憑證。

邏輯拆解

關(guān)于如何生成憑證(也叫簽名),可以閱讀官方文檔(help.aliyun.com/document_de…),但由于文檔創(chuàng)建時間比較早,對于新手很難看懂,本文將手把手給你演示整個過程。 ?

整個“生成上傳 OSS 憑證”過程,實際上做了這么幾件事:

(1)上傳憑證鑒權(quán)由 policy 提供,根據(jù)私密配置生成這個 policy 。

(2)由于上傳環(huán)節(jié)脫離了開發(fā)者服務(wù)器,因此你可以在 policy 中定義各種限制,例如上傳最大體積、文件名等。

(3)將 policy 轉(zhuǎn)化為指定的格式。

代碼實現(xiàn)

我們先考慮將流程的每一步實現(xiàn),然后再將流程代碼封裝成函數(shù)。

OSS 配置

首先定義 OSS 的配置文件,關(guān)于配置項的內(nèi)容,可以參考文檔:help.aliyun.com/document_de…

/** OSS 配置項 */
const ossConfig = {
  bucket: 'xxxxxxxx',
  accessKeyId: 'xxxxxxxx',
  accessKeySecret: 'xxxxxxxx',
  /** OSS 綁定的域名 */
  url: 'xxxxxxxx',
}

policy 內(nèi)容

對于 policy ,有很多配置項,我們先考慮生成“寫死”的模式,然后再優(yōu)化為由函數(shù)參數(shù)傳入配置項。以下是一個最基礎(chǔ)的 policy 。 ?

有效期

首先定義一個有效時長(單位:毫秒),然后該憑證的有效截止時間則為“當(dāng)前時間 + 有效時長”,最后需要轉(zhuǎn)化為 ISO 時間字符串格式。 ?

/** 有效時長:例如 4 小時 */
const timeout = 4 * 60 * 60 * 1000
/** 到期時間:當(dāng)前時間 + 有效時間 */
const expiration = new Date(Date.now() + timeout).toISOString()

文件名

文件名建議使用 UUID(筆者習(xí)慣性使用去掉短橫線的 UUID),避免重復(fù)。 ?

import { v4 as uuidv4 } from 'uuid'
/** 隨機文件名(去掉短橫線的 uuid) */
const filename = uuidv4().replace(/-/gu, '')

一般建議按照不同的業(yè)務(wù)模塊,將文件劃分不同的目錄,例如這里使用 file 目錄,那么完整的 OSS 文件路徑則為: ?

/** 目錄名稱 */
const dirname = 'file'
/** 文件路徑 */
const key = dirname + '/' + filename

需要注意的是,文件路徑不能以 “/” 開頭(OSS 本身的要求)。 ?

將以上內(nèi)容整合,就形成了 policy 文本,以下是一個基礎(chǔ)格式: ?

const policyText = {
  expiration: expiration,
  conditions: [
    ['eq', '$bucket', ossConfig.bucket],
    ['eq', '$key', key],
  ],
}

轉(zhuǎn)化 policy

policyText 轉(zhuǎn)化為 Base64 格式后,就是要求的 policy 了。

// 將 policyText 轉(zhuǎn)化為 Base64 格式
const policy = Buffer.from(JSON.stringify(policyText)).toString('base64')

然后對 policy 使用 OSS 密鑰使用 HmacSha1 算法簽名簽名。

import * as crypto from 'crypto'
// 使用 HmacSha1 算法簽名
const signature = crypto.createHmac('sha1', ossConfig.accessKeySecret).update(policy, 'utf8').digest('base64')

最后將上述流程中的相關(guān)字段返回給客戶端,即為“上傳憑證”。 ?

進一步分析

以上完整演示了整個流程,我們進一步分析,如何將其封裝為一個通用性的函數(shù)。 ?

(1)憑證的有效時長可以根據(jù)不同的業(yè)務(wù)模塊分別定義,于是做成函數(shù)配置項。

(2)目錄名稱也可以做成配置項。

(3) policy 還有更多的配置內(nèi)容(見文檔 help.aliyun.com/document_de…),可以抽取一部分做成配置項,例如“允許上傳的最大體積”。

完整代碼

以下是封裝為“服務(wù)”的使用 Nest.js Web 框架的相關(guān)代碼,來源自筆者的線上項目(略有調(diào)整和刪改),供參考。

import { Injectable } from '@nestjs/common'
import * as crypto from 'crypto'
import { v4 as uuidv4 } from 'uuid'
export interface GenerateClientTokenConfig {
  /** 目錄名稱 */
  dirname: string
  /** 有效時間,單位:小時 */
  expiration?: number
  /** 上傳最大體積,單位:MB */
  maxSize?: number
}
/** 直傳憑證 */
export interface ClientToken {
  key: string
  policy: string
  signature: string
  OSSAccessKeyId: string
  url: string
}
export interface OssConfig {
  bucket: string
  accessKeyId: string
  accessKeySecret: string
  url: string
}
@Injectable()
export class OssService {
  private readonly ossConfig: OssConfig
  constructor() {
    this.ossConfig = {
      bucket: 'xxxxxxxx',
      accessKeyId: 'xxxxxxxx',
      accessKeySecret: 'xxxxxxxx',
      /** OSS 綁定的域名 */
      url: 'xxxxxxxx',
    }
  }
  /**
   * 生成一個可用于客戶端直傳 OSS 的調(diào)用憑證
   *
   * @param config 配置項
   *
   * @see [配置內(nèi)容](https://help.aliyun.com/document_detail/31988.html#title-6w1-wj7-q4e)
   */
  generateClientToken(config: GenerateClientTokenConfig): ClientToken {
    /** 目錄名稱 */
    const dirname = config.dirname
    /** 有效時間:默認(rèn) 4 小時 */
    const timeout = (config.expiration || 4) * 60 * 60 * 1000
    /** 上傳最大體積,默認(rèn) 100M */
    const maxSize = (config.maxSize || 100) * 1024 * 1024
    /** 隨機文件名(去掉短橫線的 uuid) */
    const filename = uuidv4().replace(/-/gu, '')
    /** 文件路徑 */
    const key = dirname + '/' + filename
    /** 到期時間:當(dāng)前時間 + 有效時間 */
    const expiration = new Date(Date.now() + timeout).toISOString()
    const { bucket, url, accessKeyId } = this.ossConfig
    const policyText = {
      expiration: expiration,
      conditions: [
        ['eq', '$bucket', bucket],
        ['eq', '$key', key],
        ['content-length-range', 0, maxSize],
      ],
    }
    // 將 policyText 轉(zhuǎn)化為 Base64 格式
    const policy = Buffer.from(JSON.stringify(policyText)).toString('base64')
    // 使用 HmacSha1 算法簽名
    const signature = crypto.createHmac('sha1', this.ossConfig.accessKeySecret).update(policy, 'utf8').digest('base64')
    return { key, policy, signature, OSSAccessKeyId: accessKeyId, url }
  }
}

在完整以上服務(wù)方法后,后續(xù)就可以在“控制器”層調(diào)用該方法用于分發(fā)上傳憑證,客戶端可直接使用該上傳憑證將文件直傳至 OSS 中。 ?

以上就是阿里云OSS實踐文件直傳基于服務(wù)端的詳細(xì)內(nèi)容,更多關(guān)于OSS文件直傳服務(wù)端的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Win7系統(tǒng)中如何安裝高版本的NodeJS(親測有效!)

    Win7系統(tǒng)中如何安裝高版本的NodeJS(親測有效!)

    Node.js是基于Chrome V8引擎的JavaScript運行環(huán)境,能夠使JavaScript在服務(wù)器端運行,這篇文章主要給大家介紹了關(guān)于Win7系統(tǒng)中如何安裝高版本的NodeJS的相關(guān)資料,需要的朋友可以參考下
    2023-12-12
  • node.js請求HTTPS報錯:UNABLE_TO_VERIFY_LEAF_SIGNATURE\的解決方法

    node.js請求HTTPS報錯:UNABLE_TO_VERIFY_LEAF_SIGNATURE\的解決方法

    最近在工作中遇到一個問題,node.js請求HTTPS時報錯:Error: UNABLE_TO_VERIFY_LEAF_SIGNATURE\,通過查找網(wǎng)上的一些資料找到了解決方法,現(xiàn)在總結(jié)下分享給大家,有需要的朋友們可以參考借鑒,下面來一起看看吧。
    2016-12-12
  • npm?install總是卡住不動問題的解決辦法

    npm?install總是卡住不動問題的解決辦法

    在我們安裝完Node.js之后,需要使用npm命令來安裝一些工具,下面這篇文章主要給大家介紹了關(guān)于npm?install總是卡住不動問題的解決辦法,需要的朋友可以參考下
    2022-05-05
  • node.js開機自啟動腳本文件

    node.js開機自啟動腳本文件

    這篇文章主要介紹了node.js開機自啟動腳本文件的方法和代碼,這里分享給大家,有需要的小伙伴參考下吧
    2014-12-12
  • Node.js Express安裝與使用教程

    Node.js Express安裝與使用教程

    Express 是一個簡潔而靈活的 node.js Web應(yīng)用框架, 提供了一系列強大特性幫助你創(chuàng)建各種 Web 應(yīng)用,這篇文章主要介紹了Node.js Express安裝與使用教程,非常具有實用價值,需要的朋友可以參考下
    2018-05-05
  • nvm介紹、安裝、報錯處理及使用詳細(xì)步驟

    nvm介紹、安裝、報錯處理及使用詳細(xì)步驟

    所謂nvm就是一個可以讓你在同一臺機器上安裝和切換不同版本node的工具,下面這篇文章主要給大家介紹了關(guān)于nvm介紹、安裝、報錯處理及使用的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • node.js中path路徑模塊的使用方法實例分析

    node.js中path路徑模塊的使用方法實例分析

    這篇文章主要介紹了node.js中path路徑模塊的使用方法,結(jié)合實例形式分析了node.js path路徑模塊的基本功能、原理、使用方法及操作注意事項,需要的朋友可以參考下
    2020-02-02
  • nodejs如何獲取當(dāng)前連接的網(wǎng)絡(luò)ip

    nodejs如何獲取當(dāng)前連接的網(wǎng)絡(luò)ip

    這篇文章主要介紹了nodejs如何獲取當(dāng)前連接的網(wǎng)絡(luò)ip問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • 解決npm管理員身份install時出現(xiàn)權(quán)限的問題

    解決npm管理員身份install時出現(xiàn)權(quán)限的問題

    下面小編就為大家分享一篇解決npm管理員身份install時出現(xiàn)權(quán)限的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-03-03
  • node啟動websocket保持后臺一直運行的方法

    node啟動websocket保持后臺一直運行的方法

    在 Node.js 中啟動一個 WebSocket 服務(wù)器并使其在后臺持續(xù)運行,你可以使用幾種方法,下面是一種常見的方法,通過創(chuàng)建一個簡單的 WebSocket 服務(wù)器并使用 node 命令直接運行它,同時確保它在后臺運行,需要的朋友可以參考下
    2024-10-10

最新評論

沾益县| 苏尼特左旗| 阿坝县| 日照市| 兴化市| 台中市| 横山县| 万荣县| 陵川县| 濮阳县| 邮箱| 静安区| 晋城| 奇台县| 黔西| 普兰店市| 兴山县| 嘉峪关市| 虹口区| 维西| 鹤壁市| 石台县| 铁力市| 志丹县| 绥芬河市| 阿瓦提县| 嘉黎县| 新野县| 鹤峰县| 开化县| 博白县| 荣成市| 永昌县| 余姚市| 盐源县| 武汉市| 彰化市| 清涧县| 临安市| 旬阳县| 滦平县|