在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。
登录OSS管理控制台。
单击Bucket 列表,然后单击目标Bucket名称。
在左侧导航栏,选择文件管理 > 文件列表,将鼠标指针悬停在目标Object上,然后单击图标
,对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";
// 填写Bucket所在地域。以华东1(杭州)为例,Region填写为cn-hangzhou。
String region = "cn-hangzhou";
// 创建OSSClient实例。
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
OSS ossClient = OSSClientBuilder.create()
.endpoint(endpoint)
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
.region(region)
.build();
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,
"signatureVersion" => OssClient::OSS_SIGNATURE_VERSION_V4,
"region"=> "cn-hangzhou"
);
$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,
authorizationV4: true,
// 填写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.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
# 填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
# 填写Endpoint对应的Region信息,例如cn-hangzhou。注意,v4签名下,必须填写该参数
region = "cn-hangzhou"
# examplebucket填写存储空间名称。
bucket_name = 'examplebucket'
bucket = oss2.Bucket(auth, endpoint, bucket_name, region=region)
# 填写不包含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());
}
// 填写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;
}];
package main
import (
"context"
"flag"
"log"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)
// 定义全局变量
var (
region string // 存储区域
srcBucketName string // 源存储空间名称
srcObjectName string // 源对象名称
destBucketName string // 目标存储空间名称
destObjectName string // 目标对象名称
)
// init函数用于初始化命令行参数
func init() {
flag.StringVar(®ion, "region", "", "The region in which the bucket is located.")
flag.StringVar(&srcBucketName, "src-bucket", "", "The name of the source bucket.")
flag.StringVar(&srcObjectName, "src-object", "", "The name of the source object.")
flag.StringVar(&destBucketName, "dest-bucket", "", "The name of the destination bucket.")
flag.StringVar(&destObjectName, "dest-object", "", "The name of the destination object.")
}
func main() {
// 解析命令行参数
flag.Parse()
// 检查源bucket名称是否为空
if len(srcBucketName) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, source bucket name required")
}
// 检查region是否为空
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, region required")
}
// 如果目标bucket名称未指定,则使用源bucket名称
if len(destBucketName) == 0 {
destBucketName = srcBucketName
}
// 检查源object名称是否为空
if len(srcObjectName) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, source object name required")
}
// 检查目标object名称是否为空
if len(destObjectName) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, destination object name required")
}
// 加载默认配置并设置凭证提供者和区域
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
// 创建OSS客户端
client := oss.NewClient(cfg)
// 创建复制对象请求
copyRequest := &oss.CopyObjectRequest{
Bucket: oss.Ptr(destBucketName), // 目标存储空间名称
Key: oss.Ptr(destObjectName), // 目标对象名称
SourceKey: oss.Ptr(srcObjectName), // 源对象名称
SourceBucket: oss.Ptr(srcBucketName), // 源存储空间名称
StorageClass: oss.StorageClassStandard, // 设置存储类型为标准类型
}
// 执行复制对象操作并处理结果
copyResult, err := client.CopyObject(context.TODO(), copyRequest)
if err != nil {
log.Fatalf("failed to copy object: %v", err)
}
// 构建删除对象的请求
deleteRequest := &oss.DeleteObjectRequest{
Bucket: oss.Ptr(srcBucketName), // 存储空间名称
Key: oss.Ptr(srcObjectName), // 要删除的对象名称
}
// 执行删除对象的操作
deleteResult, err := client.DeleteObject(context.TODO(), deleteRequest)
if err != nil {
log.Fatalf("failed to delete multiple objects %v", err)
}
// 打印拷贝对象的结果
log.Printf("copy object result:%#v\n", copyResult)
// 打印删除对象的结果
log.Printf("delete objects result:%#v\n", deleteResult)
}
关于其他SDK的重命名Object的代码示例,请参见SDK简介。
使用图形化管理工具ossbrowser
ossbrowser支持Bucket级别的操作与控制台支持的操作类似,请按照ossbrowser界面指引完成重命名文件的操作。关于如何使用ossbrowser,请参见ossbrowser 2.0常用操作。
使用命令行工具ossutil
使用REST API
如果您的程序自定义要求较高,您可以直接发起REST API请求。直接发起REST API请求需要手动编写代码计算签名。更多信息,请参见CopyObject和DeleteObject。
相关文档
如果要在下载文件时重命名文件,建议您通过预签名URL或文件元数据来实现,而不是直接重命名文件。因为通过复制和删除操作来重命名文件,不仅会造成额外的费用,还可能会导致依赖于原始文件名的应用程序出现错误。具体操作,请参见设置OSS文件下载时的文件名。
如何重命名目录(文件夹),请参见重命名目录。
- 本页导读 (1)
- 使用场景
- 注意事项
- 操作步骤
- 使用OSS控制台
- 使用阿里云SDK
- 使用图形化管理工具ossbrowser
- 使用命令行工具ossutil
- 使用REST API
- 相关文档