C#-阿里云OSSAPI

 

Nuget导入包

 

 

 

 

 

共用类

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using Aliyun.OSS;
using Aliyun.OSS.Common;

namespace OSSApi
{
    class OSS_Helper
    {

        const string accessKeyId = "xxx";
        const string accessKeySecret = "xxx";
        const string endpoint = "http://oss-cn-shanghai.aliyuncs.com";
        const string bucketName = "xxx";
        OssClient client = null;


        public OSS_Helper()
        {
            // 由用户指定的OSS访问地址、阿里云颁发的AccessKeyId/AccessKeySecret构造一个新的OssClient实例。
             client = new OssClient(endpoint, accessKeyId, accessKeySecret);
        }

        /*简单上传:文件最大不能超过5GB。
          追加上传:文件最大不能超过5GB。
          断点续传上传:支持并发、断点续传、自定义分片大小。大文件上传推荐使用断点续传。最大不能超过48.8TB。
          分片上传:当文件较大时,可以使用分片上传,最大不能超过48.8TB。*/

        /// <summary>
        /// 
        /// </summary>
        /// <param name="objectName"></param>
        /// <param name="localFilename"></param>
        public void Simple_Up(string objectName,string localFilename)
        {
            
            //var objectName = "Project/222.jpg";
            //var localFilename = @"C:\tiger.jpg";
            // 创建OssClient实例。
            try
            {
                // 上传文件。
                client.PutObject(bucketName, objectName, localFilename);
                Console.WriteLine("Put object succeeded");
            }
            catch (Exception ex)
            {
                Console.WriteLine("Put object failed, {0}", ex.Message);
            }
        }

        

