Simple WPF: S3实现MINIO大文件上传并显示上传进度
最新内容优先发布于个人博客:小虎技能分享站,随后逐步搬运到博客园。创作不易,如果以为有用请在Github上为博主点亮一颗小星星吧!
目的
早两天写了一篇S3简单上传文件的小工具,知乎上看到了一个题目问如何实现显示MINIO上传进度,因此拓展一下这个小工具可以或许在上传大文件时显示进度。
完整代码托管于Github:mrchipset/simple-wpf
https://img2024.cnblogs.com/blog/1545827/202407/1545827-20240711210428010-1863740634.png
实现方式
[*]先通过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://img2024.cnblogs.com/blog/1545827/202407/1545827-20240711210427870-1258264698.gif
参考毗连
https://docs.aws.amazon.com/AmazonS3/latest/userguide/mpu-upload-object.html
https://www.xtigerkin.com/archives/96/
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]