请求者付费模式是指由请求者支付读取存储空间(Bucket)内数据时产生的流量费用和请求费用,而Bucket拥有者仅支付存储费用。当您希望共享数据,但又不希望产生流量费用和请求费用时,您可以开启此功能。

请求方式说明

  • 不允许匿名访问

    如果您的Bucket启用了请求者付费模式,则不允许匿名访问该Bucket。请求方必须提供身份验证信息,以便OSS能够识别请求方,从而对请求方而非Bucket拥有者收取请求所产生的费用。

    当请求者是通过扮演阿里云RAM角色来请求数据时,该角色所属的账户将为此请求付费。

  • 申请方需携带x-oss-request-payer信息

    如果您的Bucket启用了请求者付费模式,请求方必须在PUT、POST、GET和HEAD等请求的Header信息中包含x-oss-request-payer:requester,以表明请求方知道请求和数据下载将产生费用。否则,请求方无法通过验证。

    数据拥有者访问该Bucket时,可以不携带x-oss-request-payer请求头。数据拥有者作为请求者访问该Bucket时,请求产生的费用由数据拥有者(也是请求者)来支付。

有关请求者付费模式的详情,请参见开发指南的请求者付费模式

设置请求者付费模式

以下代码用于设置请求者付费模式:

const OSS = require('ali-oss')

const client = new OSS({
  region: '<Your region>',
  // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
  accessKeyId: '<Your AccessKeyId>',
  accessKeySecret: '<Your AccessKeySecret>',
});

async function setBucketRequestPayment(bucket, Payer) {
  try {
    // bucket填写需要设置请求者付费模式的bucket名称。
    // Payer取值为Requester或BucketOwner。
    // Payer设置为Requester,表明该存储空间已开启请求者付费模式,由请求者支付读取存储空间(Bucket)内数据时产生的流量费用和请求费用。
    // Payer设置为BucketOwner,表明该存储空间不开启请求者付费模式(默认状态),即请求产生的费用由数据拥有者(BucketOwner)来支付。
    let result = await client.putBucketRequestPayment(bucket, Payer);
    console.log(result);
  } catch (e) {
    console.log(e);
  }
}

setBucketRequestPayment('bucketName', 'Requester')

设置存储空间请求者付费模式更多详情,请参见PutBucketRequestPayment

获取请求者付费模式配置

以下代码用于获取请求者付费模式配置:

const OSS = require('ali-oss')

const client = new OSS({
  region: '<Your region>',
  // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
  accessKeyId: '<Your AccessKeyId>',
  accessKeySecret: '<Your AccessKeySecret>',
});

async function getBucketRequestPayment(bucket) {
  try {
    // 获取存储空间请求者付费模式配置信息。
    let result = await client.getBucketRequestPayment(bucket);
    console.log(result.payer);
  } catch (e) {
    console.log(e);
  }
}

getBucketRequestPayment('bucketName')

获取存储空间请求者付费模式配置信息的更多详情,请参见GetBucketRequestPayment

第三方付费访问Object

第三方操作Object时需在http header中携带x-oss-request-payer:requester参数,否则会报错。

以下代码以PutObject、GetObject和DeleteObject为例,用于指定第三方付费访问Object。其他用于指定第三方付费的Object读写操作接口设置方法类似。

以下代码用于设置第三方付费访问Object:

const OSS = require('ali-oss')
const bucket = 'bucket-name'
const payer = 'Requester'

const client = new OSS({
  region: '<Your region>',
  // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录https://ram.console.aliyun.com 创建RAM账号。
  accessKeyId: '<Your AccessKeyId>',
  accessKeySecret: '<Your AccessKeySecret>',
  bucket: bucket
});


async function put() {
  await client.putBucketRequestPayment(bucket, payer)

  // putObject接口指定付费者。
  await client.put('fileName', 'fileContent', {
    headers: {
      'x-oss-request-payer': 'requester'
    }
  })
}

async function get() {
  await client.putBucketRequestPayment(bucket, payer)

  // getObject接口指定付费者。
  await client.get('fileName', {
    headers: {
      'x-oss-request-payer': 'requester'
    }
  })
}

async function del() {
  await client.putBucketRequestPayment(bucket, payer)

  // deleteObject接口指定付费者。
  await client.delete('fileName', {
    headers: {
      'x-oss-request-payer': 'requester'
    }
  })
}