开发者社区> 问答> 正文

【OSS .net多线程上传代码】

                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;
            }
        }

展开
收起
千鸟 2014-07-24 09:51:46 10539 0
3 条回答
写回答
取消 提交回答
  • 回2楼千鸟的帖子
    请教下,.NET代码怎么写判断是否上传成功?详细的不知道怎么写。那个MD5什么的。
    2014-12-17 17:15:00
    赞同 展开评论 打赏
  • LT是个伪程序员
    回 1楼(edison_du) 的帖子
    代码不是我写的,仅仅分享一下而已,应该有很多人需要用的。

    -------------------------

    回 3楼(ttww) 的帖子
    你是指大文件上传还是一般上传?你试试如下代码,我现在主要是try,catch。
                            try
                            {
                                PutObjectResult Result = ossClient.PutObject(bucketName, filename, fs, metadata);
                                result = string.Format("{0}/{1}",ossurl, filename);
                            }
                            catch(OssException ex)
                        {
                            result = string.Format("上传失败。错误代码:{0}; 错误消息:{1}。\nRequestID:{2}\tHostID:{3}",
                                                                ex.ErrorCode,
                                                                ex.Message,
                                                                ex.RequestId,
                                                                ex.HostId);
                        }
    2014-07-24 09:57:40
    赞同 展开评论 打赏
  • 牛逼千鸟
    2014-07-24 09:54:17
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
OSS运维进阶实战手册 立即下载
《OSS运维基础实战手册》 立即下载
OSS运维基础实战手册 立即下载