若您想在下载对象时,设置下载对象的限制条件(对象 ETag 或对象修改时间),您可使用 TOS Node.js SDK 提供的限定条件下载功能,当对象信息满足您指定条件时才下载对象。本文介绍如何通过限定条件下载对象。
tos:GetObject
权限,具体操作,请参见权限配置指南。tos:GetObjectVersion
权限,具体操作,请见权限配置指南。参数 | 描述 |
---|---|
If-Match | 只有当传入的 |
If-None-Match | 只有当传入的 |
If-Modified-Since | 只有在对象自指定时间以来被修改过时才返回该对象,否则返回 |
If-Unmodified-Since | 只有在对象自指定时间以来未被修改过时才返回该对象,否则返回 |
// 导入 SDK, 当 TOS Node.JS SDK 版本小于 2.5.2 请把下方 TosClient 改成 TOS 导入
import { TosClient, TosClientError, TosServerError } from '@volcengine/tos-sdk';
// 创建客户端
const client = new TosClient({
accessKeyId: process.env['TOS_ACCESS_KEY'],
accessKeySecret: process.env['TOS_SECRET_KEY'],
region: "Provide your region", // 填写 Bucket 所在地域。以华北2(北京)为例,则 "Provide your region" 填写为 cn-beijing。
endpoint: "Provide your endpoint", // 填写域名地址
});
function handleError(error) {
if (error instanceof TosClientError) {
console.log('Client Err Msg:', error.message);
console.log('Client Err Stack:', error.stack);
} else if (error instanceof TosServerError) {
console.log('Request ID:', error.requestId);
console.log('Response Status Code:', error.statusCode);
console.log('Response Header:', error.headers);
console.log('Response Err Code:', error.code);
console.log('Response Err Msg:', error.message);
} else {
console.log('unexpected exception, message: ', error);
}
}
async function main() {
const bucketName = 'node-sdk-test-bucket'; // 目标桶
const objectName = 'example_dir/example.txt'; // 目标对象
// 指定日期作为下载条件
const date = new Date('2024-02-22 18:33:00');
try {
// 获取对象
const res = await client.getObjectV2({
bucket: bucketName,
key: objectName,
ifModifiedSince: date,
});
// 满足限定条件时,读取对象
let allContent = Buffer.from([]);
for await (const chunk of res.data.content) {
allContent = Buffer.concat([allContent, chunk]);
}
console.log('object size:', allContent.length);
// 如果对象是一串文字,可以toString解析
console.log('data string:', allContent.toString());
} catch (error) {
if (error instanceof TosServerError) {
// IfModifiedSince 不满足时,返回 304
if (error.statusCode === 304) {
console.log('Object not modify, Request ID:', error.requestId);
} else {
handleError(error);
}
}
}
try {
// 获取对象
const {
data: { content },
} = await client.getObjectV2({
bucket: bucketName,
key: objectName,
ifUnmodifiedSince: date,
});
// 满足限定条件时,读取对象
let allContent = Buffer.from([]);
for await (const chunk of content) {
allContent = Buffer.concat([allContent, chunk]);
}
console.log('object size:', allContent.length);
// 如果对象是一串文字,可以toString解析
console.log('data string:', allContent.toString());
} catch (error) {
if (error instanceof TosServerError) {
// IfUnmodifiedSince 不满足时,返回 412
if (error.statusCode === 412) {
console.log('Object modify, Request ID:', error.requestId);
} else {
handleError(error);
}
}
}
}
main();
关于下载对象的 API 文档,请参见 GetObject。