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

news/2024/11/16 13:35:23/文章来源:https://www.cnblogs.com/mrchip/p/18297187

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

目的

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

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

80XgKMHuN9beh6D86Zzup9KEG94t3qdNlx5aN_AuW-U.png

实现方式

  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 上。

演示效果

RrcNgGshrDzSeRmjcoMmk44kuWK1DLACH3xXRyIUKNw.gif

参考连接

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/742258.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.NET 9 预览版6发布

微软发布了 .NET 9 的第 6 个预览版,此版本包括对运行时、SDK、.NET MAUI、ASP.NET Core 和 C# 的更新,预览版没有包含太多新的主要功能或特性,因为已接近 .NET 9 开发的最后阶段,该开发计划于 11 月全面发布。Loongarch的Native-AOT代码合进去了,龙芯.NET 可以直接同步社…

【Azure Developer】一个复制Redis Key到另一个Redis服务的工具(redis_copy_net8)

介绍一个简单的工具,用于将Redis数据从一个redis端点复制到另一个redis端点,基于原始存储库转换为.NET 8:https://github.com/LuBu0505/redis-copy-net8介绍一个简单的工具,用于将Redis数据从一个redis端点复制到另一个redis端点,基于原始存储库转换为.NET 8:https://git…

[Windows环境]nvm工具的介绍和安装

nvm工具介绍 NVM(Node Version Manager)是一个用于管理Node.js版本的工具。它允许用户在同一台机器上同时安装和切换不同版本的Node.js,以便在不同的项目中使用特定的Node.js版本。同时为每个版本保留独立的环境,避免版本冲突和兼容性问题。此文章步骤以windows为例使用set…

劫持TLS绕过canary 堆和栈的灵活转换

引入:什么是TLScanary? TLScanary 是一种在 Pwn(主要是二进制漏洞利用)中常见的技术,专门用于处理 TLS 保护的二进制文件。在安全竞赛(例如 CTF)和漏洞利用场景中,攻击者需要应对目标程序的多层安全机制,其中 TLS 是一种常见的保护措施。TLScanary 结合了 TLS 协议与堆…

松灵机器人scout mini小车 自主导航(3)——建图导航仿真

松灵机器人Scout mini小车建图导航仿真 在之前的文章中,我们已经介绍了如何在gazebo和rviz对scout mini小车进行仿真,并且测试了添加自定义的传感器,在本文章中将进一步介绍如何利用scout mini小车 在仿真环境中建图和导航。 仓库链接: https://gitee.com/agent-explorer/ro…

ComfyUI进阶篇:ControlNet核心节点

前言: ControlNet_aux库包含大量的图片预处理节点,功能丰富,适用于图像分割、边缘检测、姿势检测、深度图处理等多种预处理方式。掌握这些节点的使用是利用ControlNet的关键,本篇文章将帮助您理解和学会使用这些节点。 目录 一、安装方法 二、模型下载 三、Segmentor节点 四…

面对百度的无期徒刑,幸好还有微软的必应

昨天我们通过【i博客园】公众号发布文章 被百度降权的经历:没有百度的日子,是百度给的无期徒刑 时发现,百度不但没有回心转意,反而对园子的处罚更加严厉了,博客主站(www域名)的新发内容一天内0收录。而在去年9月21日我们完全解除对百度蜘蛛的屏蔽后(详见博文),9月25日…

2024-07-11 npm publish报错合集

报错1:This package has been marked as private npm ERR! 你的包被设为私有模式了。npm ERR! code EPRIVATE npm ERR! This package has been marked as private npm ERR! Remove the private field from the package.json to publish it.原因:你发布的包被标记为私有了,如…

midjourney 入门操作

midjourney 入门操作 settings面板选择模型当从 V6 切换到 Niji模型时,Current suffix会添加参数default V6面板功能介绍RAW Mode功能--style raw 使用的是另一种模式,对于已经熟练掌握提示功能并希望对图像进行更多控制的用户来说,这种模式可能会很有效。使用--style raw 制…

FFT

这东西对初中生挺友好的。前置知识复数 形如 \(a+bi(a,b\in \mathbb{R})\) 的数叫复数,其中 \(i^2=-1\)。 复数乘法:\((a+bi)(c+di)=ac-bd+(ad+bc)i\)。乘法分配律即可。复平面 以 \(a\) 为 \(x\) 轴,\(b\) 为 \(y\)轴所组成的平面叫复平面。每个复数都对应复平面上一点。单…

R语言将多景遥感影像拼接在一起的方法

本文介绍基于R语言中的raster包,遍历文件夹,读取文件夹下的大量栅格遥感影像,并逐一对每一景栅格图像加以拼接、融合,使得全部栅格遥感影像拼接为完整的一景图像的方法~本文介绍基于R语言中的raster包,遍历文件夹,读取文件夹下的大量栅格遥感影像,并逐一对每一景栅格图像…

使用pyqt5制作简单计分桌面应用

这是一个自己写的使用pyqt5制作简单计分桌面应用的实例,包含完整代码,希望对大家有所帮助。制作这个小程序的起因是因为有个艺术类比赛需要设计这个一个桌面程序,方便统分。这是一个自己写的使用pyqt5制作简单计分桌面应用的实例,希望对大家有所帮助。制作这个小程序的起因…