服务端签名直传

更新时间:

服务端生成签名以实现Web端直传,使用户能够通过Web浏览器直接使用PostObject接口上传文件到OSS。此过程通过签名机制确保上传的安全性。同时,根据具体业务需求,您可以在服务端生成上传策略(Policy),以限制上传操作。

方案概览

服务端生成签名实现Web端直传的过程如下:

image

要实现服务端签名直传,只需3步:

说明

由于使用了临时访问凭证,整个过程中不会泄露业务服务器的长期密钥,保证了文件上传的安全性。

  1. 配置OSS:配置OSS,在控制台创建一个Bucket,用于存储用户上传的文件。同时,为 Bucket 配置跨域资源共享(CORS) 规则,以允许来自服务端的跨域请求。

  2. 配置服务端:配置服务端,调用STS服务获取一个临时访问凭证,然后使用临时访问凭证和服务端预设的上传策略(如Bucket名称、目录路径、过期时间等)生成签名授权用户在一定时间内进行文件上传。

  3. 配置Web端:配置Web端,构造HTML表单请求,通过表单提交使用签名将文件上传到OSS。

操作步骤

您可以点击一键部署在您的本地服务器快速部署并体验服务端签名直传。部署完成后,复制输出页签下OssClientAddress的地址,通过您的浏览器体验文件直传OSS。

步骤一:配置OSS

一、创建Bucket

创建一个OSS Bucket,用于存储Web应用在浏览器环境中直接上传的文件。

  1. 登录OSS管理控制台

  2. 在左侧导航栏,单击Bucket 列表然后单击创建 Bucket

  3. 创建 Bucket面板,选择快捷创建,按如下说明配置各项参数。

    参数

    示例值

    Bucket名称

    web-direct-upload

    地域

    华东1(杭州)

  4. 点击完成创建

二、配置CORS规则

为创建的OSS Bucket配置CORS规则。

  1. 访问Bucket列表,然后单击目标Bucket名称。

  2. 跨域设置页面,单击创建规则

  3. 创建跨域规则面板,按以下说明设置跨域规则。

    参数

    示例值

    来源

    *

    允许Methods

    POST、PUT、GET

    允许Headers

    *

  1. 单击确定

步骤二:配置服务端

说明

在实际部署时,如果您已经有自己的业务服务器,则无需进行准备工作,直接跳转到一、配置用户权限

准备工作:创建一台ECS实例作为业务服务器

操作一:创建ECS实例

