示例#1
0
        /// <summary>
        /// Start a new multi-part upload request
        /// </summary>
        /// <param name="bucketName"></param>
        /// <param name="objectName"></param>
        /// <param name="contentType"></param>
        /// <param name="cancellationToken">Optional cancellation token to cancel the operation</param>
        /// <returns></returns>
        private async Task <string> NewMultipartUploadAsync(string bucketName, string objectName, Dictionary <string, string> metaData, CancellationToken cancellationToken)
        {
            var resource = "?uploads";

            var request = await this.CreateRequest(Method.POST, bucketName, objectName : objectName,
                                                   headerMap : metaData, resourcePath : resource);

            var response = await this.ExecuteTaskAsync(this.NoErrorHandlers, request, cancellationToken);

            var contentBytes = System.Text.Encoding.UTF8.GetBytes(response.Content);
            InitiateMultipartUploadResult newUpload = null;

            using (var stream = new MemoryStream(contentBytes))
                newUpload = (InitiateMultipartUploadResult)(new XmlSerializer(typeof(InitiateMultipartUploadResult)).Deserialize(stream));
            return(newUpload.UploadId);
        }
示例#2
0
        public void TestgetMultiUploadPart()
        {
            if (init())
            {
                string path = @"E:\tool\eclipse.rar";//上传文件路径,例如E:\tool\aa.rar
                InitiateMultipartUploadResult result = TestMultipartInit();
                FileInfo file           = new FileInfo(path);
                int      part           = 5 * 1024 * 1024;
                int      numBytesToRead = (int)file.Length;
                int      i    = 0;
                XElement root = new XElement("CompleteMultipartUpload");//初始化一个xml,以备分块上传完成后调用complete方法提交本次上传的文件以通知服务端合并分块
                //开始读取文件
                using (FileStream fs = new FileStream(path, FileMode.Open))
                {
                    while (numBytesToRead > 0)
                    {
                        UploadPartRequest request = new UploadPartRequest(
                            result.getBucket(), result.getKey(), result.getUploadId(),
                            i + 1);
                        //每次读取5M文件内容,如果最后一次内容不及5M则按实际大小取值
                        int    count = Convert.ToInt32((i * part + part) > file.Length ? file.Length - i * part : part);
                        byte[] data  = new byte[count];
                        int    n     = fs.Read(data, 0, count);
                        request.setInputStream(new MemoryStream(data));

                        PartETag tag = ks3Client.uploadPart(request);//上传本次分块内容
                        Console.WriteLine(tag.ToString());
                        if (n == 0)
                        {
                            break;
                        }
                        numBytesToRead -= n;

                        XElement partE = new XElement("Part");
                        partE.Add(new XElement("PartNumber", i + 1));
                        partE.Add(new XElement("ETag", tag.geteTag()));
                        root.Add(partE);
                        i++;
                    }
                }
                //所有分块上传完成后发起complete request,通知服务端合并分块
                CompleteMultipartUploadRequest completeRequest = new CompleteMultipartUploadRequest(result.getBucket(), result.getKey(), result.getUploadId());
                completeRequest.setContent(new MemoryStream(System.Text.Encoding.Default.GetBytes(root.ToString())));
                CompleteMultipartUploadResult completeResult = ks3Client.completeMultipartUpload(completeRequest);
            }
        }
示例#3
0
        private async Task <bool> FileToParts(Stream stream, InitiateMultipartUploadResult startResponse, int partSize)
        {
            byte[] part       = new byte[partSize];
            int    offset     = 0;
            int    partNumber = 0;

            while (stream.Position != stream.Length)
            {
                var position = await stream.ReadAsync(part, offset, partSize);

                offset     += partSize;
                partNumber += 1;
                await UploadPart(part, partNumber, startResponse.UploadId);

                part = new byte[partSize];
            }

            return(true);
        }
