重命名文件以满足命名规范

OSS数据迁移或重组过程中,您可以通过重命名文件满足新的组织标准,确保命名一致性和结构准确性。

使用场景

  • 命名规范实施:在实施新的文件命名规范以提高数据管理效率和一致性时,需要重命名现有的对象以符合这些规范。

  • 数据迁移和重组:在组织架构调整、系统迁移或应用程序升级时,可能需要移动或重组存储在OSS中的数据,这通常伴随着对象的重命名。

  • 存储布局优化:为了改善数据检索性能和组织结构,有时需要重命名对象以反映更优化的存储布局和虚拟目录结构。

注意事项

  • Object一旦被创建,其内容和名称便不可更改。因此,与传统的文件系统不同,在OSS中不能直接通过修改对象的名称来实现文件的重命名。在同一个Bucket内对Object进行重命名操作,实际上是通过CopyObject接口将源Object拷贝至目标Object,然后通过DeleteObject接口删除源Object来实现的。

  • 如果重命名Object操作涉及的Object类型为低频、归档、冷归档、或者深度冷归档存储类型且存储未满规定时长,则会产生存储不足规定时长容量费用。更多详情,请参见存储费用

  • 对于已开启版本控制Bucket,仅在历史版本设为隐藏后才允许执行重命名操作。将Object重命名后,原有的Object会增加删除标记。

  • 在批量重命名文件时,先列出所有待更改的文件名称,逐个进行复制并验证新文件是否正确生成,确认无误后再删除原文件,以此确保数据的完整性和安全。

  • 为避免影响OSS-HDFS服务的正常使用或者引发数据丢失的风险,在开通了OSS-HDFS服务的Bucket中,禁止重命名OSS-HDFS的数据存储目录.dlsdata/下的任意Object。

操作步骤

使用OSS控制台

OSS控制台不支持重命名1 GB以上的Object。如需重命名1GB以上的Object,请使用SDK、ossutil、REST API。

  1. 登录OSS管理控制台

  2. 单击Bucket 列表,然后单击目标Bucket名称。

  3. 在左侧导航栏,选择文件管理 > 文件列表,将鼠标指针悬停在目标Object上,然后单击图标edit,对Object进行重命名。重命名时,Object名称需包含后缀。

使用阿里云SDK

例如,将examplebucket中的srcobject.txt重命名为destobject.txt。配置示例如下:

import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;

public class Demo {

    public static void main(String[] args) throws Exception {
        // Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // 填写Bucket名称。
        String bucketName = "examplebucket";
        // 填写源Object的完整路径,完整路径中不能包含Bucket名称。
        String sourceKey = "srcobject.txt";
        // 填写目标Object的完整路径。Object完整路径中不能包含Bucket名称。
        String destinationKey = "destobject.txt";

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);

