閱讀180 返回首頁    go 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

使用表單上傳的基本流程

  1. 構建一個Post Policy。Policy的作用是網站開發者用來限製網站用戶上傳。例如可以指定上傳的大小,可以指定上傳的Object名字等,上傳成功後客戶端跳轉到的URL,上傳成功後客戶端收到的狀態碼。具體請參考Post Policy
    比如是這樣的一個簡單Policy,網站用戶能上傳的過期時間是 2115-01-27T10:56:19Z(這裏為了測試成功寫的過期時間很長,實際使用中不建議這樣設置),能上傳的文件最大為104857600字節。

    1. 以Python代碼為例子,Policy是json格式的字符串。
    2. policy="{"expiration":"2115-01-27T10:56:19Z","conditions":[["content-length-range", 0, 104857600]]}"
  2. 將Policy字符串進行base64編碼。
  3. 用OSS的AccessKeySecret對base64編碼後的Policy進行簽名。
  4. 構建上傳的HTML頁麵。
  5. 打開HTML頁麵,選擇文件上傳。

完整Python代碼示例:

  1. #coding=utf8
  2. import md5
  3. import hashlib
  4. import base64
  5. import hmac
  6. from optparse import OptionParser
  7. def convert_base64(input):
  8. return base64.b64encode(input)
  9. def get_sign_policy(key, policy):
  10. return base64.b64encode(hmac.new(key, policy, hashlib.sha1).digest())
  11. def get_form(bucket, endpoint, access_key_id, access_key_secret, out):
  12. #1 構建一個Post Policy
  13. policy="{"expiration":"2115-01-27T10:56:19Z","conditions":[["content-length-range", 0, 1048576]]}"
  14. print("policy: %s" % policy)
  15. #2 將Policy字符串進行base64編碼
  16. base64policy = convert_base64(policy)
  17. print("base64_encode_policy: %s" % base64policy)
  18. #3 用OSS的AccessKeySecret對編碼後的Policy進行簽名
  19. signature = get_sign_policy(access_key_secret, base64policy)
  20. #4 構建上傳的HTML頁麵
  21. form = '''
  22. <html>
  23. <meta http-equiv=content-type content="text/html; charset=UTF-8">
  24. <head><title>OSS表單上傳(PostObject)</title></head>
  25. <body>
  26. <form action="https://%s.%s" method="post" enctype="multipart/form-data">
  27. <input type="text" name="OSSAccessKeyId" value="%s">
  28. <input type="text" name="policy" value="%s">
  29. <input type="text" name="Signature" value="%s">
  30. <input type="text" name="key" value="upload/${filename}">
  31. <input type="text" name="success_action_redirect" value="https://oss.aliyun.com">
  32. <input type="text" name="success_action_status" value="201">
  33. <input name="file" type="file" >
  34. <input name="submit" value="Upload" type="submit">
  35. </form>
  36. </body>
  37. </html>
  38. ''' % (bucket, endpoint, access_key_id, base64policy, signature)
  39. f = open(out, "wb")
  40. f.write(form)
  41. f.close()
  42. print("form is saved into %s" % out)
  43. if __name__ == '__main__':
  44. parser = OptionParser()
  45. parser.add_option("", "--bucket", dest="bucket", help="specify ")
  46. parser.add_option("", "--endpoint", dest="endpoint", help="specify")
  47. parser.add_option("", "--id", dest="id", help="access_key_id")
  48. parser.add_option("", "--key", dest="key", help="access_key_secret")
  49. parser.add_option("", "--out", dest="out", help="out put form")
  50. (opts, args) = parser.parse_args()
  51. if opts.bucket and opts.endpoint and opts.id and opts.key and opts.out:
  52. get_form(opts.bucket, opts.endpoint, opts.id, opts.key, opts.out)
  53. else:
  54. 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來運行。

  1. 用法:
  2. python post_object.py --bucket=您的Bucket --endpoint=Bucket對應的OSS域名 --id=您的AccessKeyId --key=您的AccessKeySecret --out=輸出的文件名
  3. 示例:
  4. 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的主頁麵。

功能使用參考

最佳實踐

相關參考鏈接

最後更新:2016-11-23 16:04:09

  上一篇:go 簡單上傳__上傳文件_開發人員指南_對象存儲 OSS-阿裏雲
  下一篇:go 斷點續傳上傳__上傳文件_開發人員指南_對象存儲 OSS-阿裏雲