使用又拍雲極速搭建圖牀

前言

某天在羣裏摸 🐟 ,聊到了圖牀相關的話題,羣友推薦了 又拍雲

說有活動,可以白嫖存儲,10G + 15G(HTTP/HTTPS 流量) 。筆者之前一直用的七牛雲 10G + 10G(回源流量)

又拍雲 七牛雲
註冊送1個月的代金券 + 網站掛推廣送1年代金券 註冊即可送每月都有

筆者就花了點時間研究了一下又拍雲的 SDK 和對象存儲,能力上完全可以平替七牛雲,於是就花了一點時間給圖牀應用加上了又拍雲的支持。

效果

大家可以訪問 https://imgbed.sugarat.top/ 直接體驗,默認已配置 又拍雲 存儲

下面將介紹 又拍雲對象存儲配置,關鍵API用法,如何接入上述圖牀。

對象存儲服務創建

這裏直接省略賬號註冊,參加推廣活動等步驟,直接進入對象存儲配置頁面。

訪問對象存儲控制檯,點擊創建服務

這個"服務"和其它平臺的 Bucket(桶) 類似,可以理解爲存儲空間的概念。

填一下服務名稱(全平臺唯一),綁定賬號即可

服務創建完,需要的東西基本都有了,是不是非常簡單!

  • 服務名:自定義
  • 賬號:自定義
  • 密碼:自動生成
  • 域名:測試域名 serviceName.test.upcdn.net

API 使用

token 生成

這裏推薦使用 token 認證 根據文檔:認證鑑權可知生成方式如下:

看不懂?沒關係 GPT 可以幫你,直接複製丟給它。

這不代碼就來了。

我們可以適當優化一下,不需要用到第三方庫base64-js,直接使用 Node.js 的內置模塊crypto 即可。

import crypto from 'crypto'

/**
 * 生成 upyun 上傳token
 * @param {*} operator 賬號
 * @param {*} password 密碼
 * @param {*} method 方法(PUT)
 * @param {*} uriPrefix 請求公共前綴
 * @param {*} date 過期時間
 * @returns 上傳憑證
 */
function generateUpyunToken(operator, password, method, uriPrefix, date) {
  // 密碼的md5值,祕鑰
  const secret = crypto.createHash('md5').update(password).digest('hex')

  // 構造用於計算校驗值的字符串
  const value = `${method}&${uriPrefix}&${date}`

  // 使用 hmac-sha1 算法生成token
  const token = crypto.createHmac('sha1', secret) // 使用密碼的MD5值作爲祕鑰
    .update(value) // 設置用於計算校驗值的字符串
    .digest() // 計算校驗值
    .toString('base64') // 轉換爲base64 格式

  // 組合成要求的格式
  return `UPYUN ${operator}:${token}`
}

代碼非常簡潔明瞭,使用方式如下

const token = generateUpyunToken('賬號',
  '密碼',
  'PUT',
  '服務名/資源公共前綴路徑', // 服務名 + 公共資源前綴路徑構成
  new Date().getTime() + 1000 * 60 * 60 * 24 * 90 // 計算過期時間 90天后的日期
)

理論上這個 token 也可以在前端生成,調用和後端一致的算法即可。

前端上傳

① 安裝 upyun sdk

npm i upyun

② 上傳示例

根據文檔,可以看到客戶端上傳需要的參數。

  • Authorization:前面通過生成的token
  • X-Date:請求日期時間,GMT 格式字符串
  • X-Upyun-Uri-Prefix:服務名 + 資源公共前綴路徑
  • X-Upyun-Expire:過期時間

下面就是核心的上傳方法。

import upyun from 'upyun'

const service = new upyun.Service('服務名')
const client = new upyun.Client(service, () => ({
  'Authorization': '前面通過生成的token',
  'X-Date': new Date().toUTCString(),
  'X-Upyun-Uri-Prefix': '服務名/資源公共前綴路徑',
  'X-Upyun-Expire': date, // 前面生成 Token 時的 date 參數
}))

const sourceKey = '資源公共前綴路徑/資源名' // 'test/imgs/abc.png'

// 調用上傳
client.putFile(sourceKey, file) // 返回值 Promise<boolean>

③ 方法封裝

我們可以簡單封裝一下,方便調用

interface UPYunConfig {
  /**
   * 服務名
   */
  serviceName: string
  /**
   * 上傳憑證
   */
  token: string
  /**
   * 資源公共前綴
   */
  prefix: string
  /**
   * 過期時間 new Date().getTime() + 1000 * 60 * 60 * 24 * 90
   */
  date: number
  /**
   * 域名(用於拼接最後的訪問鏈接)
   */
  domain: string
  /**
   * 最後的資源名,建議使用 uuid 或者文件的 MD5
   */
  filename?: string
}
async function uploadFile(file: File, ops: UPYunConfig) {
  const { serviceName, prefix, token, date, domain, filename } = ops

  const service = new upyun.Service(serviceName)
  const client = new upyun.Client(service, () => ({
    'Authorization': token,
    'X-Date': new Date().toUTCString(),
    'X-Upyun-Uri-Prefix': `${serviceName}/${prefix}`,
    'X-Upyun-Expire': date,
  }))

  const key = `${prefix}/${filename || file.name}`

  const isSuccess = await client.putFile(key, file)
  // 返回最後可以用於訪問的鏈接
  return isSuccess ? Promise.resolve(`${domain}/${key}`) : Promise.reject(new Error('上傳失敗'))
}

接入純靜態圖牀

上述邏輯我都封裝在了自己的圖牀應用中:GitHub: image-bed-qiniu

只需要在 cli 目錄下,修改 .env 配置文件

# 又拍雲相關配置
UPYUN_OPERATOR=operator
UPYUN_PASSWORD=password
UPYUN_BUCKET=service-name
UPYUN_DOMAIN=http://service-name.test.upcdn.net
UPYUN_PREFIX=image
UPYUN_SCOPE=default
# token有效期,默認3個月,單位秒,你可以自行設置(60*60*24*30)
# UPYUN_EXPIRES=2592000

執行 node upyun-token.js 即可生成需要的 token。

將其粘貼配置到 線上的圖牀應用,或者自己部署的均可 image-bed-qiniu:client

其它

線上使用,推薦 綁定自定義域名 和 開啓HTTPS 支持。

這兩個直接在平臺里根據指引操作即可,步驟也很簡單。

最後

後續準備提供一個圖牀的 Docker 鏡像,這樣部署起來也更加方便。

大家有其它可白嫖的圖牀也可推薦推薦一下。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章