文档

服务端签名直传

更新时间:

服务端签名直传是指在服务端生成签名,将签名返回给客户端,然后客户端使用签名上传文件到OSS。由于服务端签名直传无需将访问密钥暴露在前端页面,相比客户端签名直传具有更高的安全性。本文介绍如何进行服务端签名直传。

请求流程

服务端签名直传流程如下图所示。

image

权限说明

要使用服务端签名直传时,您必须拥有oss:PutObject权限。具体操作,请参见为RAM用户授权

操作示例

服务端签名直传并设置上传回调提供了以下语言的操作示例:

代码解析

服务端签名直传的详细流程如下。

  1. 用户向应用服务器请求上传Policy。

    客户端源码中的upload.js文件的以下代码片段的变量serverUrl的值设置为应用服务器的URL。

    // serverUrl是用户获取签名和Policy等信息的应用服务器的URL,请将下面的IP和Port配置为您自己的真实信息。
    serverUrl = 'http://88.88.XX.XX:8888';
    

    设置完成后,客户端会向该serverUrl发送Get请求来获取需要的信息。

    本场景为服务端签名后直传,不涉及上传回调(callback)。您需要将客户端源码中的upload.js内的'callback' : callbackbody字段注释掉,以关闭上传回调功能。修改示例如下:

    {
      'key' : key + '${filename}',
      'policy': policyBase64,
      'OSSAccessKeyId': accessid,
      // 设置服务端返回200状态码,默认返回204。
      'success_action_status' : '200', 
      // 'callback' : callbackbody,  
      'signature': signature,
    }
  2. 应用服务器返回上传Policy和签名给用户。

    应用服务器侧的签名直传服务会处理客户端发送的Get请求消息,您可以设置对应的代码让应用服务器能够给客户端返回正确的消息。

    以下是签名直传服务返回给客户端消息Body内容的示例:

    {
      "accessid":"LTAI5tBDFVar1hoq****",
      "host":"https://post-test.oss-cn-hangzhou.aliyuncs.com",
      "policy":"eyJleHBpcmF0aW9uIjoiMjAxNS0xMS0wNVQyMDoyMzoyM1oiLCJjxb25kaXRpb25zIjpbWyJjcb250ZW50LWxlbmd0aC1yYW5nZSIsMCwxMDQ4NTc2MDAwXSxbInN0YXJ0cy13aXRoIiwiJGtleSIsInVzZXItZGlyXC8i****",
      "signature":"VsxOcOudx******z93CLaXPz+4s=",
      "expire":1446727949,
      "dir":"user-dirs/"
    }

    Body中的各字段说明如下:

    字段

    描述

    accessid

    用户请求的AccessKey ID。

    host

    用户发送上传请求的域名。

    说明

    host不支持自定义域名。

    policy

    用户表单上传的策略(Policy),Policy为经过Base64编码过的字符串。详情请参见Post Policy

    signature

    对Policy签名后的字符串。详情请参见Post Signature

    expire

    由服务器端指定的Policy过期时间,格式为Unix时间戳(自UTC时间1970年01月01号开始的秒数)。

    dir

    限制上传的文件前缀。

  3. 用户使用POST方法向OSS发送文件上传请求。

    说明
    • 除file表单域外,包含key在内的其他所有表单域的大小均不能超过8 KB。

    • 客户端上传默认同名覆盖,如果您不希望覆盖同名文件,可以在上传请求的header中携带参数x-oss-forbid-overwrite,并指定其值为true。当您上传的文件在OSS中存在同名文件时,该文件会上传失败,并返回FileAlreadyExists错误。

    new_multipart_params = {
         // key表示上传到Bucket内的Object的完整路径,例如exampledir/exampleobject.txtObject,完整路径中不能包含Bucket名称。
         // filename表示待上传的本地文件名称。
         'key' : key + '${filename}',
         'policy': policyBase64,
         'OSSAccessKeyId': accessid,
         // 设置服务端返回状态码为200,不设置则默认返回状态码204。
         'success_action_status' : '200',
         'signature': signature,
     };
    

操作步骤

快速部署

您可以使用资源编排ROS一键配置1个云服务器ECS实例和1个对象存储OSS Bucket,并在云服务器ECS实例上部署应用服务器源码客户端源码,从而快速体验服务端签名直传。使用资源编排ROS快速体验服务端签名直传的操作步骤如下。

  1. 一键部署云资源。

    1. 打开一键配置模板链接

    2. 资源编排 ROS控制台,输入资源栈名称,输入新建OSS Bucket的名称,设置新购ECS的可用区、实例类型、系统盘类型、实例密码,然后单击创建

      资源栈的资源栈信息页签下状态显示创建中

    3. 资源栈的状态显示创建成功后,单击输出页签,查看一键部署的云服务器ECS实例、OSS Bucket。

  2. 体验服务端签名直传。

    1. 输出页签下,复制OssClientAddress的值,然后在浏览器中打开。

    2. OSS web直传页面,单击选择文件,选择指定类型的文件,然后单击开始上传

  3. 体验完成后,释放测试资源,避免继续产生费用。

    1. 资源栈页面的右上角,单击删除

    2. 删除资源栈页面,确保删除方式释放资源,然后单击确定

相关文档

大多数情况下,应用服务器需要了解用户上传了哪些文件以及对应的文件名称等信息。如果上传的是图片,还希望获取图片大小等。此时,您可以通过上传回调方案实现该需求。关于服务端签名直传并设置上传回调的介绍,请参见服务器端签名直传并设置上传回调

  • 本页导读 (1)
文档反馈