日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

Java拷貝文件

本文介紹如何將源Bucket中的文件(Object)復制到同一地域下相同或不同目標Bucket中。

注意事項

  • 本文以華東1(杭州)外網Endpoint為例。如果您希望通過與OSS同地域的其他阿里云產品訪問OSS,請使用內網Endpoint。關于OSS支持的RegionEndpoint的對應關系,請參見OSS訪問域名、數據中心、開放端口

  • 本文以從環境變量讀取訪問憑證為例。如何配置訪問憑證,請參見Java配置訪問憑證

  • 本文以OSS域名新建OSSClient為例。如果您希望通過自定義域名、STS等方式新建OSSClient,請參見新建OSSClient

  • 拷貝文件時,您必須擁有源文件的讀權限及目標Bucket的讀寫權限。

  • 拷貝文件時,您需要確保源Bucket和目標Bucket均未設置合規保留策略,否則報錯The object you specified is immutable.

  • 不支持跨地域拷貝。例如不能將華東1(杭州)地域存儲空間中的文件拷貝到華北1(青島)地域。

拷貝小文件

對于小于1 GB的文件,您可以通過ossClient.copyObject方法拷貝文件。此方法有兩種參數指定方式:

參數指定方式

描述

CopyObjectResult copyObject(String sourceBucketName, String sourceKey, String destinationBucketName, String destinationKey)

允許指定源存儲空間和源文件,以及目標存儲空間和目標文件。拷貝后,目標文件的內容及元數據與源文件相同,稱為簡單拷貝。

CopyObjectResult copyObject(CopyObjectRequest copyObjectRequest)

允許指定目標文件的元數據和拷貝的限制條件。如果拷貝操作的源文件地址和目標文件地址相同,則直接替換源文件的元數據。

CopyObjectRequest可設置的參數請參見下表。

參數

描述

方法

sourceBucketName

源存儲空間名稱。

setSourceBucketName(String sourceBucketName)

sourceKey

源文件名稱。

setSourceKey(String sourceKey)

destinationBucketName

目標存儲空間名稱。

setDestinationBucketName(String destinationBucketName)

destinationKey

目標文件名稱。

setDestinationKey(String destinationKey)

newObjectMetadata

目標文件元數據。

setNewObjectMetadata(ObjectMetadata newObjectMetadata)

matchingETagConstraints

拷貝的限制條件。如果源文件的ETag值和用戶提供的ETag值相等,則執行拷貝操作,否則返回錯誤。

setMatchingETagConstraints(List<String> matchingETagConstraints)

nonmatchingEtagConstraints

拷貝的限制條件。如果源文件的ETag值和用戶提供的ETag值不相等,則執行拷貝操作,否則返回錯誤。

setNonmatchingETagConstraints(List<String> nonmatchingEtagConstraints)

unmodifiedSinceConstraint

拷貝的限制條件。如果傳入參數中的時間等于或者晚于文件實際修改時間,則執行拷貝操作,否則返回錯誤。

setUnmodifiedSinceConstraint(Date unmodifiedSinceConstraint)

modifiedSinceConstraint

拷貝的限制條件。如果源文件在指定的時間之后被修改過,則執行拷貝操作,否則返回錯誤。

setModifiedSinceConstraint(Date modifiedSinceConstraint)

CopyObjectResult的參數說明請參見下表。

參數

描述

方法

etag

OSS文件唯一性標識。

String getETag()

lastModified

文件最后修改時間。

Date getLastModified()

拷貝小文件有以下幾種拷貝形式。

  • 簡單拷貝

    以下代碼用于通過簡單拷貝將srcexamplebucket中的srcexampleobject.txt文件拷貝到目標存儲空間desexamplebucket中的desexampleobject.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.*;
    
    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_IDOSS_ACCESS_KEY_SECRET。
            EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
            // 填寫源Bucket名稱。
            String sourceBucketName = "srcexamplebucket";
            // 填寫源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實例。
            ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
            clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);        
            OSS ossClient = OSSClientBuilder.create()
            .endpoint(endpoint)
            .credentialsProvider(credentialsProvider)
            .clientConfiguration(clientBuilderConfiguration)
            .region(region)               
            .build();
    
            try {
                // 拷貝文件。
                CopyObjectResult result = ossClient.copyObject(sourceBucketName, sourceKey, destinationBucketName, destinationKey);
                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();
                }
            }
        }
    }                   
  • 通過CopyObjectRequest拷貝

    以下代碼用于通過CopyObjectRequestsrcexamplebucket中的srcexampleobject.txt文件拷貝到目標存儲空間desexamplebucket中的desexampleobject.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.*;
    
    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_IDOSS_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實例。
            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");
                // 如果源ObjectETag值和您提供的ETag相等,則執行拷貝操作,并返回200 OK。
                // meta.setHeader(OSSHeaders.COPY_OBJECT_SOURCE_IF_MATCH, "5B3C1A2E053D763E1B002CC607C5****");
                // 如果源ObjectETag值和您提供的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-encryptionKMS時有效。
                // 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();
                }
            }
        }
    }                 

拷貝大文件

對于大于1 GB的文件,需要使用分片拷貝(UploadPartCopy)。分片拷貝分為三步:

  1. 通過ossClient.initiateMultipartUpload初始化分片拷貝任務。

  2. 通過ossClient.uploadPartCopy進行分片拷貝。除最后一個分片外,其它分片都要大于100KB。

  3. 通過ossClient.completeMultipartUpload提交分片拷貝任務。

