Simple WPF: S3实现MINIO大文件上传并显示上传进度

  • Simple WPF: S3实现MINIO大文件上传并显示上传进度已关闭评论
  • 19 次浏览
  • A+
所属分类:.NET技术
摘要

最新内容优先发布于个人博客:小虎技术分享站,随后逐步搬运到博客园。
创作不易,如果觉得有用请在Github上为博主点亮一颗小星星吧!

最新内容优先发布于个人博客:小虎技术分享站,随后逐步搬运到博客园。
创作不易,如果觉得有用请在Github上为博主点亮一颗小星星吧!

目的

早两天写了一篇S3简单上传文件的小工具,知乎上看到了一个问题问如何实现显示MINIO上传进度,因此拓展一下这个小工具能够在上传大文件时显示进度。

完整代码托管于Github:mrchipset/simple-wpf

Simple WPF: S3实现MINIO大文件上传并显示上传进度

实现方式

  1. 先通过Xaml编写一个包含上传进度条的小界面。具体内容就不赘述了,可以参考这篇文章
  2. 为了得到上传进度就不能再简单地使用PutObjectRequest 进行上传需要使用S3中TransferUtility 提供的高等级API进行上传。
  3. 然后创建一个TransferUtilityUploadRequest 对象并绑定其UploadProgressEvent 事件以实现上传进度的监控

具体的实现代码如下:

private async Task<bool> UploadLargeFileAsync() {     var credentials = new BasicAWSCredentials(_accessKey, _secretKey);      var clientConfig = new AmazonS3Config     {         ForcePathStyle = true,         ServiceURL = _endpoint,     };      bool ret = true;     using (var client = new AmazonS3Client(credentials, clientConfig))     {           try         {             var fileTransferUtility = new TransferUtility(client);              var uploadRequest = new TransferUtilityUploadRequest             {                 BucketName = LargeBucket,                 FilePath = UploadLargeFile,                 Key = System.IO.Path.GetFileName(UploadLargeFile)             };              uploadRequest.UploadProgressEvent += UploadRequest_UploadProgressEvent;              await fileTransferUtility.UploadAsync(uploadRequest);         }         catch (FileNotFoundException e)         {             ret = false;             this.Dispatcher.Invoke(new Action(() => this.statusLargeTxtBlk.Text = e.Message));         }         catch (AmazonS3Exception e)         {             ret = false;             if (e.ErrorCode != null &&                 (e.ErrorCode.Equals("InvalidAccessKeyId") ||             e.ErrorCode.Equals("InvalidSecurity")))             {                 this.Dispatcher.Invoke(new Action(() => this.statusLargeTxtBlk.Text = "Please check the provided AWS Credentials"));             }             else             {                 this.Dispatcher.Invoke(new Action(() => this.statusLargeTxtBlk.Text = $"An error occurred with the message '{e.Message}' when writing an object"));             }         }         catch(Exception e)         {             this.Dispatcher.Invoke(new Action(() => this.statusLargeTxtBlk.Text = $"An error occurred with the message '{e.Message}' when writing an object"));         }     }     return ret; }  private void UploadRequest_UploadProgressEvent(object? sender, UploadProgressArgs e) {     this.Dispatcher.Invoke((Action)(() =>     {         this.uploadProgress.Value = e.TransferredBytes * 100 / e.TotalBytes ;     })); } 

值得一提的时,在上传进度的事件处理函数中,由于我们通过异步方法执行上传函数,因此我们需要使用Dispatcher 来更新数据到UI 上。

演示效果

Simple WPF: S3实现MINIO大文件上传并显示上传进度

参考连接

https://docs.aws.amazon.com/AmazonS3/latest/userguide/mpu-upload-object.html

https://www.xtigerkin.com/archives/96/