You need to enable JavaScript to run this app.
文档中心
对象存储

对象存储

复制全文
下载 pdf
上传对象
上传回调(Node.js SDK)
复制全文
下载 pdf
上传回调(Node.js SDK)

上传回调是指客户端在请求时携带回调(Callback)参数,服务端在上传完成后,发送同步的 POST 回调请求到 CallBack 中指定的第三方应用服务器,在服务器确认接受并返回结果后,才将所有结果返回给客户端。
关于上传回调的详细介绍,请参见上传回调

示例代码

普通上传实现上传回调

// 导入 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);
  }
}

const bucketName = 'node-sdk-test-bucket';
async function main() {
  try {
    const callbackUrl = '*** Provide your callback url ***';
    const objectKey = '*** Provide your object key ***';

    // 设置上传回调参数
    // 可以根据需求设置 callback 参数
    const callback = `
    {
      "callbackUrl" : "${callbackUrl}", 
      "callbackBody" : ${'"{\\"bucket\\": ${bucket}, \\"object\\": ${object}, \\"key1\\": ${x:key1}}"'}, 
      "callbackBodyType" : "application/json"                
    }`;  // callback 的值需要进行 base64 编码
    // 配置相关变量参数
    const callbackVar = `
    {
      "x:key1" : "ceshi"
    }`;// callbackVar 的值需要进行 base64 编码
    const { requestId: putObjectRequestId } = await client.putObject({
      bucket: bucketName,
      key: objectKey,
      body: Buffer.from('object content'),
      callback: Buffer.from(callback).toString('base64'),
      callbackVar: Buffer.from(callbackVar).toString('base64'),
    });
    console.log('putObject Request ID: ', putObjectRequestId);
  } catch (error) {
    handleError(error);
  }
}

main();

分片上传实现上传回调

// 导入 SDK, 当 TOS Node.JS SDK 版本小于 2.5.2 请把下方 TosClient 改成 TOS 导入
import { TosClient, TosClientError, TosServerError } from '@volcengine/tos-sdk';
import fsp from 'fs/promises';

// 创建客户端
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() {
  try {
    const bucketName = 'node-sdk-test-bucket';
    // 本地 example_dir 文件夹下的 multipartExample 文件
    const filePath = './example_dir/multipartExample';
    const callbackUrl = '*** Provide your callback url ***';
    const objectKey = '*** Provide your object key ***';

    // 设置上传回调参数
    // 可以根据需求设置 callback 参数
    const callback = `
    {
      "callbackUrl" : "${callbackUrl}", 
      "callbackBody" : ${'"{\\"bucket\\": ${bucket}, \\"object\\": ${object}, \\"key1\\": ${x:key1}}"'}, 
      "callbackBodyType" : "application/json"                
    }`; // callback 的值需要进行 base64 编码
    // 配置相关变量参数
    const callbackVar = `
    {
      "x:key1" : "ceshi"
    }`; // callbackVar 的值需要进行 base64 编码
    // 获取上传任务 ID
    const {
      data: { UploadId },
    } = await client.createMultipartUpload({
      bucket: bucketName,
      key: objectKey,
    });
    console.log('UploadId', UploadId);

    // 获取本地文件信息并准备进行分片
    const stats = await fsp.stat(filePath);
    // 文件总大小
    const totalSize = stats.size;

    let offset = 0;
    let partNumber = 1;
    const partsInfo = [];
    // 上传时指定分片大小
    const partSize = 5 * 1024 * 1024;

    while (offset < totalSize) {
      const uploadResult = await client.uploadPartFromFile({
        bucket: bucketName,
        key: objectKey,
        filePath,
        partNumber,
        uploadId: UploadId,
        offset,
        partSize,
      });
      const eTag = uploadResult.data.ETag;
      console.log(`partNumber${partNumber} Etag:`, eTag);
      partsInfo.push({
        partNumber,
        eTag,
      });
      partNumber++;
      offset += partSize;
    }

    console.log('parts information', partsInfo);

    // 完成分片上传
    const { data, requestId: completeMultipartUploadRequestId } = await client.completeMultipartUpload({
      bucket: bucketName,
      key: objectKey,
      uploadId: UploadId,
      parts: partsInfo,
      callback: Buffer.from(callback).toString('base64'),
      callbackVar: Buffer.from(callbackVar).toString('base64'),
    });

    console.log('completeMultipartUpload Request ID: ', completeMultipartUploadRequestId);
    console.log('result data:', data);
  } catch (error) {
    handleError(error);
  }
}

main();

最近更新时间:2024.09.02 19:01:49
这个页面对您有帮助吗?
有用
有用
无用
无用