        try {
            // 将examplebucket下的srcobject.txt拷贝至同一Bucket下的destobject.txt。
            ossClient.copyObject(bucketName, sourceKey, bucketName, destinationKey);

            // 删除srcobject.txt。
            ossClient.deleteObject(bucketName, sourceKey);
        } catch (OSSException oe) {
            System.out.println("Caught an OSSException, which means your request made it to OSS, "
                    + "but was rejected with an error response for some reason.");
            System.out.println("Error Message:" + oe.getErrorMessage());
            System.out.println("Error Code:" + oe.getErrorCode());
            System.out.println("Request ID:" + oe.getRequestId());
            System.out.println("Host ID:" + oe.getHostId());
        } catch (ClientException ce) {
            System.out.println("Caught an ClientException, which means the client encountered "
                    + "a serious internal problem while trying to communicate with OSS, "
                    + "such as not being able to access the network.");
            System.out.println("Error Message:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}
<?php
if (is_file(__DIR__ . '/../autoload.php')) {
    require_once __DIR__ . '/../autoload.php';
}
if (is_file(__DIR__ . '/../vendor/autoload.php')) {
    require_once __DIR__ . '/../vendor/autoload.php';
}

use OSS\Credentials\EnvironmentVariableCredentialsProvider;
use OSS\OssClient;
use OSS\CoreOssException;

// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
$provider = new EnvironmentVariableCredentialsProvider();
// Endpoint以杭州为例,其它Region请按实际情况填写。
$endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 填写Bucket名称,例如examplebucket。
$bucket= "examplebucket";
// 填写不包含Bucket名称在内源Object的完整路径,例如srcobject.txt。
$fromObject = "srcobject.txt";
// 填写不包含Bucket名称在内目标Object的完整路径,例如destobject.txt。
$toObject = 'destobject.txt';

try {
    $config = array(
        "provider" => $provider,
        "endpoint" => $endpoint,
    );
    $ossClient = new OssClient($config);
    // 将srcobject.txt拷贝至同一Bucket下的destobject.txt。
    $ossClient->copyObject($bucket, $fromObject,$bucket, $toObject);
    // 删除srcobject.txt。
    $ossClient->deleteObject($bucket, $fromObject);
} catch (OssException $e) {
    printf($e->getMessage() . "\n");
    return;
}
print("Object ".$fromObject ." Rename complete" . PHP_EOL);
const OSS = require('ali-oss');
const client = new OSS({
  // yourregion填写Bucket所在地域。以华东1(杭州)为例,Region填写为oss-cn-hangzhou。
  region: 'oss-cn-hangzhou',
  // 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
  accessKeyId: process.env.OSS_ACCESS_KEY_ID,
  accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
  // 填写Bucket名称。
  bucket: 'examplebucket',
})

async function renameObject() {
  try {
    // 将srcobject.txt拷贝至同一Bucket下的destobject.txt。
    const r = await client.copy('destobject.txt', 'srcobject.txt');
    console.log('拷贝成功', r);
    // 删除srcobject.txt。
    const deleteResult = await client.delete('srcobject.txt');
    console.log(deleteResult);
  } catch (e) {
    console.log(e);
  }
}

renameObject();
# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider

# 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
endpoint = 'https://oss-cn-hangzhou.aliyuncs.com'
# 填写Bucket名称,例如examplebucket。
bucket_name = 'examplebucket'
bucket = oss2.Bucket(auth, endpoint, bucket_name)

# 填写不包含Bucket名称在内源Object的完整路径,例如srcobject.txt。
src_object_name = 'srcobject.txt'
# 填写不包含Bucket名称在内目标Object的完整路径,例如destobject.txt。
dest_object_name = 'destobject.txt'

# 将examplebucket下的srcobject.txt拷贝至同一Bucket下的destobject.txt。
result = bucket.copy_object(bucket_name, src_object_name, dest_object_name)

# 查看返回结果的状态。如果返回值为200,表示执行成功。
print('result.status:', result.status)

# 删除srcobject.txt。
result_del = bucket.delete_object(src_object_name)

# 查看返回结果的状态。如果返回值为204,表示执行成功。
print('result.status:', result_del.status)
// 填写Bucket名称。
String bucketName = "examplebucket";
// 填写不包含Bucket名称在内源Object的完整路径,例如srcobject.txt。
String sourceObjectKey = "srcobject.txt";
// 填写不包含Bucket名称在内目标Object的完整路径,例如destobject.txt。
String objectKey = "destobject.txt";
try {
    CopyObjectRequest copyObjectRequest = new CopyObjectRequest(bucketName, sourceObjectKey, bucketName, objectKey);
    oss.copyObject(copyObjectRequest);
    // 删除srcobject.txt。
    DeleteObjectRequest deleteObjectRequest = new DeleteObjectRequest(bucketName, sourceObjectKey);
    oss.deleteObject(deleteObjectRequest);
} catch (ClientException e) {
    // 客户端异常,例如网络异常等。
    e.printStackTrace();
} catch (ServiceException e) {
    // 服务端异常。
    Log.e("RequestId", e.getRequestId());
    Log.e("ErrorCode", e.getErrorCode());
    Log.e("HostId", e.getHostId());
    Log.e("RawMessage", e.getRawMessage());
}
package main

import (
    "fmt"
    "github.com/aliyun/aliyun-oss-go-sdk/oss"
    "os"
)
func handleError(err error) {
    fmt.Println("Error:", err)
    os.Exit(-1)
}
func main()  {
    /// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
    provider, err := oss.NewEnvironmentVariableCredentialsProvider()
    if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }

    // 创建OSSClient实例。
    // yourEndpoint填写Bucket对应的Endpoint,以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
    client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider))
    if err != nil {
        handleError(err)
    }
    // 填写Bucket名称。
    bucket, err := client.Bucket("examplebucket")
    if err != nil {
        handleError(err)
    }
    // 填写源Object的完整路径,完整路径中不能包含Bucket名称。
    srcObject := "srcobject.txt"
    // 填写目标Object的完整路径,完整路径中不能包含Bucket名称。
    destObject := "destobject.txt"
    // 将examplebucket下的srcobject.txt拷贝至同一Bucket下的destobject.txt。
    _,err = bucket.CopyObject(srcObject,destObject)
    if err != nil {
        handleError(err)
    }
    // 删除srcobject.txt。
    err = bucket.DeleteObject(srcObject)
    if err != nil {
        handleError(err)
    }