        /// <summary>
        /// 分片上传
        /// </summary>
        /// <param name="objectName"></param>
        /// <param name="localFilename"></param>
        public void Multipar_tUp(string objectName, string localFilename)
        {
            var uploadId = "";
            try
            {
                // 定义上传文件的名字和所属存储空间。在InitiateMultipartUploadRequest中,可以设置ObjectMeta,但不必指定其中的ContentLength。
                var request = new InitiateMultipartUploadRequest(bucketName, objectName);
                var result = client.InitiateMultipartUpload(request);
                uploadId = result.UploadId;
                // 打印UploadId。
                Console.WriteLine("Init multi part upload succeeded");
                Console.WriteLine("Upload Id:{0}", result.UploadId);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            // 计算分片总数。
            var partSize = 1024 * 1024;
            var fi = new FileInfo(localFilename);
            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(localFilename, 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, objectName, uploadId)
                        {
                            InputStream = fs,
                            PartSize = size,
                            PartNumber = i + 1
                        };
                        // 调用UploadPart接口执行上传功能,返回结果中包含了这个数据片的ETag值。
                        var result = client.UploadPart(request);
                        partETags.Add(result.PartETag);
                        Console.WriteLine("finish {0}/{1}", partETags.Count, partCount);
                    }
                    Console.WriteLine("Put multi part upload succeeded");
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            // 列举已上传的分片。
            try
            {
                var listPartsRequest = new ListPartsRequest(bucketName, objectName, uploadId);
                var listPartsResult = client.ListParts(listPartsRequest);
                Console.WriteLine("List parts succeeded");
                // 遍历所有分片。
                var parts = listPartsResult.Parts;
                foreach (var part in parts)
                {
                    Console.WriteLine("partNumber: {0}, ETag: {1}, Size: {2}", part.PartNumber, part.ETag, part.Size);
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            // 完成分片上传。
            try
            {
                var completeMultipartUploadRequest = new CompleteMultipartUploadRequest(bucketName, objectName, uploadId);
                foreach (var partETag in partETags)
                {
                    completeMultipartUploadRequest.PartETags.Add(partETag);
                }
                var result = client.CompleteMultipartUpload(completeMultipartUploadRequest);
                Console.WriteLine("complete multi part succeeded");
            }
            catch (Exception ex)
            {
                throw ex;
            }

        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="objectName"></param>
        /// <param name="localFilename"></param>
        /// <param name="checkpointDir"></param>
        public void chkin_Up(string objectName, string localFilename, string checkpointDir)
        {


            try
            {
                // 通过UploadFileRequest设置多个参数。
                UploadObjectRequest request = new UploadObjectRequest(bucketName, objectName, localFilename)
                {
                    // 指定上传的分片大小。
                    PartSize =  1024 * 1024,
                    // 指定并发线程数。
                    ParallelThreadCount = 10,
                    // checkpointDir保存断点续传的中间状态,用于失败后继续上传。如果checkpointDir为null,断点续传功能不会生效,每次失败后都会重新上传。
                    CheckpointDir = checkpointDir,
                };
                // 断点续传上传。
                client.ResumableUploadObject(request);
                Console.WriteLine("Resumable upload object:{0} succeeded", objectName);
            }
            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);
            }

        }

        public void Stream_Down(string objectName,string downloadFilename)
        {
            // objectName 表示您在下载文件时需要指定的文件名称,如abc/efg/123.jpg。
            //var objectName = "Project/cc.jpg";
            //var downloadFilename = @"D:\GG.jpg";
            // 创建OssClient实例。
            //var client = new OssClient(endpoint, accessKeyId, accessKeySecret);
            try
            {
                // 下载文件到流。OssObject 包含了文件的各种信息,如文件所在的存储空间、文件名、元信息以及一个输入流。
                var obj = client.GetObject(bucketName, objectName);
                using (var requestStream = obj.Content)
                {
                    byte[] buf = new byte[1024];
                    var fs = File.Open(downloadFilename, FileMode.OpenOrCreate);
                    var len = 0;
                    // 通过输入流将文件的内容读取到文件或者内存中。
                    while ((len = requestStream.Read(buf, 0, 1024)) != 0)
                    {
                        fs.Write(buf, 0, len);
                    }
                    fs.Close();
                }
                Console.WriteLine("Get object succeeded");
            }
            catch (Exception ex)
            {
                Console.WriteLine("Get object failed. {0}", ex.Message);
            }
        }



        public void DownPBar()
        {

        }
        public static void GetObjectProgress()
        {
            var endpoint = "<yourEndpoint>";
            var accessKeyId = "<yourAccessKeyId>";
            var accessKeySecret = "<yourAccessKeySecret>";
            var bucketName = "<yourBucketName>";
            var objectName = "<yourObjectName>";
            // 创建OssClient实例。
            var client = new OssClient(endpoint, accessKeyId, accessKeySecret);
            try
            {
                var getObjectRequest = new GetObjectRequest(bucketName, objectName);
                getObjectRequest.StreamTransferProgress += streamProgressCallback;
                // 下载文件。
                var ossObject = client.GetObject(getObjectRequest);
                using (var stream = ossObject.Content)
                {
                    var buffer = new byte[1024 * 1024];
                    var bytesRead = 0;
                    while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) > 0)
                    {
                        // 处理读取的数据(此处代码省略)。
                    }
                }
                Console.WriteLine("Get object:{0} succeeded", objectName);
            }
            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);
            }
        }
        private static void streamProgressCallback(object sender, StreamTransferProgressArgs args)
        {
            System.Console.WriteLine("ProgressCallback - Progress: {0}%, TotalBytes:{1}, TransferredBytes:{2} ",
                args.TransferredBytes * 100 / args.TotalBytes, args.TotalBytes, args.TransferredBytes);
        }

    }
}

 

 

调用范例

 

 

                OSS_Helper ss = new OSS_Helper();

                string objectName = "Project/aa.bak";
                string downloadFilename = @"\\aa.bak";
          //记录进度的文件路径
string checkpointDir = @"D:\checkin\"; //ss.Multipar_tUp(objectName, downloadFilename); ss.chkin_Up(objectName, downloadFilename, checkpointDir);

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值