本示例介绍如何在服务端完成签名并通过表单直传数据到OSS。

说明 本示例无法实现分片上传与断点续传。

背景

采用JavaScript客户端直接签名(参见JavaScript客户端签名直传)时,AccessKeyID和AcessKeySecret会暴露在前端页面,因此存在严重的安全隐患。因此,OSS提供了服务端签名后直传的方案。

原理介绍

 服务端签名后直传_Web端PostObject直传实践_Web端上传数据至OSS_最佳实践_对象存储 OSS 阿里云技术文档

服务端签名后直传的原理如下:

  1. 用户发送上传Policy请求到应用服务器。
  2. 应用服务器返回上传Policy和签名给用户。
  3. 用户直接上传数据到OSS。

本示例中,Web端向服务端请求签名,然后直接上传,不会对服务端产生压力,而且安全可靠。但本示例中的服务端无法实时了解用户上传了多少文件,上传了什么文件。如果想实时了解用户上传了什么文件,可以采用服务端签名直传并设置上传回调

流程和源码解析

服务端签名后直传的源码流程和服务端签名直传并设置上传回调类似,请参见服务端签名直传并设置上传回调–原理介绍

代码示例

请参考服务端签名直传并设置上传回调中的各语言版本示例:

本场景是服务端签名后直传,并没有上传回调。与服务端签名直传并设置上传回调示例中的区别在于,在下载的客户端源码中打开upload.js文件,找到如下代码片段:

{
  'key' : g_object_name,
  'policy': policyBase64,
  'OSSAccessKeyId': accessid,
  'success_action_status' : '200', //让服务端返回200,不然,默认会返回204
  'callback' : callbackbody,
  'signature': signature,
}

'callback' : callback注释掉,这样就关闭了上传回调的开关,只提供服务端签名后直传的功能。

说明 如果要开启回调,请保证callbackbody计算正确。详情请参见Callback