HOME> 南非世界杯排名> 拷贝文件

拷贝文件

2025-09-17 16:39:33     南非世界杯排名    

使用限制不支持跨地域拷贝Object。例如,不支持将华东1(杭州)地域下Bucket内的Object拷贝到华东2(上海)地域下的Bucket。

注意事项如果要拷贝的文件数量较多,直接指定拷贝后的文件存储类型为深度冷归档类型会造成较高的PUT类请求费用。建议您通过生命周期规则将文件转储为深度冷归档类型,从而降低PUT类请求费用。

您需要有源Object的读权限及目标Bucket的读写权限,否则无法完成拷贝操作。

拷贝文件时,您需要确保源Bucket和目标Bucket均未设置合规保留策略,否则报错The object you specified is immutable.。

拷贝文件时默认会覆盖同名文件, 为防止文件被意外覆盖,您可以通过以下方式保护您的文件。

开启版本控制功能

开启版本控制功能后,被删除或覆盖的文件会以历史版本的形式保存下来。您可以随时恢复历史版本文件。更多信息,请参见版本控制概述。

在拷贝请求中携带禁止覆盖同名文件的参数

在拷贝请求的Header中携带 x-oss-forbid-overwrite参数,并指定其值为true。当您拷贝的文件在目标Bucket中存在同名文件时,该文件将拷贝失败,并返回FileAlreadyExists错误。

操作步骤使用图形化管理工具ossbrowser通过ossbrowser仅支持拷贝小于5 GB的文件。关于如何使用ossbrowser拷贝文件的具体操作,请参见ossbrowser 2.0常用操作。

使用阿里云SDK以下仅列举常见SDK通过CopyObject方法拷贝小于1 GB文件的代码示例。关于其他SDK的拷贝小于1 GB文件以及通过UploadPartCopy方法拷贝大于1 GB文件的代码示例,请参见SDK简介。

Javaimport com.aliyun.oss.*;

import com.aliyun.oss.common.auth.*;

import com.aliyun.oss.common.comm.SignVersion;

import com.aliyun.oss.model.*;

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 sourceBucketName = "srcexamplebucket";

// 填写源Object的完整路径。Object完整路径中不能包含Bucket名称。

String sourceKey = "srcexampleobject.txt";

// 填写与源Bucket处于同一地域的目标Bucket名称。

String destinationBucketName = "desexamplebucket";

// 填写目标Object的完整路径。Object完整路径中不能包含Bucket名称。

String destinationKey = "desexampleobject.txt";

// 填写Bucket所在地域。以华东1(杭州)为例,Region填写为cn-hangzhou。

String region = "cn-hangzhou";

// 创建OSSClient实例。

// 当OSSClient实例不再使用时,调用shutdown方法以释放资源。

ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();

clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);

OSS ossClient = OSSClientBuilder.create()

.endpoint(endpoint)

.credentialsProvider(credentialsProvider)

.clientConfiguration(clientBuilderConfiguration)

.region(region)

.build();