示例#4
0
        private string NewMultipartUpload(string bucket, string key, string contentType)
        {
            var path    = bucket + "/" + UrlEncode(key) + "?uploads";
            var request = new RestRequest(path, Method.POST);

            if (string.IsNullOrWhiteSpace(contentType))
            {
                contentType = "application/octet-stream";
            }
            request.AddHeader("Content-Type", contentType);
            var response = client.Execute(request);

            if (response.StatusCode.Equals(HttpStatusCode.OK))
            {
                var contentBytes = System.Text.Encoding.UTF8.GetBytes(response.Content);
                var stream       = new MemoryStream(contentBytes);
                InitiateMultipartUploadResult newUpload = (InitiateMultipartUploadResult)(new XmlSerializer(typeof(InitiateMultipartUploadResult)).Deserialize(stream));
                return(newUpload.UploadId);
            }
            throw ParseError(response);
        }
示例#5
0
        /// <summary>
        /// Start a new multi-part upload request
        /// </summary>
        /// <param name="bucketName"></param>
        /// <param name="objectName"></param>
        /// <param name="contentType"></param>
        /// <param name="cancellationToken">Optional cancellation token to cancel the operation</param>
        /// <returns></returns>
        private async Task <string> NewMultipartUploadAsync(string bucketName, string objectName, string contentType, CancellationToken cancellationToken)
        {
            var resource = "?uploads";

            if (string.IsNullOrWhiteSpace(contentType))
            {
                contentType = "application/octet-stream";
            }

            var request = await this.CreateRequest(Method.POST, bucketName, objectName : objectName,
                                                   contentType : contentType, resourcePath : resource);

            var response = await this.ExecuteTaskAsync(this.NoErrorHandlers, request, cancellationToken);

            var contentBytes = System.Text.Encoding.UTF8.GetBytes(response.Content);
            InitiateMultipartUploadResult newUpload = null;

            using (var stream = new MemoryStream(contentBytes))
                newUpload = (InitiateMultipartUploadResult)(new XmlSerializer(typeof(InitiateMultipartUploadResult)).Deserialize(stream));
            return(newUpload.UploadId);
        }
示例#6
0
        public void MarshalResponse(InitiateMultipartUploadRequest request, InitiateMultipartUploadResponse response, IDictionary <string, string> headers, Stream responseStream)
        {
            response.AbortDate            = headers.GetHeaderDate(AmzHeaders.XAmzAbortDate, DateTimeFormat.Iso8601DateTimeExt);
            response.AbortRuleId          = headers.GetHeader(AmzHeaders.XAmzAbortDate);
            response.SseAlgorithm         = headers.GetHeaderEnum <SseAlgorithm>(AmzHeaders.XAmzSSE);
            response.SseKmsKeyId          = headers.GetHeader(AmzHeaders.XAmzSSEAwsKmsKeyId);
            response.SseCustomerAlgorithm = headers.GetHeaderEnum <SseCustomerAlgorithm>(AmzHeaders.XAmzSSECustomerAlgorithm);
            response.SseCustomerKeyMd5    = headers.GetHeaderByteArray(AmzHeaders.XAmzSSECustomerKeyMD5, BinaryEncoding.Base64);

            XmlSerializer xmlSerializer = new XmlSerializer(typeof(InitiateMultipartUploadResult));

            using (XmlTextReader xmlReader = new XmlTextReader(responseStream))
            {
                xmlReader.Namespaces = false;

                InitiateMultipartUploadResult resp = (InitiateMultipartUploadResult)xmlSerializer.Deserialize(xmlReader);
                response.Bucket   = resp.Bucket;
                response.Key      = resp.Key;
                response.UploadId = resp.UploadId;
            }
        }
        public void MarshalResponse(IConfig config, CreateMultipartUploadResponse response, IDictionary <string, string> headers, Stream responseStream)
        {
            response.AbortsOn             = headers.GetHeaderDate(AmzHeaders.XAmzAbortDate, DateTimeFormat.Rfc1123);
            response.AbortRuleId          = headers.GetHeader(AmzHeaders.XAmzAbortRuleId);
            response.SseAlgorithm         = headers.GetHeaderEnum <SseAlgorithm>(AmzHeaders.XAmzSse);
            response.SseKmsKeyId          = headers.GetHeader(AmzHeaders.XAmzSseAwsKmsKeyId);
            response.SseCustomerAlgorithm = headers.GetHeaderEnum <SseCustomerAlgorithm>(AmzHeaders.XAmzSseCustomerAlgorithm);
            response.SseCustomerKeyMd5    = headers.GetHeaderByteArray(AmzHeaders.XAmzSseCustomerKeyMd5, BinaryEncoding.Base64);
            response.SseContext           = headers.GetHeader(AmzHeaders.XAmzSseContext);
            response.RequestCharged       = headers.ContainsKey(AmzHeaders.XAmzRequestCharged);

            XmlSerializer xmlSerializer = new XmlSerializer(typeof(InitiateMultipartUploadResult));

            using (XmlTextReader xmlReader = new XmlTextReader(responseStream))
            {
                xmlReader.Namespaces = false;

                InitiateMultipartUploadResult resp = (InitiateMultipartUploadResult)xmlSerializer.Deserialize(xmlReader);
                response.Bucket    = resp.Bucket;
                response.ObjectKey = resp.Key;
                response.UploadId  = resp.UploadId;
            }
        }
