Node.js范围下载

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

指定正常的下载范围

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

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

const OSS = require('ali-oss');

const client = new OSS({
  // yourregion填写Bucket所在地域。以华东1(杭州)为例,Region填写为oss-cn-hangzhou。
  region: 'yourRegion',
  // 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
  accessKeyId: process.env.OSS_ACCESS_KEY_ID,
  accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
  // 填写Bucket名称。
  bucket: 'examplebucket'
});

async function main() {
  const start = 1, end = 900;
  // yourObjectName表示不包含Bucket名称在内的Object的完整路径,例如destfolder/examplefile.txt。
  // 获取目标Object的1~900字节范围内的数据,包含1和900,共900字节的数据。
  // 如果指定范围的首端或末端不在有效区间,则下载整个文件的内容,返回HTTP Code为200。
  const 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的下载行为。

以下代码用于标准行为范围下载:

const OSS = require('ali-oss');

const client = new OSS({
  // yourregion填写Bucket所在地域。以华东1(杭州)为例,Region填写为oss-cn-hangzhou。
  region: 'yourRegion',
  // 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
  accessKeyId: process.env.OSS_ACCESS_KEY_ID,
  accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
  // 填写Bucket名称。
  bucket: 'examplebucket'
});

async function main() {
  // 上传大小为10字节的文件exampleobject.txt。
  const buf = Buffer.from("abcdefghij");
  await client.put("exampleobject.txt", buf);
  const 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();

相关文档

关于范围下载的API接口说明,请参见GetObject