try {

// 创建CopyObjectRequest对象。

CopyObjectRequest copyObjectRequest = new CopyObjectRequest(sourceBucketName, sourceKey, destinationBucketName, destinationKey);

// 设置新的文件元数据。

ObjectMetadata meta = new ObjectMetadata();

meta.setContentType("text/plain");

// 指定CopyObject操作时是否覆盖同名目标Object。此处设置为true,表示禁止覆盖同名Object。

// meta.setHeader("x-oss-forbid-overwrite", "true");

// 指定拷贝的源地址。

// meta.setHeader(OSSHeaders.COPY_OBJECT_SOURCE, "/examplebucket/recode-test.txt");

// 如果源Object的ETag值和您提供的ETag相等,则执行拷贝操作,并返回200 OK。

// meta.setHeader(OSSHeaders.COPY_OBJECT_SOURCE_IF_MATCH, "5B3C1A2E053D763E1B002CC607C5****");

// 如果源Object的ETag值和您提供的ETag不相等,则执行拷贝操作,并返回200 OK。

// meta.setHeader(OSSHeaders.COPY_OBJECT_SOURCE_IF_NONE_MATCH, "5B3C1A2E053D763E1B002CC607C5****");

// 如果指定的时间等于或者晚于文件实际修改时间,则正常拷贝文件,并返回200 OK。

// meta.setHeader(OSSHeaders.COPY_OBJECT_SOURCE_IF_UNMODIFIED_SINCE, "2021-12-09T07:01:56.000Z");

// 如果源Object在指定时间后被修改过,则执行拷贝操作。

// meta.setHeader(OSSHeaders.COPY_OBJECT_SOURCE_IF_MODIFIED_SINCE, "2021-12-09T07:01:56.000Z");

// 指定设置目标Object元数据的方式。此处设置为COPY,表示复制源Object的元数据到目标Object。

// meta.setHeader(OSSHeaders.COPY_OBJECT_METADATA_DIRECTIVE, "COPY");

// 指定OSS创建目标Object时使用的服务器端加密算法。

// meta.setHeader(OSSHeaders.OSS_SERVER_SIDE_ENCRYPTION, ObjectMetadata.KMS_SERVER_SIDE_ENCRYPTION);

// 表示KMS托管的用户主密钥,该参数仅在x-oss-server-side-encryption为KMS时有效。

// meta.setHeader(OSSHeaders.OSS_SERVER_SIDE_ENCRYPTION_KEY_ID, "9468da86-3509-4f8d-a61e-6eab1eac****");

// 指定OSS创建目标Object时的访问权限,此处设置为Private,表示只有Object的拥有者和授权用户有该Object的读写权限,其他用户没有权限操作该Object。

// meta.setHeader(OSSHeaders.OSS_OBJECT_ACL, CannedAccessControlList.Private);

// 指定Object的存储类型。此处设置为Standard,表示标准存储类型。

// meta.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard);

// 指定Object的对象标签,可同时设置多个标签。

// meta.setHeader(OSSHeaders.OSS_TAGGING, "a:1");

// 指定设置目标Object对象标签的方式。此处设置为COPY,表示复制源Object的对象标签到目标Object。

// meta.setHeader(OSSHeaders.COPY_OBJECT_TAGGING_DIRECTIVE, "COPY");

copyObjectRequest.setNewObjectMetadata(meta);

// 复制文件。

CopyObjectResult result = ossClient.copyObject(copyObjectRequest);

System.out.println("ETag: " + result.getETag() + " LastModified: " + result.getLastModified());

} 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();

}

}

}

} Node.jsconst 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名称。例如examplebucket。

bucket: 'examplebucket',

// 设置是否启用HTTPS。设置secure为true时,表示启用。

// secure: true

})

// 拷贝同一个Bucket中的文件。

async function copySmallObjecInSameBucket() {

try {

// 填写拷贝后和拷贝前的文件完整路径。文件完整路径中不能包含Bucket名称。

// 设置目标文件的HTTP头和自定义目标文件的元数据。

const result = await client.copy('destexampleobject.txt', 'srcexampleobject.txt', {

// 指定headers参数,设置目标文件的HTTP头。如果未指定headers参数,则目标文件与源文件的HTTP头相同,即拷贝源文件的HTTP头。

headers: {

'Cache-Control': 'no-cache',

// 如果源Object的ETag值和您提供的ETag相等,则执行拷贝操作,并返回200 OK。

'if-match': '5B3C1A2E053D763E1B002CC607C5****',

// 如果源Object的ETag值和您提供的ETag不相等,则执行拷贝操作,并返回200 OK。

'if-none-match': '5B3C1A2E053D763E1B002CC607C5****',

// 如果指定的时间早于文件实际修改时间,则执行拷贝操作,并返回200 OK。

'if-modified-since': '2021-12-09T07:01:56.000Z',

// 如果指定的时间晚于文件实际修改时间,则执行拷贝操作,并返回200 OK。

'if-unmodified-since': '2021-12-09T07:01:56.000Z',

// 指定OSS创建目标Object时的访问权限,此处设置为private,表示只有Object的拥有者和授权用户有该Object的读写权限,其他用户没有权限操作该Object。

'x-oss-object-acl': 'private',

// 指定Object的对象标签,可同时设置多个标签。

'x-oss-tagging': 'Tag1=1&Tag2=2',

// 指定CopyObject操作时是否覆盖同名目标Object。此处设置为true,表示禁止覆盖同名Object。

'x-oss-forbid-overwrite': 'true',

},

// 指定meta参数,自定义目标文件的元数据。如果未指定meta参数,目标文件与源文件的元数据相同,即拷贝源文件的元数据。

meta: {

location: 'hangzhou',

year: 2015,

people: 'mary',

},

});

console.log(result);

} catch (e) {

console.log(e);

}

}

