如果仅需要文件(Object)中的部分数据,您可以使用范围下载,下载指定范围内的数据。

指定正常的下载范围

当您指定的范围首端和末端都在文件的有效区间内,则按指定区间正常下载文件。例如现有大小为1000字节的Object,则指定的有效区间应为0~999。

以下代码用于指定正常的下载范围来下载文件:

// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
const accessKeyId = "yourAccessKeyId";
const accessKeySecret = "yourAccessKeySecret";
// 填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
const endpoint = "yourEndpoint";
// 填写目标Bucket名称。
const bucket = "yourBucketName";

async function main() {
  let start = 1, end = 900;
  // yourObjectName表示不包含Bucket名称在内的Object的完整路径,例如destfolder/examplefile.txt。
  // 获取目标Object的1~900字节范围内的数据,包含1和900,共900字节的数据。
  // 如果指定范围的首端或末端不在有效区间,则下载整个文件的内容,返回HTTP Code为200。
  let result = await client.get("<yourObjectName>", {
    headers: {
      Range: `bytes=${start}-${end}`,
    },
  })
  console.log(result.content.toString())
};

main();

有关Bucket命名规范的详情,请参见存储空间(Bucket)。有关Object命名规范的详情,请参见对象(Object)

兼容行为范围下载

通过在请求中增加请求头x-oss-range-behavior:standard,改变指定范围不在有效区间时OSS的下载行为。

以下代码用于兼容行为范围下载:

// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
const accessKeyId = "yourAccessKeyId";
const accessKeySecret = "yourAccessKeySecret";
// 填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
const endpoint = "yourEndpoint";
// 填写目标Bucket名称。
const bucket = "yourBucketName";

async function main() {
  // 上传大小为10字节的文件exampleobject.txt。
  let buf = Buffer.from("abcdefghij");
  await client.put("exampleobject.txt", buf);
  let result = await client.get("exampleobject.txt", {
  //  指定Range: bytes=5-15,此时范围末端取值不在有效区间,返回6~10字节范围内容,且HTTP Code为206。
    headers: {
      Range: "bytes=5-15",      
      "x-oss-range-behavior": "standard",
    },
  });
  console.log(result.content.toString() === 'fghij')
  console.log(result.res.status === 206)
  try{
    await client.get("exampleobject.txt", {
      // 指定Range: bytes=15-25,此时范围首端取值不在有效区间,返回HTTP Code为416,错误码为InvalidRange。
      headers: {
        Range: "bytes=15-25",        
        "x-oss-range-behavior": "standard",
      },
    })
  }catch(e) {
    console.log(e.status === 416);
    console.log(e.name === 'InvalidRangeError')
  }
}

main();