开发者社区> 问答> 正文

利用.NET SDK大文件上传代码

分享一下,过段时间再做一个详细的文档跟大家分享,OSS是个好东西,自己做自己的云存储比用其他的云存储服务安全多了。
不废话了,代码如下:


        public static void mutiPartUpload()
        {

            OssClient ossClient = new OssClient(endPoint, accessKeyID, accessKeySecret);

            InitiateMultipartUploadRequest initRequest =
                            new InitiateMultipartUploadRequest(bucketName, key);
            InitiateMultipartUploadResult initResult = ossClient.InitiateMultipartUpload(initRequest);


            // 设置每块为 5M
            int partSize = 1024 * 1024 * 5;

            FileInfo partFile = new FileInfo("D:/Big.zip");

            // 计算分块数目
            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++)
            {
                // 获取文件流
                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, "upload_file.pdf", 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();
            }

           CompleteMultipartUploadRequest completeReq = new CompleteMultipartUploadRequest(bucketName, key, initResult.UploadId);
            foreach (PartETag partETag in partETags)
            {
                completeReq.PartETags.Add(partETag);
            }
           //  红色标注的是与JAVA的SDK有区别的地方

            //完成分块上传
            CompleteMultipartUploadResult completeResult = ossClient.CompleteMultipartUpload(completeReq);
            // 返回最终文件的MD5,用于用户进行校验
            Console.WriteLine(completeResult.ETag);

        }

展开
收起
千鸟 2014-07-11 09:31:10 14383 0
10 条回答
写回答
取消 提交回答
  • Re利用.NET SDK大文件上传代码
    大文件指的是超过2G的就不行,网页会提示连接被重置。
    2016-09-28 09:37:31
    赞同 展开评论 打赏
  • 回 16楼心飞翔的帖子
    目前最新的C# sdk里面已经对大文件坐了封装,直接调用resumableUpload。

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

    回 16楼心飞翔的帖子
    可能是你md5计算的有问题。你试试https://github.com/aliyun/aliyun-oss-csharp-sdk/blob/3656ef42417bd8de30484f558f06f1fd6e8b6f36/sdk/Util/OssUtils.cs 这个里面的ComputeContentMd5。
    2016-01-28 09:49:49
    赞同 展开评论 打赏
  • Re利用.NET SDK大文件上传代码
    @千鸟
    按照您提供的方法,文件分块上传,我已经获取到了ETags:

    foreach (PartETag partETag in partETags)
                    {
                        completeReq.PartETags.Add(partETag);
                    }
                    //  红色标注的是与JAVA的SDK有区别的地方

                    //完成分块上传
                    CompleteMultipartUploadResult completeResult = ossClient.CompleteMultipartUpload(completeReq);
                    // 返回最终文件下载地址
                    var downloadurl = completeResult.Location.ToString();
                    //返回最终文件的MD5,用于用户进行校验
                    this.Etag = completeResult.ETag;

    那么问题来了,我通过自己的方法取的文件MD5值,和这个OSS最后的结果不一致,该怎么破?

    private string GetMd5(string fileName)
            {
                using (FileStream file = new FileStream(fileName, FileMode.Open))
                {
                    System.Security.Cryptography.MD5 md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
                    byte[] retVal = md5.ComputeHash(file);
                    file.Close();
                    StringBuilder sb = new StringBuilder();
                    for (int i = 0; i < retVal.Length; i++)
                    {
                        sb.Append(i.ToString("X2"));
                    }
                    
                    return sb.ToString();
                }
            }

    2016-01-24 18:13:30
    赞同 展开评论 打赏
  • Re利用.NETSDK大文件上传代码
    想问一下,.net上传到云上单个文件大小有多大的限制哈

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

    Re利用.NETSDK大文件上传代码
    你好,问一下每段限制是多少啊?我现在测试500M附件上传速度要十几分钟啊,有什么好的办法提速么?

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

    Re利用.NETSDK大文件上传代码
    默认已经占用了最大的上行速度了哈,即使开启多个线程上传速度应该还是一样吧?
    2015-04-14 16:37:43
    赞同 展开评论 打赏
  • Re利用.NETSDK大文件上传代码
    多谢大侠,正需要
    2015-04-11 23:12:20
    赞同 展开评论 打赏
  • Re利用.NETSDK大文件上传代码
    对.NET SDK的封装质量表示强烈怀疑。
    2015-01-14 14:26:09
    赞同 展开评论 打赏
  • Re利用.NETSDK大文件上传代码
    我想问下楼主  为什么我每次使用都是 在这句报错
    InitiateMultipartUploadResult initResult = ossClient.InitiateMultipartUpload(initRequest);  
      连接超时
    2014-11-03 13:38:52
    赞同 展开评论 打赏
  • LT是个伪程序员
    回 2楼(edison_du) 的帖子
    谢谢,其实我之前一直也在SDK上有问题,特别是用java的来套c#的代码,免得大家像我一样浪费太多时间。

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

    回 4楼(lw2016) 的帖子
    你先试试小文件上传,把环境搭好,比如说是否导入所需的dll,bucket是否设置可写入等等,至于连接超时,有可能是网络问题,比如你的bucket是否设置了域名绑定,或者bucket的地址有误等等。

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

    回 6楼(极光_t) 的帖子
    ??用着挺好的啊!

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

    回 9楼(li年少轻狂) 的帖子
    按照阿里云的说明,没有限制,只是每个分块有限制,我试了上传上百M的没问题,只是时间问题,上G的文件还没有试过

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

    回 11楼(li年少轻狂) 的帖子
    我记得每个分块应该限制是不超过8M。可以试试多线程分块上次的,这样只需要维护每个分块上传后返回的PartETag值即可,最后合并的时候需要按顺序合并才行。

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

    回 13楼(li年少轻狂) 的帖子
    那就只能等着了,500M的大小,上传十几分钟应该还算好吧

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

    回 13楼(li年少轻狂) 的帖子
    大文件上传的步骤是:分块上传-〉获取分块上传的碎片id-〉构造碎片合并请求。

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

    回 16楼(心飞翔) 的帖子
    啊~~~相同文件怎么还会出现MD5不一致的情况!!!
    2014-07-11 22:09:00
    赞同 展开评论 打赏
  • 千鸟,膜拜
    2014-07-11 09:59:29
    赞同 展开评论 打赏
  • 雷锋啊,有需要的速来围观千鸟的无私分享
    2014-07-11 09:42:45
    赞同 展开评论 打赏
滑动查看更多
问答排行榜
最热
最新

相关电子书

更多
从 SDK 到编解码:视频直播架构解析 立即下载
跨平台的云服务SDK需要什么 立即下载
一个跨平台的云服务SDK需要什么 立即下载