180
阿裏雲
表單上傳__上傳文件_開發人員指南_對象存儲 OSS-阿裏雲
適用場景
表單上傳是一種適用於小文件上傳的上傳方式,指的是用戶使用OSS API中的Post Object請求來完成Object的上傳。非常適合嵌入在HTML網頁中來上傳Object。比較常見的應用場景是網站應用,以招聘網站為例子:
| 不使用表單上傳 | 表單上傳 | |
|---|---|---|
| 流程對比 | 1. 網站用戶上傳簡曆 2. 網站服務器回應上傳頁麵 3. 簡曆被上傳到網站服務器 4. 網站服務器再將簡曆上傳到OSS |
1. 網站用戶上傳簡曆 2. 網站服務器回應上傳頁麵 3. 簡曆上傳到OSS |
上傳限製
- 大小限製:在這種上傳方式下,Object不能超過5GB。
- 命名限製:
- 使用UTF-8編碼
- 長度必須在1-1023字節之間
- 不能以“/”或者“”字符開頭
使用表單上傳的好處
- 從流程上,少了一步轉發。
- 從架構上來說,原來的上傳都統一走網站服務器,上傳量過大時,瓶頸在網站服務器,可能需要擴容網站服務器。采用表單上傳後,上傳都是直接從客戶端發送到OSS。上傳量過大時,壓力都在OSS上,由OSS來保障服務質量。
上傳的安全及授權
為了防止第三方往開發者的Bucket未經授權上傳,OSS提供了Bucket和Object級別的訪問權限控製,詳細解釋見 訪問控製。為了授權給第三方上傳,這裏使用的是Post Policy的機製,詳細見 PostObject。
使用表單上傳的基本流程
構建一個Post Policy。Policy的作用是網站開發者用來限製網站用戶上傳。例如可以指定上傳的大小,可以指定上傳的Object名字等,上傳成功後客戶端跳轉到的URL,上傳成功後客戶端收到的狀態碼。具體請參考Post Policy。
比如是這樣的一個簡單Policy,網站用戶能上傳的過期時間是 2115-01-27T10:56:19Z(這裏為了測試成功寫的過期時間很長,實際使用中不建議這樣設置),能上傳的文件最大為104857600字節。以Python代碼為例子,Policy是json格式的字符串。policy="{"expiration":"2115-01-27T10:56:19Z","conditions":[["content-length-range", 0, 104857600]]}"
- 將Policy字符串進行base64編碼。
- 用OSS的AccessKeySecret對base64編碼後的Policy進行簽名。
- 構建上傳的HTML頁麵。
- 打開HTML頁麵,選擇文件上傳。
完整Python代碼示例:
#coding=utf8import md5import hashlibimport base64import hmacfrom optparse import OptionParserdef convert_base64(input):return base64.b64encode(input)def get_sign_policy(key, policy):return base64.b64encode(hmac.new(key, policy, hashlib.sha1).digest())def get_form(bucket, endpoint, access_key_id, access_key_secret, out):#1 構建一個Post Policypolicy="{"expiration":"2115-01-27T10:56:19Z","conditions":[["content-length-range", 0, 1048576]]}"print("policy: %s" % policy)#2 將Policy字符串進行base64編碼base64policy = convert_base64(policy)print("base64_encode_policy: %s" % base64policy)#3 用OSS的AccessKeySecret對編碼後的Policy進行簽名signature = get_sign_policy(access_key_secret, base64policy)#4 構建上傳的HTML頁麵form = '''<html><meta http-equiv=content-type content="text/html; charset=UTF-8"><head><title>OSS表單上傳(PostObject)</title></head><body><form action="https://%s.%s" method="post" enctype="multipart/form-data"><input type="text" name="OSSAccessKeyId" value="%s"><input type="text" name="policy" value="%s"><input type="text" name="Signature" value="%s"><input type="text" name="key" value="upload/${filename}"><input type="text" name="success_action_redirect" value="https://oss.aliyun.com"><input type="text" name="success_action_status" value="201"><input name="file" type="file" ><input name="submit" value="Upload" type="submit"></form></body></html>''' % (bucket, endpoint, access_key_id, base64policy, signature)f = open(out, "wb")f.write(form)f.close()print("form is saved into %s" % out)if __name__ == '__main__':parser = OptionParser()parser.add_option("", "--bucket", dest="bucket", help="specify ")parser.add_option("", "--endpoint", dest="endpoint", help="specify")parser.add_option("", "--id", dest="id", help="access_key_id")parser.add_option("", "--key", dest="key", help="access_key_secret")parser.add_option("", "--out", dest="out", help="out put form")(opts, args) = parser.parse_args()if opts.bucket and opts.endpoint and opts.id and opts.key and opts.out:get_form(opts.bucket, opts.endpoint, opts.id, opts.key, opts.out)else:print "python %s --bucket=your-bucket --endpoint=oss-cn-hangzhou.aliyuncs.com --id=your-access-key-id --key=your-access-key-secret --out=out-put-form-name" % __file__
將此段代碼保存為post_object.py,然後用python post_object.py來運行。
用法:python post_object.py --bucket=您的Bucket --endpoint=Bucket對應的OSS域名 --id=您的AccessKeyId --key=您的AccessKeySecret --out=輸出的文件名示例:python post_object.py --bucket=oss-sample --endpoint=oss-cn-hangzhou.aliyuncs.com --id=tphpxp --key=ZQNJzf4QJRkrH4 --out=post.html
注意:
- 構建的表單中
"success_action_redirect" value="https://oss.aliyun.com"表示的是上傳成功後跳轉的頁麵。可以替換。- 構建的表單中
"success_action_status" value="201"表示的是上傳成功後返回的狀態碼為201。可以替換。- 假如指定生成的HTML文件為post.html,打開post.html,選擇文件上傳。在這個例子中如果成功則會跳轉到OSS的主頁麵。
功能使用參考
- API:PostObject
最佳實踐
相關參考鏈接
最後更新:2016-11-23 16:04:09
上一篇:
簡單上傳__上傳文件_開發人員指南_對象存儲 OSS-阿裏雲
下一篇:
斷點續傳上傳__上傳文件_開發人員指南_對象存儲 OSS-阿裏雲
VirtualBorderRouterType__數據類型_API 參考_雲服務器 ECS-阿裏雲
推薦碼的使用規則___推薦碼_代金券及推薦碼_財務-阿裏雲
CID 投遞統計__發布訂閱統計接口_Open API_消息隊列 MQ-阿裏雲
查詢可用鏡像__鏡像相關接口_API 參考_雲服務器 ECS-阿裏雲
訪問控製__Android SDK_SDK使用手冊_消息服務-阿裏雲
產品定價__購買指南_E-MapReduce-阿裏雲
訪問域名__訪問與控製_開發人員指南_對象存儲 OSS-阿裏雲
NAT網關__網關_用戶指南_專有網絡 VPC-阿裏雲
ColumnType__DataType_API 參考_表格存儲-阿裏雲
分區__公共資源說明_API-Reference_日誌服務-阿裏雲
相關內容
常見錯誤說明__附錄_大數據計算服務-阿裏雲
發送短信接口__API使用手冊_短信服務-阿裏雲
接口文檔__Android_安全組件教程_移動安全-阿裏雲
運營商錯誤碼(聯通)__常見問題_短信服務-阿裏雲
設置短信模板__使用手冊_短信服務-阿裏雲
OSS 權限問題及排查__常見錯誤及排除_最佳實踐_對象存儲 OSS-阿裏雲
消息通知__操作指南_批量計算-阿裏雲
設備端快速接入(MQTT)__快速開始_阿裏雲物聯網套件-阿裏雲
查詢API調用流量數據__API管理相關接口_API_API 網關-阿裏雲
使用STS訪問__JavaScript-SDK_SDK 參考_對象存儲 OSS-阿裏雲