copySmallObjecInSameBucket()C#using Aliyun.OSS;

using Aliyun.OSS.Common;

// 填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。

var endpoint = "https://oss-cn-hangzhou.aliyuncs.com";

// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。

var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID");

var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET");

// 填写源Bucket名称,例如srcexamplebucket。

var sourceBucket = "srcexamplebucket";

// 填写源Object的完整路径,完整路径中不能包含Bucket名称,例如srcdir/scrobject.txt。

var sourceObject = "srcdir/scrobject.txt";

// 填写与源Bucket处于同一地域的目标Bucket名称,例如destbucket。

var targetBucket = "destbucket";

// 填写目标Object的完整路径,完整路径中不能包含Bucket名称,例如destdir/destobject.txt。

var targetObject = "destdir/destobject.txt";

// 填写Bucket所在地域对应的Region。以华东1(杭州)为例,Region填写为cn-hangzhou。

const string region = "cn-hangzhou";

// 创建ClientConfiguration实例,按照您的需要修改默认参数。

var conf = new ClientConfiguration();

// 设置v4签名。

conf.SignatureVersion = SignatureVersion.V4;

// 创建OssClient实例。

var client = new OssClient(endpoint, accessKeyId, accessKeySecret, conf);

client.SetRegion(region);

try

{

var metadata = new ObjectMetadata();

// 设置自定义元数据。自定义元数据为键值对(Key-Value)的形式,例如Key为mk1,Value为mv1。

metadata.AddHeader("mk1", "mv1");

metadata.AddHeader("mk2", "mv2");

var req = new CopyObjectRequest(sourceBucket, sourceObject, targetBucket, targetObject)

{

// 如果NewObjectMetadata为null则为COPY模式(即拷贝源文件的元数据),非null则为REPLACE模式(覆盖源文件的元数据)。

NewObjectMetadata = metadata

};

// 拷贝文件。

client.CopyObject(req);

Console.WriteLine("Copy object succeeded");

}

catch (OssException ex)

{

Console.WriteLine("Failed with error code: {0}; Error info: {1}. \nRequestID: {2} \tHostID: {3}",

ex.ErrorCode, ex.Message, ex.RequestId, ex.HostId);

}

catch (Exception ex)

{

Console.WriteLine("Failed with error info: {0}", ex.Message);

}Android-Java// 填写源Bucket名称。

String srcBucketName = "srcbucket";

// 填写源Bucket内的Object完整路径。

String srcObjectKey = "dir1/srcobject.txt";

// 填写与源Bucket处于同一地域的目标Bucket名称。

String destBucketName = "destbucket";

// 填写目标Bucket内的Object完整路径。

String destObjectKey = "dir2/destobject.txt";

// 创建Copy请求。

CopyObjectRequest copyObjectRequest = new CopyObjectRequest(srcBucketName, srcObjectKey, destBucketName, destObjectKey);

// ObjectMetadata objectMetadata = new ObjectMetadata();

