默认情况下,如果已经存在同名文件(Object)且对该文件有访问权限,则新添加的文件将覆盖原有的文件。本文介绍如何通过设置请求头x-oss-forbid-overwrite在简单上传、拷贝文件及分片上传等场景中禁止覆盖同名文件。

简单上传

以下代码用于简单上传时禁止覆盖同名文件:

const OSS = require("ali-oss")

const client = new OSS({
  region: '<Your region>',
  accessKeyId: '<Your AccessKeyId>',
  accessKeySecret: '<Your AccessKeySecret>',
  bucket: '<Your bucket name>',
});

async function put () {
  try {
    //object-name可以自定义为文件名(例如file.txt)或目录(例如abc/test/file.txt)的形式,实现将文件上传至当前Bucket或Bucket下的指定目录。
    //指定Put操作时是否覆盖同名Object。
    //不指定x-oss-forbid-overwrite时,默认覆盖同名Object。
    //指定x-oss-forbid-overwrite为false时,表示允许覆盖同名Object。
    //指定x-oss-forbid-overwrite为true时,表示禁止覆盖同名Object,如果同名Object已存在程序将报错。
    let result = await client.put('object-name', 'local-file',{headers: { 'x-oss-forbid-overwrite': true }});
    console.log(result);
  } catch (e) {
    console.log(e);
  }
}

put();

简单上传的更多详情,请参见PutObject

拷贝文件

  • 拷贝小文件
    const OSS = require("ali-oss")
    
    const client = new OSS({
      region: '<Your region>',
      accessKeyId: '<Your AccessKeyId>',
      accessKeySecret: '<Your AccessKeySecret>',
      bucket: '<Your bucket name>',
    });
    
    //拷贝同一个Bucket内的文件。
    //指定Copy操作时是否覆盖同名Object。
    //不指定x-oss-forbid-overwrite时,默认覆盖同名Object。
    //指定x-oss-forbid-overwrite为false时,表示允许覆盖同名Object。
    //指定x-oss-forbid-overwrite为true时,表示禁止覆盖同名Object,如果同名Object已存在程序将报错。
    client
      .copy("test_copy", "test", { headers: { "x-oss-forbid-overwrite": true } })
      .then(res => {
        console.log(res);
      })
      .catch(e => {
        console.log(e);
      });
  • 拷贝大文件

    以下代码用于拷贝大文件(分片拷贝)时禁止覆盖同名文件:

    const client = new OSS({
      region: '<Your region>',
      accessKeyId: '<Your AccessKeyId>',
      accessKeySecret: '<Your AccessKeySecret>',
      bucket: '<Your bucket name>',
    });
    
    async function put() {
      try {
        let result = await client.multipartUploadCopy(
          copyName,
          {
            sourceKey: objectkey, // 拷贝源文件名。
            sourceBucketName: bucket // 拷贝源bucket。
          },
          {
           //指定multipartUploadCopy操作时是否覆盖同名Object。
           //不指定x-oss-forbid-overwrite时,默认覆盖同名Object。
           //指定x-oss-forbid-overwrite为false时,表示允许覆盖同名Object。
           //指定x-oss-forbid-overwrite为true时,表示禁止覆盖同名Object,如果同名Object已存在程序将报错。
            headers: { "x-oss-forbid-overwrite": true }
          }
        );
        console.log(result);
      } catch (e) {
        console.log(e);
      }
    }

拷贝文件的更多详情,请参见CopyObject

分片上传

以下代码用于分片上传时禁止覆盖同名文件:

const OSS = require("ali-oss")

const client = new OSS({
  region: '<Your region>',
  accessKeyId: '<Your AccessKeyId>',
  accessKeySecret: '<Your AccessKeySecret>',
  bucket: '<Your bucket name>',
});

//指定multipartUpload操作时是否覆盖同名Object。
//不指定x-oss-forbid-overwrite时,默认覆盖同名Object。
//指定x-oss-forbid-overwrite为false时,表示允许覆盖同名Object。
//指定x-oss-forbid-overwrite为true时,表示禁止覆盖同名Object,如果同名Object已存在程序将报错。
 client
  .multipartUpload('object-name', 'local-file', { headers: { "x-oss-forbid-overwrite": true } })
  .then(res => {
    console.log(res);
  })
  .catch(e => {
    console.log(e);
  });

分片上传的更多详情,请参见InitiateMultipartUpload以及CompleteMultipartUpload