示例#8
0
        public void mutiPartUpload(OssClient ossClient_0, string string_0, string string_1, string string_2, int int_0)
        {
            InitiateMultipartUploadRequest initiateMultipartUploadRequest = new InitiateMultipartUploadRequest(string_2, string_1);
            InitiateMultipartUploadResult  initiateMultipartUploadResult  = ossClient_0.InitiateMultipartUpload(initiateMultipartUploadRequest);
            int      num      = 1024 * int_0;
            FileInfo fileInfo = new FileInfo(string_0);
            int      num2     = (int)(fileInfo.Length / (long)num);

            if (fileInfo.Length % (long)num != 0L)
            {
                num2++;
            }
            List <PartETag> list = new List <PartETag>();

            for (int i = 0; i < num2; i++)
            {
                FileStream fileStream = new FileStream(fileInfo.FullName, FileMode.Open);
                long       num3       = (long)(num * i);
                fileStream.Position = num3;
                long             value            = ((long)num < fileInfo.Length - num3) ? ((long)num) : (fileInfo.Length - num3);
                UploadPartResult uploadPartResult = ossClient_0.UploadPart(new UploadPartRequest(string_2, string_1, initiateMultipartUploadResult.UploadId)
                {
                    InputStream = fileStream,
                    PartSize    = new long?(value),
                    PartNumber  = new int?(i + 1)
                });
                list.Add(uploadPartResult.PartETag);
                fileStream.Close();
            }
            CompleteMultipartUploadRequest completeMultipartUploadRequest = new CompleteMultipartUploadRequest(string_2, string_1, initiateMultipartUploadResult.UploadId);

            foreach (PartETag item in list)
            {
                completeMultipartUploadRequest.PartETags.Add(item);
            }
            ossClient_0.CompleteMultipartUpload(completeMultipartUploadRequest);
        }
        internal override void Execute()
        {
            FileInfo   fileInfo   = new FileInfo(filePath);
            FileStream fileStream = File.OpenRead(filePath);
            string     uploadId   = null;

            try
            {
                this.currentUploadProgressArgs = new StreamTransferProgressArgs(0, 0, fileInfo.Length);

                long partSize = CalculatePartSize(fileInfo.Length);
                InitiateMultipartUploadRequest initiateRequest = new InitiateMultipartUploadRequest
                {
                    AccountId          = this.options.AccountId,
                    ArchiveDescription = archiveDescription,
                    VaultName          = vaultName,
                    PartSize           = partSize
                };
                initiateRequest.BeforeRequestEvent += new UserAgentPostFix("MultiUpload").UserAgentRequestEventHandlerSync;
                InitiateMultipartUploadResult initiateResult = this.manager.GlacierClient.InitiateMultipartUpload(initiateRequest).InitiateMultipartUploadResult;


                uploadId = initiateResult.UploadId;

                List <string> partTreeHashs   = new List <string>();
                long          currentPosition = 0;
                while (currentPosition < fileInfo.Length)
                {
                    long length = partSize;
                    if (currentPosition + partSize > fileInfo.Length)
                    {
                        length = fileInfo.Length - currentPosition;
                    }

                    PartStreamWrapper partStream = new PartStreamWrapper(fileStream, length);

                    string checksum = TreeHashGenerator.CalculateTreeHash(partStream);
                    partTreeHashs.Add(checksum);

                    UploadMultipartPartRequest uploadRequest = new UploadMultipartPartRequest
                    {
                        AccountId = this.options.AccountId,
                        Checksum  = checksum,
                        Body      = partStream,
                        Range     = ("bytes " + currentPosition + "-" + (currentPosition + length - 1) + "/*"),
                        UploadId  = uploadId,
                        VaultName = vaultName
                    };
                    uploadRequest.StreamTransferProgress += this.ProgressCallback;
                    uploadRequest.BeforeRequestEvent     += new UserAgentPostFix("MultiUpload").UserAgentRequestEventHandlerSync;

                    this.manager.GlacierClient.UploadMultipartPart(uploadRequest);
                    currentPosition += partSize;
                }

                string totalFileChecksum = TreeHashGenerator.CalculateTreeHash(partTreeHashs);
                string archiveSize       = fileInfo.Length.ToString();
                CompleteMultipartUploadRequest compRequest = new CompleteMultipartUploadRequest
                {
                    AccountId   = this.options.AccountId,
                    ArchiveSize = archiveSize,
                    VaultName   = vaultName,
                    Checksum    = totalFileChecksum,
                    UploadId    = uploadId
                };
                compRequest.BeforeRequestEvent += new UserAgentPostFix("MultiUpload").UserAgentRequestEventHandlerSync;
                CompleteMultipartUploadResult completeMultipartUploadResult = this.manager.GlacierClient.CompleteMultipartUpload(compRequest).CompleteMultipartUploadResult;

                string archiveId = completeMultipartUploadResult.ArchiveId;
                this.UploadResult = new UploadResult(archiveId, totalFileChecksum);
            }
            catch (Exception)
            {
                // If we got an unrecoverable then abort the upload.
                if (!string.IsNullOrEmpty(uploadId))
                {
                    AbortMultipartUploadRequest abortRequest = new AbortMultipartUploadRequest()
                    {
                        AccountId = this.options.AccountId,
                        VaultName = this.vaultName,
                        UploadId  = uploadId
                    };
                    abortRequest.BeforeRequestEvent += new UserAgentPostFix("MultiUpload").UserAgentRequestEventHandlerSync;
                    this.manager.GlacierClient.AbortMultipartUpload(abortRequest);
                }

                throw;
            }
            finally
            {
                try { fileStream.Close(); }
                catch (Exception) { }
            }
        }
