91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

基于服務端怎么實現OSS文件直傳

發布時間:2022-06-14 09:21:52 來源:億速云 閱讀:308 作者:zzz 欄目:開發技術

這篇文章主要介紹“基于服務端怎么實現OSS文件直傳”,在日常操作中,相信很多人在基于服務端怎么實現OSS文件直傳問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”基于服務端怎么實現OSS文件直傳”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

    優缺點

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

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

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

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

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

    流程

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

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

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

    邏輯拆解

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

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

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

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

    代碼實現

    我們先考慮將流程的每一步實現,然后再將流程代碼封裝成函數。

    OSS 配置

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

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

    policy 內容

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

    有效期

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

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

    文件名

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

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

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

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

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

    將以上內容整合,就形成了 policy 文本,以下是一個基礎格式:

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

    轉化 policy

    policyText 轉化為 Base64 格式后,就是要求的 policy 了。

    // 將 policyText 轉化為 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')

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

    進一步分析

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

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

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

    (3) policy 還有更多的配置內容,可以抽取一部分做成配置項,例如“允許上傳的最大體積”。

    完整代碼

    以下是封裝為“服務”的使用 Nest.js Web 框架的相關代碼,供參考。

    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 的調用憑證
       *
       * @param config 配置項
       *
       * @see [配置內容](https://help.aliyun.com/document_detail/31988.html#title-6w1-wj7-q4e)
       */
      generateClientToken(config: GenerateClientTokenConfig): ClientToken {
        /** 目錄名稱 */
        const dirname = config.dirname
    
        /** 有效時間:默認 4 小時 */
        const timeout = (config.expiration || 4) * 60 * 60 * 1000
    
        /** 上傳最大體積,默認 100M */
        const maxSize = (config.maxSize || 100) * 1024 * 1024
    
        /** 隨機文件名(去掉短橫線的 uuid) */
        const filename = uuidv4().replace(/-/gu, '')
    
        /** 文件路徑 */
        const key = dirname + '/' + filename
    
        /** 到期時間:當前時間 + 有效時間 */
        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 轉化為 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 }
      }
    }

    到此,關于“基于服務端怎么實現OSS文件直傳”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    oss
    AI

    屏山县| 修武县| 翁源县| 灵寿县| 沁水县| 交城县| 香河县| 濮阳县| 威信县| 平阳县| 万源市| 临湘市| 项城市| 威远县| 宁蒗| 津市市| 霍山县| 诸暨市| 南宁市| 汉源县| 来宾市| 丁青县| 晴隆县| 兴仁县| 兴安县| 成安县| 沙田区| 裕民县| 志丹县| 林州市| 柳河县| 专栏| 郧西县| 密山市| 库尔勒市| 年辖:市辖区| 罗江县| 吉林省| 揭阳市| 洞头县| 宣恩县|