ObjectMetadata metadata = new ObjectMetadata(); 
                metadata.ContentType = "application/file"; 
                ClientConfiguration config = new ClientConfiguration(); 
                config.ConnectionTimeout = -1;  
                OssClient ossClient = new OssClient(new Uri("http://oss.aliyuncs.com"), AccessID, AccessKey, config); 
 
                //单文件上传 
                //fs = File.Open(FileToUpload, FileMode.Open); 
                //PutObjectResult Result = ossClient.PutObject(Bucket, Key, fs, metadata); 
 
                InitiateMultipartUploadRequest initRequest = new InitiateMultipartUploadRequest(Bucket, Key); 
                InitiateMultipartUploadResult initResult = ossClient.InitiateMultipartUpload(initRequest); 
 
                // 设置每块大小  
                int partSize = 1024 * 1024 * 3; 
 
                FileInfo partFile = new FileInfo(FileToUpload); 
                FileSize = partFile.Length; 
 
                // 计算分块数目  
                int partCount = (int)(partFile.Length / partSize); 
                if (partFile.Length % partSize != 0) 
                { 
                    partCount++; 
                } 
 
                for (int i = 0; i < partCount; i++) 
                { 
                    // 获取文件流  
                    FileStream fis = new FileStream(partFile.FullName, FileMode.Open,FileAccess.Read); 
                     
                    // 跳到每个分块的开头  
                    long skipBytes = partSize * i; 
                    fis.Position = skipBytes; 
 
                    // 计算每个分块的大小  
                    long size = partSize < partFile.Length - skipBytes ? 
                            partSize : partFile.Length - skipBytes; 
 
                    // 创建UploadPartRequest,上传分块  
                    UploadPartRequest uploadPartRequest = new UploadPartRequest(Bucket, Key, initResult.UploadId); 
                    uploadPartRequest.InputStream = fis;  
                    uploadPartRequest.PartSize = size; 
                    uploadPartRequest.PartNumber = (i + 1); 
 
                    BackgroundWorker bw = new BackgroundWorker(); 
                    bw.WorkerReportsProgress = true; 
                    bw.DoWork += new DoWorkEventHandler(bw_DoWork); 
                    bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted); 
                    bw.RunWorkerAsync(new object[] { ossClient, uploadPartRequest, partCount, fis, i + 1 }); 
                    Thread.Sleep(500); 
 
        //线程工作 
        void bw_DoWork(object sender, DoWorkEventArgs e) 
        { 
            object[] args = e.Argument as object[]; 
            OssClient ossClient = args[0] as OssClient; 
            UploadPartRequest uploadPartRequest = args[1] as UploadPartRequest; 
            int partCount = int.Parse(args[2].ToString()); 
            FileStream fis = args[3] as FileStream;  
            int partNumber = int.Parse(args[4].ToString()); 
 
            long startPosition = fis.Position; 
            //实例化watcher对象,用于监视进度、速度、剩余时间,并加入列表 
            UploadWatcherwatcher = new UploadWatcher() { partNumber = partNumber, startPosition =startPosition, uploadPosition=startPosition, fis = fis }; 
            itemList.Add(watcher); 
 
            UploadPartResult uploadPartResult = ossClient.UploadPart(uploadPartRequest);   
            partETags.Add(uploadPartResult.PartETag); 
            threadDoneCount += 1; 
            e.Result = new object[] { ossClient, uploadPartRequest.UploadId, partCount }; 
            UploadSize += ((long)uploadPartRequest.PartSize); 
        } 
 
 
        //线程完成 
        void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
        { 
            object[] args = e.Result as object[]; 
            OssClient ossClient = args[0] as OssClient; 
            string UploadId = args[1] as string; 
            int partCount = int.Parse(args[2].ToString()); 
            //当最后一个线程执行完毕时,进行分块文件的合并 
            if (threadDoneCount == partCount) 
            { 
                CompleteMultipartUploadRequest completeReq = new CompleteMultipartUploadRequest(Bucket, Key, UploadId); 
                //对分块上传的返回信息按PartNumber排序,因为合并时要求必须是升序 
                var query = from q in partETags 
                            orderby q.PartNumber ascending 
                            select q; 
                List<PartETag> sortedPartETags = query.ToList<PartETag>(); 
                foreach (PartETag partETag in sortedPartETags) 
                { 
                    completeReq.PartETags.Add(partETag); 
                } 
                CompleteMultipartUploadResult completeResult = ossClient.CompleteMultipartUpload(completeReq); 
                UploadFilish = true; 
                UploadOK = true; 
                State = UploadState.done; 
            } 
        }
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
-------------------------