// 设置Object的访问权限。此处设置有private,表示私有访问权限。

// objectMetadata.setHeader("x-oss-object-acl", "private");

// 设置Object存储类型。此处设置为Standard,表示标准存储类型。

// objectMetadata.setHeader("x-oss-storage-class", "Standard");

// 指定CopyObject操作时是否覆盖同名目标Object。此处设置为true,表示禁止覆盖同名Object。

// objectMetadata.setHeader("x-oss-forbid-overwrite", "true");

// 如果源Object的ETag值和您提供的ETag相等,则执行拷贝操作。

// objectMetadata.setHeader("x-oss-copy-source-if-match", "5B3C1A2E053D763E1B002CC607C5****");

// 指定拷贝的源地址。

// objectMetadata.setHeader("x-oss-copy-source", "/examplebucket/recode-test.txt");

// 如果源Object的ETag值和您提供的ETag不相等,则执行拷贝操作。

// objectMetadata.setHeader("x-oss-copy-source-if-none-match", "5B3C1A2E053D763E1B002CC607C5****");

// 如果指定的时间等于或者晚于文件实际修改时间,则执行拷贝操作。

// objectMetadata.setHeader("x-oss-copy-source-if-unmodified-since", "2021-12-09T07:01:56.000Z");

// 如果源Object在指定时间后被修改过,则执行拷贝操作。

// objectMetadata.setHeader("x-oss-copy-source-if-modified-since", "2021-12-09T07:01:56.000Z");

// 指定设置目标Object元数据的方式。此处设置为COPY,表示复制源Object的元数据到目标Object。

// objectMetadata.setHeader("x-oss-metadata-directive", "COPY");

// 指定OSS创建目标Object时使用的服务器端加密算法。

// objectMetadata.setHeader("x-oss-server-side-encryption", "SSE-KMS");

// 表示KMS托管的用户主密钥,该参数仅在x-oss-server-side-encryption为KMS时有效。

// objectMetadata.setHeader("x-oss-server-side-encryption-key-id", "9468da86-3509-4f8d-a61e-6eab1eac****");

// 指定Object的对象标签,可同时设置多个标签。

// objectMetadata.setHeader("x-oss-tagging", "a:1");

// 指定设置目标Object对象标签的方式。此处设置为COPY,表示复制源Object的对象标签到目标Object。

// objectMetadata.setHeader("x-oss-tagging-directive", "COPY");

// 异步Copy。

OSSAsyncTask copyTask = oss.asyncCopyObject(copyObjectRequest, new OSSCompletedCallback() {

@Override

public void onSuccess(CopyObjectRequest request, CopyObjectResult result) {

Log.d("copyObject", "copy success!");

}

@Override

public void onFailure(CopyObjectRequest request, ClientException clientExcepion, ServiceException serviceException) {

// 请求异常。

if (clientExcepion != null) {

// 客户端异常,例如网络异常等。

clientExcepion.printStackTrace();

}

if (serviceException != null) {

// 服务端异常。

Log.e("ErrorCode", serviceException.getErrorCode());

Log.e("RequestId", serviceException.getRequestId());

Log.e("HostId", serviceException.getHostId());

Log.e("RawMessage", serviceException.getRawMessage());

}

}

});Object COSSCopyObjectRequest * copy = [OSSCopyObjectRequest new];

// 填写源Bucket名称。

copy.sourceBucketName = @"sourcebucket";

// 填写源Bucket内的Object完整路径。

copy.sourceObjectKey = @"dir1/srcobject.txt";

// 填写目标Bucket名称。

copy.bucketName = @"destbucket";

// 填写目标Bucket内的Object完整路径。

copy.objectKey = @"dir2/destobject.txt";

NSMutableDictionary *objectMeta = [NSMutableDictionary dictionary];

// 设置访问权限。此处设置为private,表示私有权限。

[objectMeta setValue:@"x-oss-object-acl" forKey:@"public-read"];

