阅读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-阿里云