阿里雲OSS Multipart Upload上傳實例


原來是用的PutObject()方式上傳文件的,但是當文件比較大的時候,總是報一個對方強制關閉連接導致上傳失敗。PS:公司的網比較渣,10MB的文件都傳不上去,搜了下,說使用Multipart Upload方式上傳比較好,經過一番折騰,終於搞定了。

使用的是Upload Part Copy拷貝上傳上傳的方式。

官方文檔:http://docs.aliyun.com/?spm=5176.383663.9.6.tg4Xaf#/pub/oss/sdk/dotnet-sdk&multipart-upload

        /// <summary>
        /// 將文件保存到阿里雲oss
        /// </summary>
        /// <param name="httpPostedFile">要保存的文件</param>
        /// <param name="path">保存的文件路徑</param>
        /// <returns>上傳文件的路徑</returns>
        public string SaveFile(HttpPostedFile httpPostedFile, string path)
        {
            //http://docs.aliyun.com/?spm=5176.383663.9.6.tg4Xaf#/pub/oss/sdk/dotnet-sdk&multipart-upload
            string fileExt = Path.GetExtension(httpPostedFile.FileName);
            string fileName = Path.Combine(path, Common.GetRamCode() + fileExt);

            OssClient client = ALOssClient.GetInstance();

            var bucketName = "wlx-zhibo";
            var objectName = fileName;
            // 開始Multipart Upload
            var request = new InitiateMultipartUploadRequest(bucketName, fileName);
            var r = client.InitiateMultipartUpload(request);
            // 打印UploadId
            Console.WriteLine(r.UploadId);


            var partSize = 102400;
            var fileSize = httpPostedFile.ContentLength;
            var partCount = fileSize / partSize;
            if (fileSize % partSize != 0)
            {
                partCount++;
            }

            var partETags = new List<PartETag>();
            using (var inputStream = httpPostedFile.InputStream)
            {
                for (var i = 0; i < partCount; i++)
                {
                    var skipBytes = (long)partSize * i;
                    inputStream.Seek(skipBytes, 0);
                    var size = (partSize < fileSize - skipBytes) ? partSize : (fileSize - skipBytes);
                    var req = new UploadPartRequest(bucketName, objectName, r.UploadId)
                    {
                        InputStream = inputStream,
                        PartSize = size,
                        PartNumber = i + 1
                    };
                    var uploadPart = client.UploadPart(req);
                    partETags.Add(uploadPart.PartETag);
                }
            }
            var completeMultipartUploadRequest = new CompleteMultipartUploadRequest(bucketName, objectName, r.UploadId);
            foreach (var partETag in partETags)
            {
                completeMultipartUploadRequest.PartETags.Add(partETag);
            }
            var result = client.CompleteMultipartUpload(completeMultipartUploadRequest);
            return result.Location;
        }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM