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

simple,wpf,s3,minio · 浏览次数 : 25

小编点评

本文将介绍如何使用AWS SDK for .NET Core实现S3文件的上传,并在上传大文件时显示进度。首先,我们需要创建一个基本的AWS认证,配置S3客户端。接下来,我们将使用TransferUtility类来上传文件,并通过监听UploadProgressEvent事件来获取上传进度。 实现步骤如下: 1. 创建AWS认证 首先,我们需要创建一个BasicAWSCredentials对象来存储访问密钥和秘密密钥。示例代码如下: ```csharp var credentials = new BasicAWSCredentials(_accessKey, _secretKey); ``` 2. 配置S3客户端 接下来,我们需要为S3客户端配置基本配置,如端点URL、是否强制路径风格等。示例代码如下: ```csharp var clientConfig = new AmazonS3Config { ForcePathStyle = true, ServiceURL = _endpoint, }; ``` 3. 创建TransferUtility 使用刚才创建的认证和配置信息,我们可以创建一个TransferUtility对象。示例代码如下: ```csharp var fileTransferUtility = new TransferUtility(client); ``` 4. 创建TransferUtilityUploadRequest 然后,我们需要创建一个TransferUtilityUploadRequest对象,用于指定要上传的文件和存储桶名称。示例代码如下: ```csharp var uploadRequest = new TransferUtilityUploadRequest { BucketName = LargeBucket, FilePath = UploadLargeFile, Key = System.IO.Path.GetFileName(UploadLargeFile), }; ``` 5. 监听UploadProgressEvent事件 在此步骤中,我们将监听TransferUtilityUploadRequest对象的UploadProgressEvent事件。每当上传进度发生变化时,我们将调用UpdateProgress方法来更新用户界面上的上传进度条。示例代码如下: ```csharp uploadRequest.UploadProgressEvent += UploadRequest_UploadProgressEvent; ``` 6. 异步上传文件 最后,我们定义一个异步方法来执行文件上传操作。在这个方法中,我们会调用前面的TransferUtilityUploadRequest对象来执行上传操作。示例代码如下: ```csharp private async Task UploadLargeFileAsync() { // ... 省略其他代码 ... var uploadRequest = new TransferUtilityUploadRequest { // ... 省略其他代码 ... }; try { await fileTransferUtility.UploadAsync(uploadRequest); } catch (FileNotFoundException e) { // ... 省略其他代码 ... } catch (AmazonS3Exception e) { // ... 省略其他代码 ... } catch (Exception e) { // ... 省略其他代码 ... } return ret; } ``` 7. 更新上传进度 在上传进度事件处理函数中,我们需要使用Dispatcher来更新数据到UI上。示例代码如下: ```csharp private void UploadRequest_UploadProgressEvent(object? sender, UploadProgressArgs e) { this.Dispatcher.Invoke((Action)(() => { this.uploadProgress.Value = e.TransferredBytes * 100 / e.TotalBytes; })); } ``` 8. 测试程序 最后,我们可以运行程序并测试上传功能。当文件上传完成后,可以在UI上查看上传进度条的进度。参考链接:[https://docs.aws.amazon.com/AmazonS3/latest/userguide/mpu-upload-object.html](https://docs.aws.amazon.com/AmazonS3/latest/userguide/mpu-upload-object.html) 通过以上步骤,我们可以实现在上传大文件时显示进度。希望这个例子对您有所帮助!

正文

最新内容优先发布于个人博客:小虎技术分享站,随后逐步搬运到博客园。
创作不易,如果觉得有用请在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/

与Simple WPF: S3实现MINIO大文件上传并显示上传进度相似的内容:

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

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

Simple WPF: WPF实现一个MINIO等S3兼容对象存储上传文件的小工具

之前在阿里云ECS 99元/年的活动实例上搭建了一个测试用的MINIO服务,以前都是直接当基础设施来使用的,这次准备自己学一下S3兼容API相关的对象存储开发,因此有了这个小工具。目前仅包含上传功能,后续计划开发一个类似图床的对象存储应用。

Simple WPF: WPF 实现按钮的长按,短按功能

实现了一个支持长短按得按钮组件,单击可以触发Click事件,长按可以触发LongPressed事件,长按松开时触发LongClick事件。还可以和自定义外观相结合,实现自定义的按钮外形。

Simple WPF: WPF 自定义按钮外形

WPF的按钮提供了Template模板,可以通过修改Template模板中的内容对按钮的样式进行自定义。结合资源字典,可以将自定义资源在xaml窗口、自定义控件或者整个App当中调用

Simple WPF: WPF 透明窗体和鼠标事件穿透

一个自定义WPF窗体的解决方案,借鉴了吕毅老师的WPF制作高性能的透明背景的异形窗口一文,并在此基础上增加了鼠标穿透的功能。可以使得透明窗体的鼠标事件穿透到下层,在下层窗体中响应。

Simple WPF: WPF自定义一个可以定义步长的SpinBox

通过WPF的按钮、文本输入框实现了一个简单的SpinBox数字输入用户组件并可以通过数据绑定数值和步长。本文中介绍了通过Xaml代码实现自定义组件的布局,依赖属性的定义和使用等知识点。

简单工厂模式( Simple Factory Pattern )

简单工厂模式(Simple Factory Pattern),在工厂类中对象决定创建出哪一种产品类的实例。这些产品类都实现了相同的接口,或者继承了相同的父类。 结构图 Factory(工厂角色):它是核心,负责实现创建所有实例的内部逻辑。在工厂类中,提供了一个静态方法,可以直接被外界直接调用,以创建

Simple Factory 简单工厂模式简介与 C# 示例【创建型3.1】【设计模式来了_3.1】

本文通过简单的实例对简单工厂模式进行了介绍。

Simple Date Format类到底为啥不是线程安全的?

摘要:我们就一起看下在高并发下Simple Date Format类为何会出现安全问题,以及如何解决Simple Date Format类的安全问题。 本文分享自华为云社区《【高并发】SimpleDateFormat类到底为啥不是线程安全的?》,作者:冰 河。 首先问下大家:你使用的Simple D

设计模式之简单工厂模式(学习笔记)

定义 简单工厂模式(Simple Factory Pattern)是一种创建型设计模式,它定义一个用于创建对象的接口,但由一个单独的类来实现实际创建的工作。简单工厂模式通过在一个类中集中管理对象的创建过程,可以减少客户端与具体类之间的耦合,使得代码结构更加清晰和易于维护。通过专门定义一个类来负责创建