180
iPhone_iPad_Mac_手機_平板_蘋果apple
表單上傳__上傳文件_開發人員指南_對象存儲 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=utf8
import md5
import hashlib
import base64
import hmac
from optparse import OptionParser
def 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 Policy
policy="{"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-阿裏雲