请您进入自定义购买页面,并根据如下各模块的内容,创建或选择购买ECS实例所需的基础资源。

  1. 选择地域 & 付费类型

    1. 根据业务需求,选择合适的付费类型。本文选择按量付费模式,此模式操作相对灵活。

    2. 基于业务场景对时延的要求,选择地域。通常来说离ECS实例的物理距离越近,网络时延越低,访问速度越快。本文以选择华东1(杭州)为例。

      image

  1. 创建专有网络VPC & 交换机

    创建VPC时,请您选择和ECS相同的地域,并根据业务需求规划网段。本文以创建华东1(杭州)地域的VPC和交换机为例。创建完毕后返回ECS购买页,刷新并选择VPC及交换机。

    说明

    创建VPC时,可同时创建交换机。

    image

    image

    image

  1. 选择规格 & 镜像

    选择实例的规格及镜像,镜像为实例确定安装的操作系统及版本。本文选择的实例规格为ecs.e-c1m1.large,在满足测试需求的同时,价格较为实惠。镜像为公共镜像Alibaba Cloud Linux 3.2104 LTS 64位

    image

  1. 选择存储

    为ECS实例选择系统盘,并按需选择数据盘。本文实现简单Web系统搭建,只需要系统盘存储操作系统,无需数据盘。

    image

  1. 绑定公网IP

    本实例需要支持公网访问。为了简化操作,本文选择直接为实例分配公网IP。您也可以在创建实例后,为实例绑定弹性公网IP,具体操作,请参见将EIP绑定至ECS实例

    说明
    • 若未绑定公网IP,将无法使用SSH或RDP通过公网直接访问实例,也无法通过公网验证实例中Web服务的搭建。

    • 本文选择按使用流量的带宽计费模式。此模式只需为所消耗的公网流量付费。更多信息,请参见公网带宽计费

    image

  1. 创建安全组

    为实例创建安全组。安全组是一种虚拟网络防火墙,能够控制ECS实例的出入流量。创建时,需要设置放行以下指定端口,便于后续访问ECS实例。

    端口范围:SSH(22)、RDP(3389)、HTTP(80)、HTTPS(443)。

    说明
    • 端口范围处选中的是ECS实例上运行的应用需开放的端口。

    • 此处创建的安全组默认设置0.0.0.0/0作为源的规则。0.0.0.0/0表示允许全网段设备访问指定的端口,如果您知道请求端的IP地址,建议后续设置为具体的IP范围。具体操作,请参见修改安全组规则

    image

  1. 创建密钥对

    1. 密钥对可作为登录时证明个人身份的安全凭证,创建完成后,必须下载私钥,以供后续连接ECS实例时使用。创建完毕后返回ECS购买页,刷新并选择密钥对。

    2. root具有操作系统的最高权限,使用root作为登录名可能会导致安全风险,建议您选择ecs-user作为登录名。

      说明

      创建密钥对后,私钥会自动下载,请您关注浏览器的下载记录,保存.pem格式的私钥文件。

      image

  1. 创建并查看ECS实例

    创建或选择好ECS实例所需的基础资源后,勾选《云服务器ECS服务条款》《云服务器ECS退订说明》,单击确认下单。在提示成功的对话框中,单击管理控制台,即可在控制台查看到创建好的ECS实例。请您保存以下数据,以便在后续操作中使用。

    • 实例ID:便于在实例列表中查询到该实例。

    • 地域:便于在实例列表中查询到该实例。

    • 公网IP地址:便于在后续使用ECS实例时,做Web服务的部署结果验证。

    imageimage

操作二:连接ECS实例

  1. 云服务器ECS控制台实例列表页面,根据地域、实例ID找到创建好的ECS实例,单击操作列下的远程连接image

  2. 远程连接对话框中,单击通过Workbench远程连接对应的立即登录image

  3. 登录实例对话框中,选择认证方式SSH密钥认证,用户名为ecs-user,输入或上传创建密钥对时下载的私钥文件,单击确定,即可登录ECS实例。

    说明

    私钥文件在创建密钥对时自动下载到本地,请您关注浏览器的下载记录,查找.pem格式的私钥文件。

    image

  4. 显示如下页面后,即说明您已成功登录ECS实例。image

一、配置用户权限

说明

为了确保部署完成后不会因为操作未授权而导致文件上传到OSS失败,建议您先按照以下步骤创建RAM用户并配置相应的权限。

操作一:在访问控制创建RAM用户

首先,创建一个调用方式为OpenAPI调用的RAM用户,并获取对应的访问密钥,作为业务服务器的应用程序的长期身份凭证。

  1. 使用云账号或账号管理员登录RAM控制台

  2. 在左侧导航栏,选择身份管理 > 用户

  3. 单击创建用户

  4. 输入登录名称显示名称

  5. 调用方式区域下,选择OpenAPI调用,然后单击确定

重要

RAM用户的AccessKey Secret只在创建时显示,后续不支持查看,请妥善保管。

  1. 单击操作下的复制,保存调用密钥(AccessKey ID和AccessKey Secret)。

操作二:在访问控制为RAM用户授予调用AssumeRole接口的权限

创建RAM用户后,需要授予RAM用户调用STS服务的AssumeRole接口的权限,使其可以通过扮演RAM角色来获取临时身份凭证。

  1. 在左侧导航栏,选择身份管理 > 用户

  2. 用户页面,找到目标RAM用户,然后单击RAM用户右侧的添加权限

  3. 新增授权页面,选择AliyunSTSAssumeRoleAccess系统策略。

    说明

    授予RAM用户调用STS服务AssumeRole接口的固定权限是AliyunSTSAssumeRoleAccess,与后续获取临时访问凭证以及通过临时访问凭证发起OSS请求所需权限无关。

    image.png

  4. 单击确认新增授权

