예제 #1
0
        private static void Main(string[] args)
        {
            BosClient    client     = SampleUtil.GetSampleBosClient();
            const string bucketName = "sample-bucket-multi-upload1"; //示例Bucket名称

            // 初始化:创建示例Bucket
            client.CreateBucket(bucketName); //指定Bucket名称
            string objectKey = "sample";

            // 1.开始Multipart Upload
            InitiateMultipartUploadRequest initiateMultipartUploadRequest =
                new InitiateMultipartUploadRequest()
            {
                BucketName = bucketName, Key = objectKey
            };
            InitiateMultipartUploadResponse initiateMultipartUploadResponse =
                client.InitiateMultipartUpload(initiateMultipartUploadRequest);

            // 2.获取Bucket内的Multipart Upload
            ListMultipartUploadsRequest listMultipartUploadsRequest =
                new ListMultipartUploadsRequest()
            {
                BucketName = bucketName
            };
            ListMultipartUploadsResponse listMultipartUploadsResponse =
                client.ListMultipartUploads(listMultipartUploadsRequest);

            foreach (MultipartUploadSummary multipartUpload in listMultipartUploadsResponse.Uploads)
            {
                Console.WriteLine("Key: " + multipartUpload.Key + " UploadId: " + multipartUpload.UploadId);
            }

            // 3.分块上传,首先设置每块为 5Mb
            long     partSize = 1024 * 1024 * 5L;
            FileInfo partFile = new FileInfo("d:\\lzb\\sample");
            // 计算分块数目
            int partCount = (int)(partFile.Length / partSize);

            if (partFile.Length % partSize != 0)
            {
                partCount++;
            }
            // 新建一个List保存每个分块上传后的ETag和PartNumber
            List <PartETag> partETags = new List <PartETag>();

            for (int i = 0; i < partCount; i++)
            {
                // 获取文件流
                Stream stream = partFile.OpenRead();
                // 跳到每个分块的开头
                long skipBytes = partSize * i;
                stream.Seek(skipBytes, SeekOrigin.Begin);
                // 计算每个分块的大小
                long size = Math.Min(partSize, partFile.Length - skipBytes);
                // 创建UploadPartRequest,上传分块
                UploadPartRequest uploadPartRequest = new UploadPartRequest();
                uploadPartRequest.BucketName  = bucketName;
                uploadPartRequest.Key         = objectKey;
                uploadPartRequest.UploadId    = initiateMultipartUploadResponse.UploadId;
                uploadPartRequest.InputStream = stream;
                uploadPartRequest.PartSize    = size;
                uploadPartRequest.PartNumber  = i + 1;
                UploadPartResponse uploadPartResponse = client.UploadPart(uploadPartRequest);
                // 将返回的PartETag保存到List中。
                partETags.Add(new PartETag()
                {
                    ETag       = uploadPartResponse.ETag,
                    PartNumber = uploadPartResponse.PartNumber
                });
                // 关闭文件
                stream.Close();
            }

            // 4. 获取UploadId的所有Upload Part
            ListPartsRequest listPartsRequest = new ListPartsRequest()
            {
                BucketName = bucketName,
                Key        = objectKey,
                UploadId   = initiateMultipartUploadResponse.UploadId,
            };
            // 获取上传的所有Part信息
            ListPartsResponse listPartsResponse = client.ListParts(listPartsRequest);

            // 遍历所有Part
            foreach (PartSummary part in listPartsResponse.Parts)
            {
                Console.WriteLine("PartNumber: " + part.PartNumber + " ETag: " + part.ETag);
            }

            // 5. 完成分块上传
            CompleteMultipartUploadRequest completeMultipartUploadRequest =
                new CompleteMultipartUploadRequest()
            {
                BucketName = bucketName,
                Key        = objectKey,
                UploadId   = initiateMultipartUploadResponse.UploadId,
                PartETags  = partETags
            };
            CompleteMultipartUploadResponse completeMultipartUploadResponse =
                client.CompleteMultipartUpload(completeMultipartUploadRequest);

            Console.WriteLine(completeMultipartUploadResponse.ETag);
            Console.ReadKey();
        }