示例#1
0
        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);
        }
示例#3
0
        /// <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);
        }
示例#4
0
        /// <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);
            }
        }
示例#5
0
        /// <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}"));
        }
示例#6
0
 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);
        }
示例#9
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);
        }
示例#10
0
        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);
            }
        }
示例#11
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 + " 上传成功.");
        }
        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);
            }
        }
示例#13
0
        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}");
            }
        }
示例#14
0
        /// <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());
        }
示例#15
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();
            }
        }
        /// <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));
        }