Node.js禁止覆盖同名文件

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

简单上传

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

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,
  authorizationV4: true,
  // 填写Bucket名称。
  bucket: 'examplebucket'
});

// yourLocalFile填写本地文件完整路径。
const file = "yourLocalFile";
// 指定上传文件操作时是否覆盖同名Object。此处设置为true,表示禁止覆盖同名Object。如果同名Object已存在,程序将报错。
const headers = {
  "x-oss-forbid-overwrite": true,
};
async function put() {
  try {
    // yourObjectName填写Object的完整路径。
    const result = await client.put("yourObjectName", file, { headers });
    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',
  // 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
  accessKeyId: process.env.OSS_ACCESS_KEY_ID,
  accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
  authorizationV4: true,
  // 填写Bucket名称。
  bucket: 'examplebucket'
});

// 指定上传文件操作时是否覆盖同名Object。此处设置为true,表示禁止覆盖同名Object。如果同名Object已存在,程序将报错。
const headers = {
  "x-oss-forbid-overwrite": true,
};
// yourTargetObject填写拷贝后目标Object完整路径。
// yourSourceObject填写待拷贝的源Object完整路径。
client  
  .copy("yourTargetObject", "yourSourceObject", { headers })
  .then((res) => {
    console.log(res.res.data.toString("utf8"));
    console.log(res);
  })
  .catch((e) => {
    console.log(e);
  });

拷贝大文件

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

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,
  authorizationV4: true,
  // yourTargetBucket填写拷贝后的目标Object所在的存储空间名称。
  bucket: "yourTargetBucket"
});

async function put() {
  try {
    const result = await client.multipartUploadCopy(
      // 填写拷贝后的目标Object完整路径。
      "yourTargetObject",
      {
        // 填写待拷贝的源Object完整路径。
        sourceKey: "yourSourceObject",
        // 填写待拷贝的源Object所在的存储空间名称。
        sourceBucketName: "yourSourceBucket",
      },
      {
        // 指定拷贝文件操作时是否覆盖同名Object。此处设置为true,表示禁止覆盖同名Object。如果同名Object已存在,程序将报错。
        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",
  // 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
  accessKeyId: process.env.OSS_ACCESS_KEY_ID,
  accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
  authorizationV4: true,
  // yourbucketname填写存储空间名称。
  bucket: "yourBucketName",
});

// yourLocalFile填写本地文件完整路径。
const file = "yourLocalFile";
// 指定上传文件操作时是否覆盖同名Object。此处设置为true,表示禁止覆盖同名Object。如果同名Object已存在,程序将报错。
const headers = {
  "x-oss-forbid-overwrite": true,
};
{
  // 分片上传。yourObjectName填写Object的完整路径。
  client    
    .multipartUpload("yourObjectName", file, { headers })
    .then((res) => {
      console.log(res);
    })
    .catch((e) => {
      console.log(e);
    });
}

相关文档