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);