操作三:在访问控制创建RAM角色

为当前云账号创建一个RAM角色,并获取对应的角色的ARN(Aliyun Resource Name,阿里云资源名称),用于RAM用户之后进行扮演。

  1. 在左侧导航栏,选择身份管理 > 角色

  2. 单击创建角色,可信实体类型选择阿里云账号,单击下一步

  3. 填写角色名称,选择当前云账号

  4. 单击完成。完成角色创建后,单击关闭

  5. 在RAM角色管理页面,搜索框输入角色名称,例如oss-web-upload

  6. 单击复制,保存角色的ARN。

    1.png

操作四:在访问控制创建上传文件的权限策略

按照最小授权原则,为RAM角色创建一个自定义权限策略,限制只能向指定OSS的存储空间进行上传操作。

  1. 在左侧导航栏,选择权限管理 > 权限策略

  2. 单击创建权限策略

  3. 创建权限策略页面,单击脚本编辑,将以下脚本中的<Bucket名称>替换为准备工作中创建的Bucket名称web-direct-upload

    {
      "Version": "1",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": "oss:PutObject",
          "Resource": "acs:oss:*:*:<Bucket名称>/*"
        }
      ]
    }
  4. 策略配置完成后,单击继续编辑基本信息

  5. 基本信息区域,填写策略名称,然后单击确定

操作五:在访问控制为RAM角色授予权限

为RAM角色授予创建的自定义权限,以便该RAM角色被扮演时能获取所需的权限。

  1. 在左侧导航栏,选择身份管理 > 角色

  2. 角色页面,找到目标RAM角色,然后单击RAM角色右侧的新增授权

  3. 新增授权页面下的自定义策略页签,选择已创建的自定义权限策略。

  4. 单击确定

二、配置服务端参数

在开始集成阿里云对象存储服务(OSS)之前,首先需要在服务端代码中正确配置一系列关键变量。

说明

为了确保安全性,建议您将敏感信息(如accessKeyIdaccessKeySecretroleArn)配置为环境变量,而不是硬编码在代码中。

Python

# 配置环境变量ALIBABA_CLOUD_ACCESS_KEY_ID。
accessKeyId = os.environ.get('OSS_ACCESS_KEY_ID')
# 配置环境变量ALIBABA_CLOUD_ACCESS_SECRET。
accessKeySecret = os.environ.get('OSS_ACCESS_KEY_SECRET')
# 配置环境变量OSS_STS_ROLE_ARN
roleArn = os.environ.get('OSS_STS_ROLE_ARN')
# 可以替换为您的Bucket名称。
bucket = 'web-direct-upload'
# 可以替换为您的region_id。
region = 'cn-hangzhou'
# 指定上传到OSS的文件前缀。
upload_dir = 'user-dirs'
# 指定过期时间,单位为秒。
expire_time = 3600

Node.js

const config = {
  // 从环境变量中获取RAM用户的访问密钥和目标RAM角色的Arn.
  accessKeyId: process.env.OSS_ACCESS_KEY_ID,
  accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
  roleArn: process.env.OSS_STS_ROLE_ARN,
  // region填写Bucket所在地域。以华东1(杭州)为例,Region填写为oss-cn-hangzhou。
  region: "oss-cn-hangzhou",
  // 指定Bucket名称,可以替换为您的Bucket名称
  bucket: "web-direct-upload",
  upload_dir: "user-dirs",
  seconds: 3600,
};

Java

/**
 * 将 region 替换为 您的地域id,例如 cn-hangzhou
 */
private String region = "cn-hangzhou";
/**
 * 将 your-bucket 替换为 Bucket 名称
 */
private String bucket = "web-direct-upload";
/**
 * 指定上传到 OSS 的文件前缀
 */
private String upload_dir = "user-dirs";
/**
 * 指定过期时间,单位为秒
 */
private long expire_time = 3600;
/**
 * 通过环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID 设置 accessKeyId
 */
private String accessKeyId = System.getenv("OSS_ACCESS_KEY_ID");
/**
 * 通过环境变量 ALIBABA_CLOUD_ACCESS_KEY_SECRET 设置 accessKeySecret
 */
