整合指南
一個真的能打開的檔案網址(public),以及一條需要授權才讀得到的檔案路徑(gated)。
App 金鑰需要 X-HSystem-Token: {client_id}:{client_secret}。
GET /v1/files/by-path 回傳你上傳的 size 與 access;public 檔案直接用瀏覽器打開得到內容。
這篇會帶你做到什麼
上傳一個檔案,拿到它的 path;接著決定「誰可以讀」:
- public:任何人拿到網址就能讀,適合商品圖片、公開 PDF。
- gated:要帶憑證才讀得到,適合購買後才開放的內容。
先打這 3 支就好
| 順序 | 端點 | 做什麼 |
|---|---|---|
| 1 | POST /v1/files | 上傳(multipart 或 raw body) |
| 2 | GET /v1/files/by-path | 確認 meta(大小、access、到期) |
| 3 | GET /v1/files/public/{appId}/{path} | public 檔案的公開讀取網址 |
GET /v1/files 是列出你目前有哪些檔案路徑,卡住時先打它看資料在不在。
第 1 步:上傳(App 金鑰)
curl -s -X POST https://api.hsystem.halphastech.com/v1/files \
-H "Authorization: Basic $(printf '%s:%s' "$HS_CLIENT_ID" "$HS_CLIENT_SECRET" | base64)" \
-F "file=@./cover.png" \
-F "path=products/cover.png"
回應會給你這筆檔案的 path、size 與 access。上傳一定要用 App 金鑰(終端用戶 token 不行),因為這是「你的 App 在放檔案」。
不想用 multipart 的話,可以改成 raw body 並在 header 帶 X-File-Path: products/cover.png。
第 2 步:確認 meta
curl -s "https://api.hsystem.halphastech.com/v1/files/by-path?path=products/cover.png" \
-H "Authorization: Basic $HS_BASIC"
這裡看得到 access、size、expiresAt。如果 access 是 gated,第 3 步的公開網址會讀不到——那是預期行為。
第 3 步:讀取
public 檔案:直接組網址,不用憑證。
https://api.hsystem.halphastech.com/v1/files/public/{你的 appId}/products/cover.png
gated 檔案:呼叫 GET /v1/files/content?path=...,帶使用者 Bearer 或 App 金鑰。伺服器會依 access 設定決定放行或拒絕。
要改權限(例如從 gated 改成 public),用同一個 path 呼叫 PATCH /v1/files/by-path。
什麼時候該用 gated
- 付費內容、課程影片、發票 PDF。
- 使用者上傳的私人檔案。
購買後才開放的檔案還多一層:POST /v1/files/download-tokens 申請一次性下載憑證,再 GET /v1/files/download 換檔案;憑證用過即失效,適合不能外流的本體。
常見錯誤
- 用終端用戶 token 上傳:會失敗。上傳只認 App 金鑰。
- public 網址 404:先確認
access是public、且沒有過期;再確認appId沒填錯(是 App ID,不是client_id)。 - 把 gated 檔案網址貼給使用者:他會讀不到;要給的是「你的後端代理」或一次性下載憑證。
- path 帶開頭的斜線:
/products/cover.png與products/cover.png是不同 path,統一用不帶斜線的形式。
這篇用到的接口
參數、回應與錯誤碼看文件;想先看回應長什麼樣,直接開 Playground 的模擬模式。
- POST
/v1/files上傳檔案(multipart 或 raw body+X-File-Path)Playground → - GET
/v1/files/by-path依 path 取得檔案 meta(含 access/expiresAt)Playground → - GET
/v1/files/content依 path 串流內容(App 憑證或終端用戶 Bearer;依 access 閘;gated 拒絕)Playground → - GET
/v1/files/public/{appId}/{path}匿名公開讀取(僅 access=public 且未過期)Playground → - GET
/v1/files列出檔案路徑(需 App 憑證)Playground →

