/// <summary> /// 分块的方式上传到COS,默认大小10MB /// <para>每个分块大小为1MB - 5GB</para> /// </summary> /// <param name="content">要上传的字节数据</param> /// <param name="objectName">Object 的名称,可包含路径,也可不包含路径</param> /// <param name="bucket">存储桶</param> /// <param name="region">区域</param> /// <param name="path">路径</param> /// <param name="headers">其他请求头部参数</param> /// <returns></returns> public async Task <(bool success, string uri)> MultipartUploadAsnyc(byte[] content, string objectName, string bucket, string region, string path = "", Dictionary <string, string> headers = null) { objectName.ThrowIfNull(nameof(objectName)); bucket.ThrowIfNull(nameof(bucket)); region.ThrowIfNull(nameof(region)); var init = await MultipartUploadInit(objectName, bucket, region, path, headers); if (init.Key.IsValuable() && init.UploadID.IsValuable())//分块上传初始化成功 { int blockSize = BlockSize * 1024 * 1024; var complete = new TencentCosMUComplete(); long position = 0; int index = 0; bool flag = true;//上传正常标志 while (content.Length > position && flag) { long bufferSize = (content.Length - position) > blockSize ? blockSize : content.Length - position; byte[] buffer = new byte[bufferSize]; Array.Copy(content, position, buffer, 0, bufferSize); position += bufferSize; var result = await MultipartUpload(BaseUri(bucket, region).Append($"{init.Key.ToEscape()}?partNumber={++index}&uploadId={init.UploadID}"), buffer, headers); if (result.success) { complete.Part.Add(new Part { PartNumber = index, ETag = result.etag }); } else { flag = false; await MultipartUploadAbort(init.Key, init.UploadID, bucket, region, headers); return(flag, string.Empty); } } if (complete.Part.Count == index) { var result = await MultipartUploadComplete(init.Key, init.UploadID, bucket, region, complete, headers); return(true, result.Location); } } return(false, string.Empty); }
/// <summary> /// 分块上传已完成请求 /// </summary> /// <param name="key">Object 的名称,包含路径</param> /// <param name="uploadID">上传中使用的ID</param> /// <param name="data">提交的分块信息数据</param> /// <param name="headers">其他请求头部参数</param> /// <returns></returns> public async Task <TencentCosMUCompleteResult> MultipartUploadComplete(string key, string uploadID, TencentCosMUComplete data, Dictionary <string, string> headers = null) => await MultipartUploadComplete(key, uploadID, Bucket, Region, data, headers);
/// <summary> /// 分块上传已完成请求 /// </summary> /// <param name="key">Object 的名称,包含路径</param> /// <param name="uploadID">上传中使用的ID</param> /// <param name="bucket">存储桶</param> /// <param name="region">区域</param> /// <param name="data">提交的分块信息数据</param> /// <param name="headers">其他请求头部参数</param> /// <returns></returns> public async Task <TencentCosMUCompleteResult> MultipartUploadComplete(string key, string uploadID, string bucket, string region, TencentCosMUComplete data, Dictionary <string, string> headers = null) { var uri = BaseUri(bucket, region).Append($"{key.ToEscape()}?uploadId={uploadID}"); var req = new HttpRequestMessage(HttpMethod.Post, uri) { Content = new StringContent(data.ToXml(true, true)) }; using var resp = await SendAsync(req, headers); if (!resp.IsSuccessStatusCode) { ThrowFailure(HttpMethod.Post, resp.StatusCode, await resp.Content.ReadAsStringAsync()); } using Stream sr = await resp.Content.ReadAsStreamAsync(); return(sr.ToObject <TencentCosMUCompleteResult>()); }