Esempio n. 1
0
        /// <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);
        }
Esempio n. 2
0
 /// <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);
Esempio n. 3
0
        /// <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>());
        }