// 设置存储类型。此处设置为Standard,表示标准存储类型。

[objectMeta setValue:@"x-oss-storage-class" forKey:@"Standard"];

// 是否覆盖同名Object。不指定x-oss-forbid-overwrite时,默认覆盖同名Object。

// 指定x-oss-forbid-overwrite为false时,表示允许覆盖同名Object。指定x-oss-forbid-overwrite为true时,表示禁止覆盖同名Object,如果同名Object已存在,程序将报错。

[objectMeta setValue:@"x-oss-forbid-overwrite" forKey:@"true"];

// 如果源Object的ETag值和您提供的ETag相等,则执行拷贝操作。

[objectMeta setValue:@"x-oss-copy-source-if-match" forKey:@"5B3C1A2E053D763E1B002CC607C5****"];

// 如果源Object的ETag值和您提供的ETag不相等,则执行拷贝操作。

[objectMeta setValue:@"x-oss-copy-source-if-none-match" forKey:@"5B3C1A2E053D763E1B002CC607C5****"];

// 如果文件实际修改时间早于或等于2021-12-09T07:01:56.000Z,则执行拷贝操作。

[objectMeta setValue:@"x-oss-copy-source-if-unmodified-since" forKey:@"2021-12-09T07:01:56.000Z"];

// 如果文件实际修改时间晚于2021-12-15T07:01:56.000Z,则执行拷贝操作。

[objectMeta setValue:@"x-oss-copy-source-if-modified-since" forKey:@"2021-12-15T07:01:56.000Z"];

// 复制源Object的元数据到目标Object。

[objectMeta setValue:@"x-oss-metadata-directive" forKey:@"COPY"];

// 复制源Object的对象标签到目标Object。

[objectMeta setValue:@"x-oss-tagging-directive" forKey:@"Copy"];

// 指定OSS创建目标Object时使用的服务器端加密算法。

[objectMeta setValue:@"x-oss-server-side-encryption" forKey:@"KMS"];

// 表示KMS托管的用户主密钥,该参数仅在x-oss-server-side-encryption为KMS时有效。

[objectMeta setValue:@"x-oss-server-side-encryption-key-id" forKey:@"9468da86-3509-4f8d-a61e-6eab1eac****"];

copy.objectMeta = objectMeta;

OSSTask * task = [client copyObject:copy];

[task continueWithBlock:^id(OSSTask *task) {

if (!task.error) {

NSLog(@"copy object success!");

} else {

NSLog(@"copy object failed, error: %@" , task.error);

}

return nil;

}];

// 实现同步阻塞等待任务完成。

// [task waitUntilFinished];C++#include

using namespace AlibabaCloud::OSS;

int main(void)

{

/* 初始化OSS账号信息。*/

/* yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。*/

std::string Endpoint = "yourEndpoint";

/* yourRegion填写Bucket所在地域对应的Region。以华东1(杭州)为例,Region填写为cn-hangzhou。*/

std::string Region = "yourRegion";

/* 填写源Bucket名称,例如srcexamplebucket。*/

std::string SourceBucketName = "srcexamplebucket";

/* 填写与源Bucket处于同一地域的目标Bucket名称,例如destbucket。*/

std::string CopyBucketName = "destbucket";

/* 填写源Object的完整路径,完整路径中不能包含Bucket名称,例如srcdir/scrobject.txt。*/

std::string SourceObjectName = "srcdir/scrobject.txt";

/* 填写目标Object的完整路径,完整路径中不能包含Bucket名称,例如destdir/destobject.txt。*/

std::string CopyObjectName = "destdir/destobject.txt";

/* 初始化网络等资源。*/

InitializeSdk();

ClientConfiguration conf;

conf.signatureVersion = SignatureVersionType::V4;

/* 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。*/

auto credentialsProvider = std::make_shared();

OssClient client(Endpoint, credentialsProvider, conf);

client.SetRegion(Region);

CopyObjectRequest request(CopyBucketName, CopyObjectName);

request.setCopySource(SourceBucketName, SourceObjectName);

/* 拷贝文件。*/

auto outcome = client.CopyObject(request);

if (!outcome.isSuccess()) {

/* 异常处理。*/

std::cout << "CopyObject fail" <<

",code:" << outcome.error().Code() <<

",message:" << outcome.error().Message() <<

",requestId:" << outcome.error().RequestId() << std::endl;

return -1;

}

/* 释放网络等资源。*/

ShutdownSdk();

return 0;

}C#include "oss_api.h"