示例#10
0
        public void MutiPartUpload(string fileName, string key)
        {
            Console.WriteLine("开始上传:" + key);
            InitiateMultipartUploadRequest initRequest =
                new InitiateMultipartUploadRequest(ossConfig.BucketName, key);
            InitiateMultipartUploadResult initResult = ossClient.InitiateMultipartUpload(initRequest);


            // 设置每块为 5M
            int partSize = 1024 * 1024 * 5;

            FileInfo partFile = new FileInfo(fileName);

            // 计算分块数目
            int partCount = (int)(partFile.Length / partSize);

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

            for (int i = 0; i < partCount; i++)
            {
                // 获取文件流
                FileStream fis = new FileStream(partFile.FullName, FileMode.Open);

                // 跳到每个分块的开头
                long skipBytes = partSize * i;
                fis.Position = skipBytes;
                //fis.skip(skipBytes);

                // 计算每个分块的大小
                long size = partSize < partFile.Length - skipBytes ?
                            partSize : partFile.Length - skipBytes;

                // 创建UploadPartRequest,上传分块
                UploadPartRequest uploadPartRequest = new UploadPartRequest(ossConfig.BucketName, key, initResult.UploadId);
                uploadPartRequest.InputStream = fis;
                uploadPartRequest.PartSize    = size;
                uploadPartRequest.PartNumber  = (i + 1);
                UploadPartResult uploadPartResult = ossClient.UploadPart(uploadPartRequest);

                // 将返回的PartETag保存到List中。
                partETags.Add(uploadPartResult.PartETag);

                // 关闭文件
                fis.Close();
                Console.WriteLine("第{0}块,上传完毕", i + 1);
            }

            CompleteMultipartUploadRequest completeReq = new CompleteMultipartUploadRequest(ossConfig.BucketName, key, initResult.UploadId);

            foreach (PartETag partETag in partETags)
            {
                completeReq.PartETags.Add(partETag);
            }
            //  红色标注的是与JAVA的SDK有区别的地方

            //完成分块上传
            Console.WriteLine("合并数据块开始");
            CompleteMultipartUploadResult completeResult = ossClient.CompleteMultipartUpload(completeReq);

            Console.WriteLine("合并数据块结束");
            // 返回最终文件的MD5,用于用户进行校验

            Console.WriteLine(key + " 上传成功.");
        }
