七牛雲試用指南-單檔案直傳(原理)

無鋒之刃發表於2019-02-16

本篇介紹如何向七牛雲端儲存上傳單個檔案,限於篇幅,將分成原理與實踐兩部分。

為便於閱讀、編寫和執行程式,選定Ruby 2.1.0作為服務端實踐程式語言,視場景需要穿插其它程式設計工具(如HTML)的對應實現。為防止Ruby語法對理解程式邏輯產生不良影響,會盡量將程式碼組織成偽碼形式。

■ 介面形式

七牛雲選擇HTTP協議作為基準介面形式,以便實現跨越網際網路的遠端呼叫,減少防火牆、中間路由器帶來的意外影響。在此基準之上,根據不同的功能實現,會選擇不同的資料組織格式。本篇及後續文章均假定讀者已經熟悉HTTP協議。

通常,對於一個HTTP請求報文,有如下三個點需要注意:

  1. URI與QueryString部分,用於指定功能名稱與相關引數;
  2. Header部分,用於指定必要的非功能引數;
  3. Body部分,用於組織上傳資料或其它資訊。

相應的,對於一個HTTP響應報文,也有如下三個點需要注意:

  1. 響應狀態碼,指明伺服器的執行結果狀態;
  2. Header部分,包含有影響快取、資源元資訊等必要的設定值;
  3. Body部分,對於查詢類請求將返回以JSON格式組織的狀態和資訊資料,對於下載類請求將返回實際資料。

■ /upload介面

本介面實現直觀的單檔案直傳功能。為達到最大程度的普適性,使用multipart/from-data格式組織上傳資料。

一個上傳請求報文至少需要包含如下兩項資訊:

  • 上傳授權憑證(UploadToken);
  • 檔案內容(FileContent)與原始檔名(FileName)。

下面是可用的、最小且完整的上傳請求報文模板:

POST / HTTP/1.1
Host: up.qiniu.com
Content-Type: multipart/form-data; boundary=<Boundary>
Content-Length: <MultipartContentLength>

--<Boundary>
Content-Disposition: form-data; name="token"

<UploadToken>
--<Boundary>
Content-Disposition: form-data; name="file"; filename="<FileName>"

<FileContent>
--<Boundary>--

■ 上傳授權憑證

本質上,上傳並不需要授權,無非是把一團資料傳送給伺服器。但對於使用者而言,任何知曉上傳原理的第三方都可能濫用該功能,向伺服器提交垃圾資料,或是偽造/篡改資料,侵佔儲存空間,導致業務風險。因此七牛雲使用上傳授權憑證(稱為UploadToken)來控制什麼時刻之前向哪個儲存空間上傳檔案,避免業務風險。

一個有效的上傳授權憑證由三部分組成:

<AccessKey>:<EncodedSign>:<EncodedPutPolicy>

其中,

  1. <AccessKey>用於指明在發起上傳(即開發者賬號);
  2. <EncodedSign>UrlSafe-Base64編碼上傳策略的加密簽名,防止資訊被偽造或篡改。簽名演算法將在實踐篇中解釋;
  3. <EncodedPutPolicy>是經過UrlSafe-Base64編碼的上傳策略資訊,用於指明上傳截止時刻目標儲存空間

■ 上傳策略

上傳策略是以JSON格式組織的資料物件,用於指定上傳請求的各項引數。一個最小的完整示例如下:

{
        "scope":    "qiniu-ts-demo",
        "deadline": 1388506200
}

其中,

  • scope欄位指明目標儲存空間的名字;
  • deadline欄位指明上傳授權有效期的截止時間,是一個UNIX時間戳,單位為秒,示例值對應的時刻為”2014-01-01 00:10:00″(在Linux上可以執行 date -d"2014-01-01 00:00:00 10 minutes" +"%s" 得到該值)。

還可以在上傳策略中指定某些可以影響上傳行為的微調引數,後續文章會進行細節解釋,此處不再展開。

■ 我們們行進到哪兒了?

至此,讀者應該清楚瞭解向七牛雲端儲存上傳一個檔案需要準備哪些必需資訊。下一篇文章將進行程式設計實踐。

上一篇 基礎概念

下一篇 單檔案直傳(實踐)

回目錄


七牛雲端儲存 © 2014 署名-非商業性使用-禁止演繹

允許自由轉載,請註明作者及出處。

相關文章