/// <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); }
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); } }
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); }
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); }
/// <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); }
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; } }
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) { } } }
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 + " 上传成功."); }
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(); } }