#include "aos_http_io.h"

/* yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。*/

const char *endpoint = "yourEndpoint";

/* 填写源Bucket名称。*/

const char *source_bucket_name = "yourSourceBucketName";

/* 填写源Object的完整路径。Object完整路径中不能包含Bucket名称。*/

const char *source_object_name = "yourSourceObjectName";

/* 填写与源Bucket处于同一地域的目标Bucket名称。*/

const char *dest_bucket_name = "yourDestBucketName";

/* 填写目标Object的完整路径。Object完整路径中不能包含Bucket名称。*/

const char *dest_object_name = "yourDestObjectName";

/* yourRegion填写Bucket所在地域对应的Region。以华东1(杭州)为例,Region填写为cn-hangzhou。*/

const char *region = "yourRegion";

void init_options(oss_request_options_t *options)

{

options->config = oss_config_create(options->pool);

/* 用char*类型的字符串初始化aos_string_t类型。*/

aos_str_set(&options->config->endpoint, endpoint);

/* 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。*/

aos_str_set(&options->config->access_key_id, getenv("OSS_ACCESS_KEY_ID"));

aos_str_set(&options->config->access_key_secret, getenv("OSS_ACCESS_KEY_SECRET"));

//需要额外配置以下两个参数

aos_str_set(&options->config->region, region);

options->config->signature_version = 4;

/* 是否使用了CNAME。0表示不使用。*/

options->config->is_cname = 0;

/* 用于设置网络相关参数,比如超时时间等。*/

options->ctl = aos_http_controller_create(options->pool, 0);

}

int main(int argc, char *argv[])

{

/* 在程序入口调用aos_http_io_initialize方法来初始化网络、内存等全局资源。*/

if (aos_http_io_initialize(NULL, 0) != AOSE_OK) {

exit(1);

}

/* 用于内存管理的内存池(pool),等价于apr_pool_t。其实现代码在apr库中。*/

aos_pool_t *pool;

/* 重新创建一个内存池,第二个参数是NULL,表示没有继承其它内存池。*/

aos_pool_create(&pool, NULL);

/* 创建并初始化options,该参数包括endpoint、access_key_id、acces_key_secret、is_cname、curl等全局配置信息。*/

oss_request_options_t *oss_client_options;

/* 在内存池中分配内存给options。*/

oss_client_options = oss_request_options_create(pool);

/* 初始化Client的选项oss_client_options。*/

init_options(oss_client_options);

/* 初始化参数。*/

aos_string_t source_bucket;

aos_string_t source_object;

aos_string_t dest_bucket;

aos_string_t dest_object;

aos_table_t *headers = NULL;

aos_table_t *resp_headers = NULL;

aos_status_t *resp_status = NULL;

aos_str_set(&source_bucket, source_bucket_name);

aos_str_set(&source_object, source_object_name);

aos_str_set(&dest_bucket, dest_bucket_name);

aos_str_set(&dest_object, dest_object_name);

headers = aos_table_make(pool, 0);

/* 拷贝文件。*/

resp_status = oss_copy_object(oss_client_options, &source_bucket, &source_object, &dest_bucket, &dest_object, headers, &resp_headers);

if (aos_status_is_ok(resp_status)) {

printf("copy object succeeded\n");

} else {

printf("copy object failed\n");

}

/* 释放内存池,相当于释放了请求过程中各资源分配的内存。*/

aos_pool_destroy(pool);

/* 释放之前分配的全局资源。*/

aos_http_io_deinitialize();

return 0;

}Rubyrequire 'aliyun/oss'

