• 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:	iger.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}. 
    RequestID:{2}	HostID:{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}. 
    RequestID:{2}	HostID:{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);
  • 相关阅读:
    winform treeview checkbox递归算法利用
    转载10种代码风格
    Canvas没有添加Background,点击就不在Canvas上?
    数据库安装文件制作(C#)
    Panel的公有属性Background
    Teechar 常用属性
    NHibernate
    解决:请购买WinRAR许可,您注册还剩下40天(WinRAR老是弹出烦人的对话框)
    在WinForm中用Visifire实现数据统计转自蓝月天南
    【转】TeeChart的用法
  • 原文地址:https://www.cnblogs.com/JinweiChang/p/11804100.html
Copyright © 2020-2023  润新知