全部产品
Search
文档中心

对象存储 OSS:重命名文件以满足命名规范

更新时间:Feb 26, 2024

在OSS数据迁移或重组过程中,您可以通过重命名文件满足新的组织标准,确保命名一致性和结构准确性。存储空间(Bucket)开启分层命名空间后,允许在同一个Bucket内直接对文件(Object)进行重命名操作。

使用场景

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

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

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

注意事项

  • 在Bucket开启分层命名空间的情况下,OSS支持直接调用Rename接口对Object进行重命名。

    关于分层命名空间的更多信息,请参见使用分层命名空间

  • 在Bucket未开启分层命名空间的情况下,OSS不支持直接对Object进行重命名。如果您需要在同一个Bucket内对Object进行重命名,您可以通过CopyObject接口将源Object拷贝至目标Object,然后通过DeleteObject接口删除源Object。

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

操作步骤

使用OSS控制台

OSS控制台对重命名的Object大小无限制,移动的Object大小不能超过1 GB。

  1. 登录OSS管理控制台

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

  3. 重命名Object。

    • Bucket未开启分层命名空间

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

    • Bucket已开启分层命名空间

      在左侧导航栏,选择文件管理 > 文件列表,然后对Object执行重命名或移动操作。

      场景

      操作

      重命名Object

      将鼠标指针悬停在目标Object上,然后单击图标edit,对Object进行重命名。重命名时,Object名称需包含后缀。

      移动Object

      选择目标Object右侧操作列表下的更多 > 移动文件。在移动文件页面,根据如下场景填写符合要求的目标目录。

      • 如果您希望将Object移动至当前Bucket的根目录下,请将目标目录置空。

      • 如果您希望将Object移动至当前Bucket的指定目录下,例如移动至父目录destdir下的子目录subdir,则目标目录填写为destdir/subdir

使用阿里云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;
import com.aliyun.oss.model.RenameObjectRequest;

public class Demo {

    public static void main(String[] args) throws Exception {
        // Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // 强烈建议不要把访问凭证保存到工程代码里,否则可能导致访问凭证泄露,威胁您账号下所有资源的安全。本代码示例以从环境变量中获取访问凭证为例。运行本代码示例之前,请先配置环境变量。
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // 填写Bucket名称。
        String bucketName = "examplebucket";
        // 填写源Object的完整路径,完整路径中不能包含Bucket名称。
        String sourceObject = "srcobject.txt";
        // 填写目标Object的完整路径。Object完整路径中不能包含Bucket名称。
        String destinationObject = "destobject.txt";

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

        try {
            // 如果Bucket已开启分层命名空间,请使用以下代码进行Object重命名操作。
            // 将存储空间中的源Object绝对路径重命名为目标Object绝对路径。
            RenameObjectRequest renameObjectRequest = new RenameObjectRequest(bucketName, sourceObject, destinationObject);
            ossClient.renameObject(renameObjectRequest);

            // 如果Bucket未开启分层命名空间,请使用以下代码进行Object重命名操作。
            // 将examplebucket下的srcobject.txt拷贝至同一Bucket下的destobject.txt。
            // ossClient.copyObject(bucketName, sourceObject, bucketName, destinationObject);

            // 删除srcobject.txt。
            // ossClient.deleteObject(bucketName, sourceObject);
        } 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简介

使用REST API

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

相关文档

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

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