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 BPASmartClient.IoT.Model { public 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。*/ /// /// /// /// /// 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); } } /// /// 分片上传 /// /// /// 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(); 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; } } /// /// 上传 /// /// /// /// 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 = ""; var accessKeyId = ""; var accessKeySecret = ""; var bucketName = ""; var objectName = ""; // 创建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); } } }