zoukankan      html  css  js  c++  java
  • 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);
  • 相关阅读:
    用 Python 带你看各国 GDP 变迁
    Fluent Interface(流式接口)
    probing privatePath如何作用于ASP.NET MVC View
    Word插入htm文件导致文本域动态增加的一个问题
    Visual Studio 2013附加进程调试IE加载的ActiveX Control无效解决方法
    Ubuntu下Chrome运行Silverlight程序
    Windows Phone Bing lock screen doesn't change解决方法
    SPClaimsUtility.AuthenticateFormsUser的证书验证问题
    Web Service Client使用Microsoft WSE 2.0
    Visual Studio 2013安装Update 3启动crash的解决方法
  • 原文地址:https://www.cnblogs.com/JinweiChang/p/11804100.html
Copyright © 2011-2022 走看看