private String accessKeySecret = System.getenv("OSS_ACCESS_KEY_SECRET");

private String roleArn = System.getenv("OSS_STS_ROLE_ARN");

字段

描述

accessKeyId

用户的访问密钥ID。

accessKeySecret

用户的访问密钥密码。

roleArn

目标RAM角色的Arn,用于STS服务生成临时凭证

bucket

用户的OSS Bucket名称,用于指定文件上传的目标Bucket。

region

用户的Bucket所在的地域,例如“cn-hangzhou”表示华东1(杭州)

upload_dir

指定上传到OSS的文件前缀。

expire_time

请求的有效期限,单位为秒,例如3600秒表示1小时。

三、服务端请求获取临时访问凭证

服务器接收到Web端发送的用户上传文件的请求后,使用自己的长期凭证(accessKeyIdaccessKeySecret)向阿里云STS请求一个临时授权凭证,这个临时凭证将授权Web端在限定的时间内对特定资源进行操作。

说明

在各类语言(如Python、Java、Go、PHP、Ruby等)中,都需要导入对应的阿里云STS SDK来执行assumeRole操作。确保这个过程在安全的环境下执行,并且临时访问凭证的使用应限制在最小必要范围内。

Python

# 初始化配置,直接传递凭据
config = Config(
    region_id=region,
    access_key_id=access_key_id,
    access_key_secret=access_key_secret
)
# 创建STS客户端并获取临时凭证
sts_client = Sts20150401Client(config=config)
assume_role_request = sts_20150401_models.AssumeRoleRequest(
    role_arn=role_arn_for_oss_upload,
    role_session_name=role_session_name
)
response = sts_client.assume_role(assume_role_request)
token_data = response.body.credentials.to_map()

Node.js