以下代碼用于通過分片拷貝將srcexamplebucket中的srcexampleobject.txt文件拷貝到目標存儲空間desexamplebucket中的desexampleobject.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.*;
import java.util.ArrayList;
import java.util.List;

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實例。
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);        
        OSS ossClient = OSSClientBuilder.create()
        .endpoint(endpoint)
        .credentialsProvider(credentialsProvider)
        .clientConfiguration(clientBuilderConfiguration)
        .region(region)               
        .build();

        try {
            ObjectMetadata objectMetadata = ossClient.getObjectMetadata(sourceBucketName, sourceKey);
            // 獲取被拷貝文件的大小。
            long contentLength = objectMetadata.getContentLength();

            // 設置分片大小為10 MB。單位為字節。
            long partSize = 1024 * 1024 * 10;

            // 計算分片總數。
            int partCount = (int) (contentLength / partSize);
            if (contentLength % partSize != 0) {
                partCount++;
            }
            System.out.println("total part count:" + partCount);

            // 初始化拷貝任務。可以通過InitiateMultipartUploadRequest指定目標文件元數據。
            InitiateMultipartUploadRequest initiateMultipartUploadRequest = new InitiateMultipartUploadRequest(destinationBucketName, destinationKey);
            // 拷貝源文件ContentType和UserMetadata,分片拷貝默認不拷貝源文件的ContentType和UserMetadata。
            ObjectMetadata metadata = new ObjectMetadata();
            metadata.setContentType(objectMetadata.getContentType());
            metadata.setUserMetadata(objectMetadata.getUserMetadata());
            initiateMultipartUploadRequest.setObjectMetadata(metadata);
            InitiateMultipartUploadResult initiateMultipartUploadResult = ossClient.initiateMultipartUpload(initiateMultipartUploadRequest);
            String uploadId = initiateMultipartUploadResult.getUploadId();

            // 分片拷貝。
            List<PartETag> partETags = new ArrayList<PartETag>();
            for (int i = 0; i < partCount; i++) {
                // 計算每個分片的大小。
                long skipBytes = partSize * i;
                long size = partSize < contentLength - skipBytes ? partSize : contentLength - skipBytes;

                // 創建UploadPartCopyRequest。可以通過UploadPartCopyRequest指定限定條件。
                UploadPartCopyRequest uploadPartCopyRequest =
                        new UploadPartCopyRequest(sourceBucketName, sourceKey, destinationBucketName, destinationKey);
                uploadPartCopyRequest.setUploadId(uploadId);
                uploadPartCopyRequest.setPartSize(size);
                uploadPartCopyRequest.setBeginIndex(skipBytes);
                uploadPartCopyRequest.setPartNumber(i + 1);
                //Map headers = new HashMap();
                // 指定拷貝的源地址。
                // headers.put(OSSHeaders.COPY_OBJECT_SOURCE, "/examplebucket/desexampleobject.txt");
                // 指定源Object的拷貝范圍。例如設置bytes=0~1023,表示拷貝1~1024字節的內容。
                // headers.put(OSSHeaders.COPY_SOURCE_RANGE, "bytes=0~1023");
                // 如果源Object的ETag值和您提供的ETag相等,則執行拷貝操作,并返回200 OK。
                // headers.put(OSSHeaders.COPY_OBJECT_SOURCE_IF_MATCH, "5B3C1A2E053D763E1B002CC607C5****");
                // 如果源Object的ETag值和您提供的ETag不相等,則執行拷貝操作,并返回200 OK。
                // headers.put(OSSHeaders.COPY_OBJECT_SOURCE_IF_NONE_MATCH, "5B3C1A2E053D763E1B002CC607C5****");
                // 如果指定的時間等于或者晚于文件實際修改時間,則正常拷貝文件,并返回200 OK。
                // headers.put(OSSHeaders.COPY_OBJECT_SOURCE_IF_UNMODIFIED_SINCE, "2021-12-09T07:01:56.000Z");
                // 如果源Object在用戶指定的時間以后被修改過,則執行拷貝操作。
                // headers.put(OSSHeaders.COPY_OBJECT_SOURCE_IF_MODIFIED_SINCE, "2021-12-09T07:01:56.000Z");
                // uploadPartCopyRequest.setHeaders(headers);
                UploadPartCopyResult uploadPartCopyResult = ossClient.uploadPartCopy(uploadPartCopyRequest);

                // 將返回的分片ETag保存到partETags中。
                partETags.add(uploadPartCopyResult.getPartETag());
            }

            // 提交分片拷貝任務。
            CompleteMultipartUploadRequest completeMultipartUploadRequest = new CompleteMultipartUploadRequest(
                    destinationBucketName, destinationKey, uploadId, partETags);
            ossClient.completeMultipartUpload(completeMultipartUploadRequest);
        } 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();
            }
        }
    }
}

相關文檔

  • 拷貝小文件

    關于拷貝小文件的API接口說明,請參見CopyObject

  • 拷貝大文件

    • 關于拷貝大文件的完整示例代碼,請參見GitHub示例

    • 關于拷貝大文件的API接口說明,請參見UploadPartCopy