    fmt.Print(srcObject+" has renamed "+destObject)
}
// 填写Bucket名称。
NSString *bucketName = @"examplebucket";
// 填写不包含Bucket名称在内源Object的完整路径,例如srcobject.txt。
NSString *sourceObjectKey = @"sourceObjectKey";
// 填写不包含Bucket名称在内目标Object的完整路径,例如destobject.txt。
NSString *objectKey = @"destobject.txt";
[[[OSSTask taskWithResult:nil] continueWithBlock:^id _Nullable(OSSTask * _Nonnull task) {
    // 将srcobject.txt拷贝至同一Bucket下的destobject.txt。
    OSSCopyObjectRequest *copyRequest = [OSSCopyObjectRequest new];
    copyRequest.bucketName = bucketName;
    copyRequest.sourceBucketName = bucketName;
    copyRequest.sourceObjectKey = sourceObjectKey;
    copyRequest.objectKey = objectKey;
    OSSTask *copyTask = [client copyObject:copyRequest];
    [copyTask waitUntilFinished];
    if (copyTask.error) {
        return copyTask;
    }
    // 删除srcobject.txt。
    OSSDeleteObjectRequest *deleteObject = [OSSDeleteObjectRequest new];
    deleteObject.bucketName = bucketName;
    deleteObject.objectKey = sourceObjectKey;
    OSSTask *deleteTask = [client deleteObject:deleteObject];
    [deleteTask waitUntilFinished];
    if (deleteTask.error) {
        return deleteTask;
    }
    return nil;
}] continueWithBlock:^id _Nullable(OSSTask * _Nonnull task) {
    if (task.error) {
        NSLog(@"rename fail! error: %@", task.error);
    } else {
        NSLog(@"rename success!");
    }
    return nil;
}];

关于其他SDK的重命名Object的代码示例,请参见SDK简介

使用图形化管理工具ossbrowser

ossbrowser支持Bucket级别的操作与控制台支持的操作类似,请按照ossbrowser界面指引完成重命名文件的操作。关于如何使用ossbrowser,请参见快速使用ossbrowser

使用命令行工具ossutil

例如,将examplebucket中的srcobject.txt重命名为destobject.txt。配置示例如下:

ossutil cp oss://examplebucket/srcobject.txt oss://examplebucket/destobject.txt
ossutil rm oss://examplebucket/srcobject.txt

关于使用ossutil重命名Object的具体步骤,请参见cp(拷贝文件)rm(删除)

使用REST API

如果您的程序自定义要求较高,您可以直接发起REST API请求。直接发起REST API请求需要手动编写代码计算签名。更多信息,请参见CopyObjectDeleteObject

相关文档

  • 如果要在下载文件时重命名文件,建议您通过预签名URL或文件元数据来实现,而不是直接重命名文件。因为通过复制和删除操作来重命名文件,不仅会造成额外的费用,还可能会导致依赖于原始文件名的应用程序出现错误。具体操作,请参见设置OSS文件下载时的文件名

  • 如何重命名目录(文件夹),请参见重命名目录