/* 使用stsToken上传。 */
let stsToken;
// 获取STS临时凭证
if (roleArn) {
  let sts = new STS({
    accessKeyId,
    accessKeySecret,
  });
  const {
    credentials: { AccessKeyId, AccessKeySecret, SecurityToken },
  } = await sts.assumeRole(roleArn, "", seconds, "sessiontest");
stsToken = SecurityToken;

Java

// 获取STS临时凭证
AssumeRoleRequest assumeRoleRequest = new AssumeRoleRequest()
.setDurationSeconds(3600L)
// 将<YOUR_ROLE_SESSION_NAME>设置为自定义的会话名称,例如 my-website-server。
.setRoleSessionName("<YOUR_ROLE_SESSION_NAME>")
// 将<YOUR_ROLE_ARN>替换为拥有上传文件到指定OSS Bucket权限的RAM角色的ARN,可以在 RAM 角色详情中获得角色 ARN
.setRoleArn(roleArn);

AssumeRoleResponse assumeRoleResponse = acsClient.getAcsResponse(assumeRoleRequest);

String accessKeyId = assumeRoleResponse.getCredentials().getAccessKeyId();
String accessKeySecret = assumeRoleResponse.getCredentials().getAccessKeySecret();
String securityToken = assumeRoleResponse.getCredentials().getSecurityToken();

四、服务端构建上传策略

您可以根据您的业务需求在请求中构建请求策略,这些策略可能包括但不限于文件的最大尺寸、文件存储的具体位置以及请求的有效期限等。

Python

# 构建Policy
policy = {
    "expiration": generate_expiration(expire_time),
    "conditions": [
        {"x-oss-security-token": security_token},
        ["eq", "$success_action_status", "200"],
        ["starts-with", "$key", upload_dir],
    ]
}

Node.js

const date = new Date();
date.setSeconds(date.getSeconds() + seconds);
const dir = "user-dirs/";
const policy = {
  expiration: date.toISOString(), // 请求有效期。
  conditions: [
    {"x-oss-security-token": stsToken},
    ["content-length-range", 0, 1048576000], // 设置上传文件的大小限制。
    ["starts-with", "$key", dir] // 限制文件只能上传到user-dirs目录下。  
  ],
};

Java

// 请求有效期。
long expireEndTime = System.currentTimeMillis() + ossConfig.getExpireTime() * 1000;
Date expiration = new Date(expireEndTime);
PolicyConditions policyConds = new PolicyConditions();
// 设置上传文件的大小限制。
policyConds.addConditionItem(PolicyConditions.COND_CONTENT_LENGTH_RANGE, 0, 1048576000);
// 表单域的值必须以指定前缀开始。
policyConds.addConditionItem(MatchMode.StartWith, PolicyConditions.COND_KEY, ossConfig.getDir());
String policy = ossClient.generatePostPolicy(expiration, policyConds);

五、服务端计算签名

在Web端能够发起上传请求之前,服务器需要基于前面定义的策略生成一个数字签名。这个签名用于验证请求的合法性和完整性。您可以通过控制台直接生成签名,也可以参考以下内容在您的代码中实现。

Python

对于Python,需要先自定义生成签名的函数,您可以参照以下方法构建。

def generate_signature(access_key_secret, expiration, conditions, policy_extra_props=None):
    """
    生成签名字符串Signature。
    :param access_key_secret: 有权限访问目标Bucket的AccessKeySecret。
    :param expiration: 签名过期时间,按照ISO8601标准表示,并需要使用UTC时间,格式为yyyy-MM-ddTHH:mm:ssZ。示例值:"2014-12-01T12:00:00.000Z"。
    :param conditions: 策略条件,用于限制上传表单时允许设置的值。
    :param policy_extra_props: 额外的policy参数,后续如果policy新增参数支持,可以在通过dict传入额外的参数。
    :return: signature,签名字符串。
    """
    policy_dict = {
        'expiration': expiration,
        'conditions': conditions
    }
    if policy_extra_props is not None:
        policy_dict.update(policy_extra_props)
    
    policy = json.dumps(policy_dict).strip()
    policy_encode = base64.b64encode(policy.encode())  
    h = hmac.new(access_key_secret.encode(), policy_encode, sha)
    sign_result = base64.b64encode(h.digest()).strip()
    return sign_result.decode()

生成签名:

signature = generate_signature(temp_access_key_secret, policy.get('expiration'), policy.get('conditions'))

Node.js

const formData = await client.calculatePostSignature(policy);

Java

String postPolicy = ossClient.generatePostPolicy(expiration, policyConds);
byte[] binaryData = postPolicy.getBytes("utf-8");
String encodedPolicy = BinaryUtil.toBase64String(binaryData);
String postSignature = ossClient.calculatePostSignature(postPolicy);

六、服务端生成表单数据构建上传请求

服务端将所有必要的信息(包括但不限于签名、STS Token、Policy等)组织成适合HTTP POST请求的数据格式,以便于Web端使用这些数据构建上传请求。

Python

response_data  = {
  'dir': upload_dir,
  'host': host,
  'ossAccessKeyId': temp_access_key_id,
  'stsToken': security_token
  'policy': base64.b64encode(json.dumps(policy).encode('utf-8')).decode(),
  'signature': signature
};

Node.js

const params = {
  policy: formData.policy,
  signature: formData.Signature,
  accessid: formData.OSSAccessKeyId,
  stsToken,
  host: `http://${bucket}.${region}.aliyuncs.com`,
  dir,
};

Java

response.put("dir", ossConfig.getDir());
response.put("host", ossConfig.getHost());
response.put("ossAccessKeyId", accessKeyId);
response.put("stsToken", stsToken);
response.put("policy", encodedPolicy);
response.put("signature", postSignature);

步骤三:配置Web端

Web端构造并提交表单上传请求

当Web端从服务端接收到所有必需的信息后,就可以构建HTML表单请求了。此请求将直接与OSS服务进行通信,从而实现文件的上传。

Web端接收到的响应示例

业务服务器向Web端返回STS Token和上传策略。

{
    "dir": "user-dirs",
    "host": "http://examplebucket.oss-cn-hangzhou.aliyuncs.com",
    "ossAccessKeyId": "STS.NULw****",
    "stsToken":"CAIS****",
    "policy": "eyJl****",
    "signature": "YGTr****"
}

Body中的各字段说明如下:

字段

描述

dir

限制上传的文件前缀。

host

Bucket域名。

ossAccessKeyId

临时访问密钥AccessKey ID。

stsToken

安全令牌。

policy

用户表单上传的策略(Policy),详情请参见Post Policy

signature

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

  • 表单请求中包含文件内容和服务器返回的参数。

  • 通过这个请求,Web端可以直接与阿里云的OSS进行通信,完成文件上传。

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

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

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>服务端生成签名上传文件到OSS</title>
</head>
<body>
<div class="container">
    <form>
        <div class="mb-3">
            <input type="file" class="form-control" id="file" name="file" required />
        </div>
        <button type="submit" class="btn btn-primary">上传</button>
    </form>
</div>
<script type="text/javascript">
const form = document.querySelector("form");
const fileInput = document.querySelector("#file");

form.addEventListener("submit", (event) => {
    event.preventDefault();
    
    const file = fileInput.files[0];
    
    if (!file) {
        alert('请选择一个文件再上传。');
        return;
    }

    const filename = file.name;

    fetch("/get_post_signature_for_oss_upload", { method: "GET" })
        .then((response) => {
            if (!response.ok) {
                throw new Error("获取签名失败");
            }
            return response.json();
        })
        .then((data) => {

            let formData = new FormData();
            formData.append("success_action_status", "200");
            formData.append("policy", data.policy);
            formData.append("signature", data.signature);
            formData.append("OSSAccessKeyId", data.ossAccessKeyId);  // 确保键名一致
            formData.append("x-oss-security-token", data.securityToken);
            formData.append("key", data.dir + file.name); // 文件名
            formData.append("file", file); // file必须为最后一个表单域

            return fetch(data.host, { 
                method: "POST", 
                body: formData
            });
        })
        .then((response) => {

            if (response.ok) {
                console.log("上传成功");
                alert("文件已上传");
            } else {
                console.log("上传失败", response);
                alert("上传失败,请稍后再试");
            }
        })
        .catch((error) => {
            console.error("发生错误:", error);
        });
});
</script>
</body>
</html>
  • HTML表单包含一个文件输入框和一个提交按钮,用户可以选择要上传的文件并提交表单。

  • 当表单提交时,JavaScript代码会阻止默认的表单提交行为,然后通过AJAX请求从服务器获取上传所需的签名信息。

  • 获取到签名信息后,构造一个FormData对象,包含所有必要的表单字段。

  • 通过fetch方法发送POST请求到OSS服务的URL,完成文件上传。

如果上传成功,显示“文件已上传”的提示;如果上传失败,显示相应的错误信息。

示例工程

配置服务端和Web端的完整工程示例请参见:

结果验证

以上步骤部署完成后,您可以访问服务器地址,体验Web端签名直传功能。

  1. 通过浏览器访问服务端地址,然后点击上传按钮选择上传的文件。效果示例如下:

    2024-11-08_14-42-06 (1) copy

  2. Bucket列表页面,选择您之前创建的用来存放用户上传文件的Bucket并打开,您可以在上传列表看到您通过Web端上传的文件。

    image

建议配置

将敏感信息配置为环境变量

建议您把敏感信息(如accessKeyIdaccessKeySecretroleArn)配置到环境变量,从而避免在代码里显式地配置,降低泄露风险。

您可以仅在当前会话中使用该环境变量,可以参照以下步骤添加临时环境变量。

Linux系统

  1. 执行以下命令。

    export OSS_ACCESS_KEY_ID="your-access-key-id"
    export OSS_ACCESS_KEY_SECRET="your-access-key-secret"
    export OSS_STS_ROLE_ARN="your-role-arn"
  2. 执行以下命令,验证该环境变量是否生效。

    echo $OSS_ACCESS_KEY_ID
    echo $OSS_ACCESS_KEY_SECRET
    echo $OSS_STS_ROLE_ARN

macOS系统

  1. 执行以下命令。

    export OSS_ACCESS_KEY_ID="your-access-key-id"
    export OSS_ACCESS_KEY_SECRET="your-access-key-secret"
    export OSS_STS_ROLE_ARN="your-role-arn"
  2. 执行以下命令,验证该环境变量是否生效。

    echo $OSS_ACCESS_KEY_ID
    echo $OSS_ACCESS_KEY_SECRET
    echo $OSS_STS_ROLE_ARN

Windows系统

  1. 在CMD中运行以下命令。

    set OSS_ACCESS_KEY_ID "your-access-key-id"
    set OSS_ACCESS_KEY_SECRET "your-access-key-secret"
    set OSS_STS_ROLE_ARN "your-role-arn"
  2. 打开一个新的CMD窗口。

  3. 在新的CMD窗口运行以下命令,检查环境变量是否生效。

    echo $OSS_ACCESS_KEY_ID
    echo $OSS_ACCESS_KEY_SECRET
    echo $OSS_STS_ROLE_ARN

服务端签名直传并设置上传回调

如果您需要获取更多关于用户上传文件的信息,例如文件名称、图片大小等,请使用上传回调方案。通过设置上传回调,您可以在用户上传文件后,自动接收到相关文件信息。关于如何配置服务端签名直传并设置上传回调,请参见服务器端签名直传并设置上传回调

配置CORS规则时将来源设为服务器地址

在之前的操作步骤中,为了简化流程,将允许的跨域请求来源设置为通配符 *。然而,出于安全考虑,建议您对来源进行更严格的限制。为此,您可以将创建的OSS Bucket的跨域资源共享来源参数设置为您业务服务器的具体地址。这样一来,唯有来自您指定服务器的请求才被授权执行跨域操作,有效增强了系统的安全性。

参数

示例值

来源

http://业务服务器地址

允许Methods

POST、PUT、GET

允许Headers

*

清理资源

在本方案中,您创建了1台ECS实例、1个OSS Bucket、1个RAM用户和1个RAM角色。测试完方案后,您可以参考以下规则处理对应产品的资源,避免继续产生费用或产生安全风险。

释放ECS实例

如果您不再需要这台实例,可以将其释放。释放后,实例停止计费,数据不可恢复。具体操作如下:

  1. 返回云服务器ECS控制台实例列表页面,根据地域、实例ID找到目标ECS实例,单击操作列下的image

  2. 选择释放image

  3. 确认实例无误后,选择立即释放,单击下一步

  4. 确认即将释放的关联资源,并了解相关数据风险后,单击确认,即可完成ECS实例的释放。

说明
  • 系统盘、分配的公网IP将随实例释放。

  • 安全组、交换机和VPC不会随实例释放,但它们均为免费资源,您可根据实际的业务需要选择性删除。

  • 弹性公网IP不会随实例释放,且不是免费资源,您可根据实际的业务需要选择性删除。

删除Bucket

  1. 登录OSS管理控制台

  2. 单击Bucket 列表,然后单击目标Bucket名称。

  3. 删除Bucket的所有文件(Object)。

  4. 在左侧导航栏,单击删除Bucket,然后按照页面指引完成删除操作。

删除RAM用户

  1. 使用RAM管理员登录RAM控制台

  2. 在左侧导航栏,选择身份管理 > 用户

  3. 用户页面,单击目标RAM用户操作列的删除

    您也可以选中多个RAM用户,然后单击用户列表下方的删除用户,批量将多个RAM用户移入回收站。

  4. 删除用户对话框,仔细阅读删除影响,然后输入目标RAM用户名称,最后单击移入回收站

删除RAM角色

  1. 使用RAM管理员登录RAM控制台

  2. 在左侧导航栏,选择身份管理 > 角色

  3. 角色页面,单击目标RAM角色操作列的删除角色

  4. 删除角色对话框,输入RAM角色名称,然后单击删除角色

    说明

    如果RAM角色被授予了权限策略,删除角色时,会同时解除授权。

常见问题

是否可以支持分片上传大文件、断点续传?

此方案是使用HTML表单上传的方式上传文件,不支持基于分片上传大文件、基于分片断点续传的场景。如果您想实现分片上传大文件或断点续传,请参考服务端生成STS临时访问凭证

如何防止上传的文件被覆盖

如果希望防止文件覆盖,可以在上传请求的Header中添加x-oss-forbid-overwrite参数,并将其值设为true。例如:

formData.append('x-oss-forbid-overwrite', 'true');