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

简单上传

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

const OSS = require("ali-oss")

const client = new OSS({
  // yourregion填写Bucket所在地域。以华东1(杭州)为例,Region填写为oss-cn-hangzhou。
  region: 'yourregion',
  // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
  accessKeyId: 'yourAccessKeyId',
  accessKeySecret: 'yourAccessKeySecret',
  // yourbucketname填写存储空间名称。
  bucket: 'yourbucketname'
});

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已存在,程序将报错。
    const result = await client.put('object-name', 'local-file',{headers: { 'x-oss-forbid-overwrite': true }});
    console.log(result);
  } catch (e) {
    console.log(e);
  }
}

put();

拷贝文件

  • 拷贝小文件

    以下代码用于拷贝小文件时禁止覆盖同名文件:

    const OSS = require("ali-oss")
    
    const client = new OSS({
      // yourregion填写Bucket所在地域。以华东1(杭州)为例,Region填写为oss-cn-hangzhou。
      region: 'yourregion',
      // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
      accessKeyId: 'yourAccessKeyId',
      accessKeySecret: 'yourAccessKeySecret',
      // yourbucketname填写存储空间名称。
      bucket: 'yourbucketname'
    });
    
    // 拷贝同一个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({
      // yourregion填写Bucket所在地域。以华东1(杭州)为例,Region填写为oss-cn-hangzhou。
      region: 'yourregion',
      // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
      accessKeyId: 'yourAccessKeyId',
      accessKeySecret: 'yourAccessKeySecret',
      // yourbucketname填写存储空间名称。
      bucket: 'yourbucketname'
    });
    
    async function put() {
      try {
        const 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);
      }
    }

分片上传

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

const OSS = require("ali-oss")

const client = new OSS({
  // yourregion填写Bucket所在地域。以华东1(杭州)为例,Region填写为oss-cn-hangzhou。
  region: 'yourregion',
  // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
  accessKeyId: 'yourAccessKeyId',
  accessKeySecret: 'yourAccessKeySecret',
  // yourbucketname填写存储空间名称。
  bucket: 'yourbucketname'
});

// 指定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);
  });

相关文档