存储空间(Bucket)开启分层命名空间后,允许在同一个Bucket内对文件(Object)进行重命名操作。

注意事项

  • 在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

以下仅列举常见SDK的重命名Object的代码示例。关于其他SDK的重命名Object的代码示例,请参见SDK简介

import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
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";
        // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
        String accessKeyId = "yourAccessKeyId";
        String accessKeySecret = "yourAccessKeySecret";
        // 填写Bucket名称。
        String bucketName = "examplebucket";
        // 填写源Object的完整路径,完整路径中不能包含Bucket名称。
        String sourceObject = "srcobject.txt";
        // 填写目标Object的完整路径。Object完整路径中不能包含Bucket名称。
        String destinationObject = "destobject.txt";

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

        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\OssClient;
use OSS\Core\OssException;

// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
$accessKeyId = "yourAccessKeyId";
$accessKeySecret = "yourAccessKeySecret";
// 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 {
    $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);
    // 将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',
  // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
  accessKeyId: 'yourAccessKeyId',
  accessKeySecret: 'yourAccessKeySecret',
  // 填写Bucket名称。
  bucket: 'examplebucket',
})
// 将srcobject.txt拷贝至同一Bucket下的destobject.txt。
client.copy('destobject.txt', 'srcobject.txt')
  .then(r => {
    console.log('拷贝成功', r);
    client
      // 删除srcobject.txt。
      .delete('srcobject.txt')
      .then(r => console.log(r))
      .catch(e => console.log(e));
  })
  .catch(e => console.log(e));
# -*- coding: utf-8 -*-
import oss2

# 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
auth = oss2.Auth('yourAccessKeyId', 'yourAccessKeySecret')
# 填写Bucket名称,例如examplebucket。
bucket_name = 'examplebucket'
# yourEndpoint填写Bucket所在Region对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
bucket = oss2.Bucket(auth, 'yourEndpoint', 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());
}
// 填写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;
}];

使用命令行工具ossutil

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

使用REST API

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