private static string InitiateMultipartUpload(String bucketName, String objectName) { var request = new InitiateMultipartUploadRequest(bucketName, objectName); var result = OssClient.InitiateMultipartUpload(request); return(result.UploadId); }
private InitiateMultipartUploadResult InitiateMultipartUpload(string filePath, string objectKey) { var request = new InitiateMultipartUploadRequest(bucketName, objectKey); var result = client.InitiateMultipartUpload(request); return(result); }
/// <summary> /// 分片断点续传 /// </summary> /// <param name="setting"></param> /// <param name="objectName"></param> /// <param name="binaryData"></param> /// <param name="index">第多少个分片(从1开始)</param> /// <param name="uploadId">如果是第二个分片则必须传入</param> /// <returns></returns> public static PartETag Upload(this OSSSetting setting, string objectName, byte[] binaryData, int index, ref string uploadId) { OssClient client = new OssClient(setting.endpoint, setting.accessKeyId, setting.accessKeySecret); PartETag partETagResult; if (index == 1) { var request = new InitiateMultipartUploadRequest(setting.bucketName, objectName, new ObjectMetadata { ExpirationTime = DateTime.Now.AddDays(1) }); var result = client.InitiateMultipartUpload(request); uploadId = result.UploadId; } using (MemoryStream requestContent = new(binaryData)) { var result = client.UploadPart(new UploadPartRequest(setting.bucketName, objectName, uploadId) { InputStream = requestContent, PartSize = binaryData.Length, PartNumber = index }); partETagResult = result.PartETag; } return(partETagResult); }
/// <summary> /// 上传资源 /// </summary> /// <param name="fileName">文件名称</param> /// <param name="mimeType">文件类型</param> /// <param name="stream"></param> public void Upload(string fileName, string mimeType, Stream stream) { //根据资源大小计算Multipart 2MB为一个Part int num = (int)(stream.Length / 0x200000L); if (num > 0 && (stream.Length % 0x200000L) != 0) { num += 1; } ObjectMetadata metadata = new ObjectMetadata() { ContentType = mimeType }; try { if (num > 1) { InitiateMultipartUploadRequest initiateMultipartUploadRequest = new InitiateMultipartUploadRequest(_bucketName, fileName) { ObjectMetadata = metadata }; InitiateMultipartUploadResult result = _ossClient.InitiateMultipartUpload(initiateMultipartUploadRequest); Console.WriteLine("UploadId:" + result.UploadId); List <PartETag> collection = new List <PartETag>(); for (int i = 0; i < num; i++) { int begin = 0x200000 * i; stream.Seek((long)begin, SeekOrigin.Begin); long end = 0x200000 < (stream.Length - begin) ? 0x200000L : stream.Length - begin; UploadPartRequest uploadPartRequest = new UploadPartRequest(_bucketName, fileName, result.UploadId) { InputStream = stream, PartSize = end, PartNumber = i + 1 }; var partResult = _ossClient.UploadPart(uploadPartRequest); collection.Add(partResult.PartETag); } var completeMultipartUploadRequest = new CompleteMultipartUploadRequest(_bucketName, fileName, result.UploadId); ((List <PartETag>)completeMultipartUploadRequest.PartETags).AddRange(collection); _ossClient.CompleteMultipartUpload(completeMultipartUploadRequest); } else { _ossClient.PutObject(_bucketName, fileName, stream, metadata); } } catch (WebException exception) { throw new Exception("上传失败,请重试", exception); } }
/// <summary> /// 拷贝大文件 /// </summary> /// <param name="client"></param> /// <param name="sourceBucket">源空间</param> /// <param name="sourceKey">源文件</param> /// <param name="optBucket">目标空间</param> /// <param name="optKey">目标文件</param> /// <returns></returns> private CopyFileResultDto CopyBigFile(OssClient client, string sourceBucket, string sourceKey, string optBucket, string optKey) { var initiateMultipartUploadRequest = new InitiateMultipartUploadRequest(optBucket, optKey); var result = client.InitiateMultipartUpload(initiateMultipartUploadRequest); var partSize = Core.Tools.GetPartSize(ChunkUnit.U4096K); var metadata = client.GetObjectMetadata(sourceBucket, sourceKey); var fileSize = metadata.ContentLength; var partCount = (int)fileSize / partSize; if (fileSize % partSize != 0) { partCount++; } // 开始分片拷贝。 var partETags = new List <PartETag>(); for (var i = 0; i < partCount; i++) { var skipBytes = (long)partSize * i; var size = (partSize < fileSize - skipBytes) ? partSize : (fileSize - skipBytes); // 创建UploadPartCopyRequest。可以通过UploadPartCopyRequest指定限定条件。 var uploadPartCopyRequest = new UploadPartCopyRequest(optBucket, optKey, sourceBucket, sourceKey, result.UploadId) { PartSize = size, PartNumber = i + 1, // BeginIndex用来定位此次上传分片开始所对应的位置。 BeginIndex = skipBytes }; // 调用uploadPartCopy方法来拷贝每一个分片。 var uploadPartCopyResult = client.UploadPartCopy(uploadPartCopyRequest); Console.WriteLine("UploadPartCopy : {0}", i); partETags.Add(uploadPartCopyResult.PartETag); } // 完成分片拷贝。 var completeMultipartUploadRequest = new CompleteMultipartUploadRequest(optBucket, optKey, result.UploadId); // partETags为分片上传中保存的partETag的列表,OSS收到用户提交的此列表后,会逐一验证每个数据分片的有效性。全部验证通过后,OSS会将这些分片合成一个完整的文件。 foreach (var partETag in partETags) { completeMultipartUploadRequest.PartETags.Add(partETag); } var ret = client.CompleteMultipartUpload(completeMultipartUploadRequest); if (ret.HttpStatusCode == HttpStatusCode.OK) { return(new CopyFileResultDto(true, sourceKey, "success")); } return(new CopyFileResultDto(false, sourceKey, $"RequestId:{ret.RequestId},HttpStatusCode:{ret.HttpStatusCode}")); }
private static string InitiateMultipartUpload(OssClient client, string bucketName, string objectName) { return(Retry((_) => { var request = new InitiateMultipartUploadRequest(bucketName, objectName); var result = client.InitiateMultipartUpload(request); return result.UploadId; })); }
/// <summary> /// 分片上传 /// </summary> /// <param name="localPath"></param> /// <param name="path"></param> /// <param name="fileSize"></param> /// <returns></returns> private bool uploadMulti(string localPath, string path, long fileSize) { string endPoint = "http://" + m_endPoint; var client = new OssClient(endPoint, m_keyID, m_keySecret); try { var request = new InitiateMultipartUploadRequest(m_bucket, path); var result = client.InitiateMultipartUpload(request); string uploadId = result.UploadId; int partSize = (int)(fileSize / 9990); if (partSize < m_blockSize) { partSize = m_blockSize; } int partCount = (int)(fileSize / partSize); var partETags = new List <PartETag>(); using (var fs = File.Open(localPath, FileMode.Open, FileAccess.Read)) { for (int i = 0; i < partCount; i++) { long skipBytes = partSize * i; fs.Seek(skipBytes, 0); long size = (i < partCount - 1) ? partSize : (fileSize - skipBytes); var req = new UploadPartRequest(m_bucket, path, uploadId) { InputStream = fs, PartSize = size, PartNumber = i + 1 }; var res = client.UploadPart(req); partETags.Add(res.PartETag); } } var completeMultipartUploadRequest = new CompleteMultipartUploadRequest(m_bucket, path, uploadId); foreach (var partETag in partETags) { completeMultipartUploadRequest.PartETags.Add(partETag); } client.CompleteMultipartUpload(completeMultipartUploadRequest); } catch (Exception ex) { Console.WriteLine("分片上传失败:" + ex.Message); return(false); } return(true); }
public void PutObjectMultipart(string bucketName, string key, string fileToUpload) { var partSize = 1000 * 1000; var initRequest = new InitiateMultipartUploadRequest(bucketName, key); var uploadId = ossClient.InitiateMultipartUpload(initRequest); var fi = new FileInfo(fileToUpload); var fileSize = fi.Length; var parCount = fileSize / partSize; if (fileSize % partSize != 0) { parCount++; } var partEtags = new List <PartETag>(); for (var i = 0; i < parCount; i++) { using (var fs = File.Open(fileToUpload, FileMode.Open)) { var skipBytes = (long)partSize * i; fs.Seek(skipBytes, 0); var size = (partSize < fileSize - skipBytes) ? partSize : (fileSize - skipBytes); var uploadPartRequest = new UploadPartRequest(bucketName, key, uploadId.UploadId) { InputStream = fs, PartSize = size, PartNumber = i + 1 }; var upLoadPartRequestResult = ossClient.UploadPart(uploadPartRequest); partEtags.Add(upLoadPartRequestResult.PartETag); } } var completeMultipartUploadRequest = new CompleteMultipartUploadRequest(bucketName, key, uploadId.UploadId); foreach (var partETag in partEtags) { completeMultipartUploadRequest.PartETags.Add(partETag); } var completeResult = ossClient.CompleteMultipartUpload(completeMultipartUploadRequest); }
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); }
public static void UploadToOSS(string fileMD5, string fileExt, Stream fs) { fs.Position = 0; var key = fileMD5 + "." + fileExt; //var uploadFile = fileLocalPath + @"\" + date + @"\" + key; try { bool UploadStatus = false; #region 从本地读取视频文件并上传 var content = fs; //using (var content = File.Open(uploadFile, FileMode.Open)) //{ if (content.Length < 50 * 1024 * 1024) //50M { //Common.WriteLog(string.Format("文件{0}上传开始", key)); var resultS = client.PutObject(bucketName, key, content); UploadStatus = true; //Common.WriteLog(string.Format("文件{0}上传成功,返回信息为{1}", key, resultS.ETag)); } else { //初始化分片上传 //Common.WriteLog(string.Format("文件{0}开始分片上传", key)); var request1 = new InitiateMultipartUploadRequest(bucketName, key); var UploadId = client.InitiateMultipartUpload(request1).UploadId; int partCount = 0; var fileSize = content.Length; int partSize = 10 * 1024 * 1024; partCount = (int)(fileSize / partSize + (fileSize % partSize == 0 ? 0 : 1)); // 开始分片上传 var partETags = new List <PartETag>(); for (var i = 0; i < partCount; i++) { var skipBytes = (long)partSize * i; //定位到本次上传片应该开始的位置 content.Seek(skipBytes, 0); //计算本次上传的片大小,最后一片为剩余的数据大小,其余片都是part size大小。 var size = (partSize < fileSize - skipBytes) ? partSize : (fileSize - skipBytes); var request = new UploadPartRequest(bucketName, key, UploadId) { InputStream = content, PartSize = size, PartNumber = i + 1 }; //调用UploadPart接口执行上传功能,返回结果中包含了这个数据片的ETag值 var result2 = client.UploadPart(request); partETags.Add(result2.PartETag); } //完成分片上传 var completeMultipartUploadRequest = new CompleteMultipartUploadRequest(bucketName, key, UploadId); foreach (var partETag in partETags) { completeMultipartUploadRequest.PartETags.Add(partETag); } var resultEnd = client.CompleteMultipartUpload(completeMultipartUploadRequest); UploadStatus = true; //Common.WriteLog(string.Format("文件{0}分片上传结束", key)); } //} #endregion } catch (Exception ex) { Common.CommonHelp.WriteLOG("阿里云上传问题:" + ex.Message); } }
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 static void MultipartUploadProgress(string bucketName) { const string key = "MultipartUploadProgress"; try { // 初始化分片上传任务 var initRequest = new InitiateMultipartUploadRequest(bucketName, key); var initResult = client.InitiateMultipartUpload(initRequest); // 设置每块为 1M const int partSize = 1024 * 1024 * 1; var partFile = new FileInfo(Config.FileToUpload); // 计算分块数目 var partCount = CalculatePartCount(partFile.Length, partSize); // 新建一个List保存每个分块上传后的ETag和PartNumber var partETags = new List <PartETag>(); //upload the file using (var fs = new FileStream(partFile.FullName, FileMode.Open)) { for (var i = 0; i < partCount; i++) { // 跳到每个分块的开头 long skipBytes = partSize * i; fs.Position = skipBytes; // 计算每个分块的大小 var size = partSize < partFile.Length - skipBytes ? partSize : partFile.Length - skipBytes; // 创建UploadPartRequest,上传分块 var uploadPartRequest = new UploadPartRequest(bucketName, key, initResult.UploadId) { InputStream = fs, PartSize = size, PartNumber = (i + 1) }; var uploadPartResult = client.UploadPart(uploadPartRequest); // 将返回的PartETag保存到List中。 partETags.Add(uploadPartResult.PartETag); } } // 提交上传任务 var metadata = BuildCallbackMetadata(callbackUrl, callbackBody); var completeRequest = new CompleteMultipartUploadRequest(bucketName, key, initResult.UploadId) { Metadata = metadata }; foreach (var partETag in partETags) { completeRequest.PartETags.Add(partETag); } var completeUploadResult = client.CompleteMultipartUpload(completeRequest); var responseContent = GetCallbackResponse(completeUploadResult); Console.WriteLine("Multipart upload object:{0} succeeded, callback response content:{1}", key, responseContent); } 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); } }
public static void UploadBigFile(string accesskey, string secret, string endpoint, string bucketname, string filename) { string objName = Path.GetFileName(filename); // 创建OssClient实例。 var client = new OssClient(endpoint, accesskey, secret); // 初始化分片上传。 var uploadId = ""; try { // 定义上传的文件及所属存储空间的名称。您可以在InitiateMultipartUploadRequest中设置ObjectMeta,但不必指定其中的ContentLength。 var request = new InitiateMultipartUploadRequest(bucketname, objName); var result = client.InitiateMultipartUpload(request); uploadId = result.UploadId; // 打印UploadId。 Console.WriteLine("Upload Id:{0}", result.UploadId); } catch (Exception ex) { Console.WriteLine($"Init multipart upload failed:{ex.Message}"); } // 计算分片总数。 var partSize = 100 * 1024; var fi = new FileInfo(filename); var fileSize = fi.Length; var partCount = fileSize / partSize; if (fileSize % partSize != 0) { partCount++; } // 开始分片上传。PartETags是保存PartETag的列表,OSS收到用户提交的分片列表后,会逐一验证每个分片数据的有效性。当所有的数据分片通过验证后,OSS会将这些分片组合成一个完整的文件。 var partETags = new List <PartETag>(); try { using (var fs = File.Open(filename, FileMode.Open)) { for (var i = 0; i < partCount; i++) { var skipBytes = (long)partSize * i; fs.Seek(skipBytes, 0); var size = (partSize < fileSize - skipBytes) ? partSize : (fileSize - skipBytes); var request = new UploadPartRequest(bucketname, objName, uploadId) { InputStream = fs, PartSize = size, PartNumber = i + 1 }; request.StreamTransferProgress += streamProgressCallback; var result = client.UploadPart(request); partETags.Add(result.PartETag); Console.WriteLine($"finish {partETags.Count}/{partCount}"); } Console.WriteLine("MultipartUpload succeeded"); } } catch (Exception ex) { Console.WriteLine($"MultipartUpload failed:{ex.Message}"); } // 完成分片上传。 try { var completeMultipartUploadRequest = new CompleteMultipartUploadRequest(bucketname, objName, uploadId); foreach (var partETag in partETags) { completeMultipartUploadRequest.PartETags.Add(partETag); } var result = client.CompleteMultipartUpload(completeMultipartUploadRequest); Console.WriteLine("complete Multipart succeeded"); } catch (Exception ex) { Console.WriteLine($"complete Multipart failed, {ex.Message}"); } }
/// <summary> /// 开始上传 /// </summary> /// <param name="task"></param> private void StartUpload(OssTaskDO task) { //开启扫描 this.RefreshTask(); //先上阿里云OSS进行上传初始化 if (task.UploadOssId == null) { var ossPath = CheckOssPath(task.UploadOssPath + @"/" + task.UploadOssName); var request = new InitiateMultipartUploadRequest(aliyunOSSConfig.BucketName, ossPath); var result = client.InitiateMultipartUpload(request); task.UploadOssId = result.UploadId; } //打开文件流 task.Stream = new FileStream(task.UploadPath + @"\" + task.UploadName, FileMode.Open); var fileLength = task.Stream.Length; //存放Etag 读取Tag task.UploadETag = new List <string>(); var fileStream = new FileStream(task.UploadPath + @"\" + task.UploadName + ".upload", FileMode.OpenOrCreate); fileStream.Position = 0; using (var readStream = new StreamReader(fileStream)) { while (true) { var row = readStream.ReadLine(); if (row == null) { break; } var values = row.Split(','); var id = values[0]; var index = task.UploadETag.FindIndex(r => r.Split(',')[0] == id); if (values.Length == 4 && index == -1) { task.UploadETag.Add(row); } else { Console.WriteLine("Read Tag: " + row + ", index:" + index); } } } //隐藏文件 File.SetAttributes(task.UploadPath + @"\" + task.UploadName + ".upload", FileAttributes.Hidden); Console.WriteLine("Tag: " + task.UploadETag.Count); //在相同上传文件目录生成一个隐藏配置文件 fileStream = new FileStream(task.UploadPath + @"\" + task.UploadName + ".upload", FileMode.OpenOrCreate); fileStream.Position = fileStream.Length; task.ConfigStream = new StreamWriter(fileStream); task.ConfigStream.AutoFlush = false; //智能分配碎片 if (task.DebrisSize <= 0) { task.DebrisSize = fileLength % 9999 == 0 ? fileLength / 9999 : fileLength / 9999 + 100; if (task.DebrisSize < task.MinDebrisSize) { task.DebrisSize = task.MinDebrisSize; } } //计算碎片总数和进度 var debrisTotal = fileLength % task.DebrisSize == 0 ? fileLength / task.DebrisSize : fileLength / task.DebrisSize + 1; var debrisProgress = new bool?[debrisTotal]; for (int i = 0; i < debrisProgress.Length; i++) { var s = task.UploadETag.FindIndex(r => r.Split(',')[0] == (i + 1).ToString()); debrisProgress[i] = s >= 0; } task.DebrisProgress = debrisProgress; //总长度 task.Progress = task.DebrisProgress.ToList().Where(r => r == true).ToList().Count *task.DebrisSize; task.TotalProgress = task.Stream.Length; //保存配置 SaveOssTaskConfig(taskList); //开始任务 task.ThreadList = new List <Task>(); task.ThreadTokenList = new List <CancellationTokenSource>(); task.ThreadTokenStatusList = new List <TokenStatus>(); for (int i = 0; i < threadCount; i++) { var token = new CancellationTokenSource(); task.ThreadList.Add(new Task(() => { for (; ;) { try { if (task.ThreadTokenStatusList == null) { return; } var taskStatus = task.ThreadTokenStatusList.Find(it => it.Token == token); if (taskStatus.Status) { return; } if (UploadItem(task) == null) { return; } if (taskStatus.Status) { return; } } catch (Exception ex) { Console.WriteLine(ex.StackTrace); } } }, token.Token)); task.ThreadTokenList.Add(token); task.ThreadTokenStatusList.Add(new TokenStatus() { Token = token, Status = false }); } //等待任务完成结束 Task.WhenAll(task.ThreadList.ToArray()).ContinueWith(s => { UploadComplete(task); }); //开始 task.ThreadList.ForEach(it => it.Start()); }
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(); } }
/// <summary> /// 文件拷贝,默认采用分片拷贝的方式 /// </summary> /// <param name="bucketName"></param> /// <param name="objectName"></param> /// <param name="destBucketName"></param> /// <param name="destObjectName"></param> /// <returns></returns> public async Task <bool> CopyObjectAsync(string bucketName, string objectName, string destBucketName, string destObjectName = null) { if (string.IsNullOrEmpty(bucketName)) { throw new ArgumentNullException(nameof(bucketName)); } if (string.IsNullOrEmpty(objectName)) { throw new ArgumentNullException(nameof(objectName)); } if (string.IsNullOrEmpty(destBucketName)) { destBucketName = bucketName; } if (string.IsNullOrEmpty(destObjectName)) { destObjectName = objectName; } var partSize = 50 * 1024 * 1024; // 创建OssClient实例。 // 初始化拷贝任务。可以通过InitiateMultipartUploadRequest指定目标文件元信息。 var request = new InitiateMultipartUploadRequest(destBucketName, destObjectName); var result = _client.InitiateMultipartUpload(request); // 计算分片数。 var metadata = _client.GetObjectMetadata(bucketName, objectName); var fileSize = metadata.ContentLength; var partCount = (int)fileSize / partSize; if (fileSize % partSize != 0) { partCount++; } // 开始分片拷贝。 var partETags = new List <PartETag>(); for (var i = 0; i < partCount; i++) { var skipBytes = (long)partSize * i; var size = (partSize < fileSize - skipBytes) ? partSize : (fileSize - skipBytes); // 创建UploadPartCopyRequest。可以通过UploadPartCopyRequest指定限定条件。 var uploadPartCopyRequest = new UploadPartCopyRequest(destBucketName, destObjectName, bucketName, objectName, result.UploadId) { PartSize = size, PartNumber = i + 1, // BeginIndex用来定位此次上传分片开始所对应的位置。 BeginIndex = skipBytes }; // 调用uploadPartCopy方法来拷贝每一个分片。 var uploadPartCopyResult = _client.UploadPartCopy(uploadPartCopyRequest); partETags.Add(uploadPartCopyResult.PartETag); } // 完成分片拷贝。 var completeMultipartUploadRequest = new CompleteMultipartUploadRequest(destBucketName, destObjectName, result.UploadId); // partETags为分片上传中保存的partETag的列表,OSS收到用户提交的此列表后,会逐一验证每个数据分片的有效性。全部验证通过后,OSS会将这些分片合成一个完整的文件。 foreach (var partETag in partETags) { completeMultipartUploadRequest.PartETags.Add(partETag); } _client.CompleteMultipartUpload(completeMultipartUploadRequest); return(await Task.FromResult(true)); }