- A+
所属分类:.NET技术
最新内容优先发布于个人博客:小虎技术分享站,随后逐步搬运到博客园。
创作不易,如果觉得有用请在Github上为博主点亮一颗小星星吧!
目的
早两天写了一篇S3简单上传文件的小工具,知乎上看到了一个问题问如何实现显示MINIO上传进度,因此拓展一下这个小工具能够在上传大文件时显示进度。
完整代码托管于Github:mrchipset/simple-wpf
实现方式
- 先通过
Xaml
编写一个包含上传进度条的小界面。具体内容就不赘述了,可以参考这篇文章 - 为了得到上传进度就不能再简单地使用
PutObjectRequest
进行上传需要使用S3中TransferUtility
提供的高等级API进行上传。 - 然后创建一个
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
上。
演示效果
参考连接
https://docs.aws.amazon.com/AmazonS3/latest/userguide/mpu-upload-object.html