首页 > 其他分享 >Simple WPF: S3实现MINIO大文件上传并显示上传进度

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

时间:2024-07-11 21:18:44浏览次数:8  
标签:MINIO Invoke Simple var Action new 上传 Dispatcher

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

标签:MINIO,Invoke,Simple,var,Action,new,上传,Dispatcher
From: https://www.cnblogs.com/mrchip/p/18297187

相关文章

  • gitlab上传问题记录
    1.如果引用了子模块,关于上传子模块必须要有.gitmodule文件,所以先创建添加子模块gitsubmoduleadd<子模块仓库的URL><本地路径>初始化子模块:gitsubmoduleinit更新子模块:gitsubmoduleupdate或者你可以用一条命令完成初始化和更新:gitsubmoduleupdate--init如果......
  • Docker:docker部署Minio服务并创建访问密钥
    前言Minio是一个基于ApacheLicensev2.0开源协议的对象存储服务,虽然轻量,却拥有着不错的性能。它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等;最重......
  • simpleperf火焰图-1-初探
    simpleperf源码:https://android.googlesource.com/platform/system/extras/+/master/simpleperfFlameGraphs官方博客(火焰图的源资料皆出自该博客):https://www.brendangregg.com/flamegraphs.html火焰图处理脚本和示例:gitclonehttps://github.com/brendangregg/FlameGraph.gi......
  • Gitlab上传大文件报错 Too Large
    Gitlab上传超过1G文件报错gitpushwarning:redirectingtohttp://192.168.3.215/ai/invalid_detection_model.git......
  • vue上传minio后无法预览 文件损坏
    文件损坏或者无法预览基本上都和两个问题有关Minio内部文件类型错误上传文件时传输的数据存在问题需要注意上传文件需要使用PUT方法,同时需要提交二进制数据所以web页面在上传之前需要读取文件二进制后在上传,同时需要注意调整Content-Type为实际的文件MIME类型可以在选择文......
  • Simple WPF: WPF实现一个MINIO等S3兼容对象存储上传文件的小工具
    最新内容优先发布于个人博客:小虎技术分享站,随后逐步搬运到博客园。创作不易,如果觉得有用请在Github上为博主点亮一颗小星星吧!目的之前在阿里云ECS99元/年的活动实例上搭建了一个测试用的MINIO服务,以前都是直接当基础设施来使用的,这次准备自己学一下S3兼容API相关的对象存储开......
  • 27、Django-文件上传
    上传规范:1、文件上传必须为POST提交方式2、表单'<form>'中文件上传时必须带有enctype="multipart/form-data"时才会有包含文件内容的数据3、表单中用<inputtype="file"name="xxx">标签上传文件#在视图函数中-用request.FILES取文件框的内容-file=request.FILES['xxx......
  • Simple WPF: C# Task异步任务的取消初探
    最新内容优先发布于个人博客:小虎技术分享站,随后逐步搬运到博客园。创作不易,如果觉得有用请在Github上为博主点亮一颗小星星吧!C#中提供了CancellationTokenSource来实现Task的取消,方法就是在Task异步循环中检测任务是否被取消。最近正在学习C#的任务异步模型,因此撰文以记之。......
  • 基于FileZilla上传、下载服务器数据的方法
      本文介绍FileZilla软件的下载、配置与使用方法。  在之前的博客中,我们提到了下载高分遥感影像数据需要用到FTP(文件传输协议,FileTransferProtocol)软件FileZilla;这一软件用以在自己的电脑与服务器之间相互传输数据,在进行下载科学数据、网站开发等等操作时,经常需要用到。本......
  • 上传excel到数据库
    上传excel到数据库:packagecom.wisdragon.controller.dataQuality;importcom.wisdragon.comm.constant.Constant;importcom.wisdragon.controller.common.BaseController;importcom.wisdragon.model.dataQuality.RuleBase;importcom.wisdragon.model.dataQuality.RuleV......