client = Aliyun::OSS::Client.new(

# 填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。

endpoint: 'https://oss-cn-hangzhou.aliyuncs.com',

# 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。

access_key_id: ENV['OSS_ACCESS_KEY_ID'],

access_key_secret: ENV['OSS_ACCESS_KEY_SECRET']

)

# 填写Bucket名称,例如examplebucket。

bucket = client.get_bucket('examplebucket')

# 拷贝文件并拷贝文件元数据。

bucket.copy_object(

# 以将srcobject.txt拷贝为destobject.txt为例。

'destobject.txt', 'srcobject.txt',

:meta_directive => Aliyun::OSS::MetaDirective::COPY)

# 拷贝文件并覆盖文件元数据。

bucket.copy_object(

'destobject.txt', 'srcobject.txt',

:metas => {'year' => '2017'},

:meta_directive => Aliyun::OSS::MetaDirective::REPLACE) Gopackage 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)

// 创建复制对象请求

request := &oss.CopyObjectRequest{

Bucket: oss.Ptr(destBucketName), // 目标存储空间名称

Key: oss.Ptr(destObjectName), // 目标对象名称

SourceKey: oss.Ptr(srcObjectName), // 源对象名称

SourceBucket: oss.Ptr(srcBucketName), // 源存储空间名称

}

// 执行复制对象操作并处理结果

result, err := client.CopyObject(context.TODO(), request)

if err != nil {

log.Fatalf("failed to copy object %v", err)

}

log.Printf("copy object result:%#v\n", result)

}

Pythonimport argparse

import alibabacloud_oss_v2 as oss

# 创建命令行参数解析器

parser = argparse.ArgumentParser(description="copy object sample")

# 添加命令行参数 --region,表示存储空间所在的区域,必需参数

parser.add_argument('--region', help='The region in which the bucket is located.', required=True)

# 添加命令行参数 --bucket,表示目标存储空间的名称,必需参数

parser.add_argument('--bucket', help='The name of the destination bucket.', required=True)

# 添加命令行参数 --endpoint,表示其他服务可用来访问OSS的域名,非必需参数

parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS')

# 添加命令行参数 --key,表示目标对象的名称,必需参数

parser.add_argument('--key', help='The name of the destination object.', required=True)

# 添加命令行参数 --source_key,表示源对象的名称,必需参数

parser.add_argument('--source_key', help='The name of the source object.', required=True)

# 添加命令行参数 --source_bucket,表示源存储空间的名称,必需参数

parser.add_argument('--source_bucket', help='The name of the source bucket.', required=True)

def main():

# 解析命令行参数

args = parser.parse_args()

# 从环境变量中加载凭证信息,用于身份验证

credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()

# 加载SDK的默认配置,并设置凭证提供者

cfg = oss.config.load_default()

cfg.credentials_provider = credentials_provider

# 设置配置中的区域信息

cfg.region = args.region

# 如果提供了endpoint参数,则设置配置中的endpoint

if args.endpoint is not None:

cfg.endpoint = args.endpoint

# 使用配置好的信息创建OSS客户端

client = oss.Client(cfg)

# 执行复制对象的请求

result = client.copy_object(oss.CopyObjectRequest(

bucket=args.bucket, # 指定目标存储空间名称

key=args.key, # 指定目标对象键名

source_key=args.source_key, # 指定源对象键名

source_bucket=args.source_bucket, # 指定源存储空间名称

))

# 输出复制对象的结果信息

print(f'status code: {result.status_code},'

f' request id: {result.request_id},'

f' version id: {result.version_id},'

f' hash crc64: {result.hash_crc64},'

f' source version id: {result.source_version_id},'

f' server side encryption: {result.server_side_encryption},'

f' server side data encryption: {result.server_side_data_encryption},'

f' last modified: {result.last_modified},'

f' etag: {result.etag},'

)