示例#11
0
        public void mutiPartUpload()
        {
            for (; ;)
            {
                getListItemName();

                if (string.IsNullOrEmpty(path))
                {
                    break;
                }

                key = Guid.NewGuid().ToString() + path.Substring(path.LastIndexOf('.'));

                OssClient ossClient = new OssClient(endPoint, accessKeyID, accessKeySecret);

                InitiateMultipartUploadRequest initRequest =
                    new InitiateMultipartUploadRequest(bucketName, key);
                InitiateMultipartUploadResult initResult = ossClient.InitiateMultipartUpload(initRequest);


                // 设置每块为 5M ,不允许小于5M
                int partSize = 1024 * 100;

                FileInfo partFile = new FileInfo(path);

                // 计算分块数目
                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++)
                {
                    Bar.Value = (i * 100) / partCount;
                    UploadInfo(Bar.Value.ToString());

                    // 获取文件流
                    FileStream fis = new FileStream(partFile.FullName, FileMode.Open);

                    // 跳到每个分块的开头
                    long skipBytes = partSize * i;
                    fis.Position = skipBytes;
                    //fis.skip(skipBytes);

                    // 计算每个分块的大小
                    long size = partSize < partFile.Length - skipBytes ?
                                partSize : partFile.Length - skipBytes;

                    // 创建UploadPartRequest,上传分块
                    UploadPartRequest uploadPartRequest = new UploadPartRequest(bucketName, key, initResult.UploadId);
                    uploadPartRequest.InputStream = fis;
                    uploadPartRequest.PartSize    = size;
                    uploadPartRequest.PartNumber  = (i + 1);
                    UploadPartResult uploadPartResult = ossClient.UploadPart(uploadPartRequest);

                    // 将返回的PartETag保存到List中。
                    partETags.Add(uploadPartResult.PartETag);

                    // 关闭文件
                    fis.Close();

                    manualReset.WaitOne();//如果ManualResetEvent的初始化为终止状态(true),那么该方法将一直工作,直到收到Reset信号。然后,直到收到Set信号,就继续工作。
                }

                CompleteMultipartUploadRequest completeReq = new CompleteMultipartUploadRequest(bucketName, key, initResult.UploadId);
                foreach (PartETag partETag in partETags)
                {
                    completeReq.PartETags.Add(partETag);
                }
                //  红色标注的是与JAVA的SDK有区别的地方

                //完成分块上传
                CompleteMultipartUploadResult completeResult = ossClient.CompleteMultipartUpload(completeReq);

                Bar.Value = 100;
                UploadInfo(Bar.Value.ToString());

                // 返回最终文件的MD5,用于用户进行校验
                //Console.WriteLine(completeResult.ETag);

                setListItemValue();
            }
        }