# 当此脚本被直接运行时,调用main函数

if __name__ == "__main__":

main() # 脚本入口,当文件被直接运行时调用main函数PHP

// 引入自动加载文件,确保依赖库能够正确加载

require_once __DIR__ . '/../vendor/autoload.php';

use AlibabaCloud\Oss\V2 as Oss;

// 定义命令行参数的描述信息

$optsdesc = [

"region" => ['help' => 'The region in which the bucket is located.', 'required' => True], // Bucket所在的地域(必填)

"endpoint" => ['help' => 'The domain names that other services can use to access OSS.', 'required' => False], // 访问域名(可选)

"bucket" => ['help' => 'The name of the bucket', 'required' => True], // 目标Bucket名称(必填)

"key" => ['help' => 'The name of the object', 'required' => True], // 目标对象名称(必填)

"src-bucket" => ['help' => 'The name of the source bucket', 'required' => False], // 源Bucket名称(可选)

"src-key" => ['help' => 'The name of the source object', 'required' => True], // 源对象名称(必填)

];

// 将参数描述转换为getopt所需的长选项格式

// 每个参数后面加上":"表示该参数需要值

$longopts = \array_map(function ($key) {

return "$key:";

}, array_keys($optsdesc));

// 解析命令行参数

$options = getopt("", $longopts);

// 验证必填参数是否存在

foreach ($optsdesc as $key => $value) {

if ($value['required'] === True && empty($options[$key])) {

$help = $value['help']; // 获取参数的帮助信息

echo "Error: the following arguments are required: --$key, $help" . PHP_EOL;

exit(1); // 如果必填参数缺失,则退出程序

}

}

// 从解析的参数中提取值

$region = $options["region"]; // Bucket所在的地域

$bucket = $options["bucket"]; // 目标Bucket名称

$key = $options["key"]; // 目标对象名称

$srcKey = $options["src-key"]; // 源对象名称

// 加载环境变量中的凭证信息

// 使用EnvironmentVariableCredentialsProvider从环境变量中读取Access Key ID和Access Key Secret

$credentialsProvider = new Oss\Credentials\EnvironmentVariableCredentialsProvider();

// 使用SDK的默认配置

$cfg = Oss\Config::loadDefault();

$cfg->setCredentialsProvider($credentialsProvider); // 设置凭证提供者

$cfg->setRegion($region); // 设置Bucket所在的地域

if (isset($options["endpoint"])) {

$cfg->setEndpoint($options["endpoint"]); // 如果提供了访问域名,则设置endpoint

}

// 创建OSS客户端实例

$client = new Oss\Client($cfg);

// 创建CopyObjectRequest对象,用于复制对象

$request = new Oss\Models\CopyObjectRequest(

bucket: $bucket,

key: $key);

if (!empty($options["src-bucket"])) {

$request->sourceBucket = $options["src-bucket"]; // 如果提供了源Bucket名称,则设置sourceBucket

}

$request->sourceKey = $srcKey; // 设置源对象名称

// 执行复制对象操作

$result = $client->copyObject($request);

// 打印复制结果

printf(

'status code:' . $result->statusCode . PHP_EOL . // HTTP状态码,例如200表示成功

'request id:' . $result->requestId . PHP_EOL // 请求ID,用于调试或追踪请求

);

使用命令行工具ossutil您可以使用命令行工具ossutil来拷贝文件,ossutil的安装请参见安装ossutil。

以下示例展示了如何拷贝存储空间srcBucket下的srcObject到存储空间examplebucket下的exampleobject。

ossutil api copy-object --bucket examplebucket --key exampleobject --copy-source /srcBucket/srcObject关于该命令的更多信息,请参见copy-object。

相关API以上操作方式底层基于以下API,如果您的程序自定义要求较高,您可以直接发起REST API请求。直接发起REST API请求需要手动编写代码计算签名。更多信息,请参见CopyObject。