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

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

时间:2024-07-19 17:43:17浏览次数:12  
标签:MINIO Simple S3 new WPF 上传 07

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

  合集 - Simple WPF(9)   1.Simple WPF:WPF 透明窗体和鼠标事件穿透07-012.Simple WPF:WPF 自定义按钮外形07-073.Simple WPF:WPF 实现按钮的长按,短按功能07-084.Simple WPF:WPF自定义一个可以定义步长的SpinBox07-095.Simple WPF:C# 使用基本的async/await实现异步07-096.Simple WPF:C# Task异步任务的取消初探07-097.Simple WPF:WPF实现一个MINIO等S3兼容对象存储上传文件的小工具07-10 8.Simple WPF:S3实现MINIO大文件上传并显示上传进度07-11 9.Simple WPF:WPF使用Windows API发送Toast通知07-15 收起  

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

作者:Mr.Chip

出处:https://www.cnblogs.com/mrchip/p/18297187

版权:本作品采用「知识共享署名 4.0 国际许可协议」许可协议进行许可。

标签:MINIO,Simple,S3,new,WPF,上传,07
From: https://www.cnblogs.com/sexintercourse/p/18312002

相关文章

  • Simple WPF: WPF 透明窗体和鼠标事件穿透
    SimpleWPF:WPF透明窗体和鼠标事件穿透 合集-SimpleWPF(9) 1.SimpleWPF:WPF透明窗体和鼠标事件穿透07-012.SimpleWPF:WPF自定义按钮外形07-073.SimpleWPF:WPF实现按钮的长按,短按功能07-084.SimpleWPF:WPF自定义一个可以定义步长的SpinBox07-095.SimpleWP......
  • elementui中使用input原生上传文件功能并提交到接口
    需求:表单中直接使用input进行文件上传,并直接传到后端表单接口 出现的问题:1.全局接口配置的请求头是application/json,要传formData需要修改请求头(不可能,绝对不可能)2.后端不单独对文件进行储存,因此无法使用独立封装的上传组件 解决方案:file转base64编码,然后通过JSON格式发送......
  • 通过S3使用Minio
    通过S3使用MinioMinio是一种开源的对象存储系统,提供了简单易用的存储解决方案。由于minio使用了S3兼容的API,所以可以直接通过awss3的sdk进行接入。以下,是基于golang的代码示例,只在于初始化aws配置时的参数略有区分,其他操作和功能暂未发现差异,此处不再单独列举。//g......
  • dvwa文件上传漏洞低级,中级,以及高级的难度测试(手把手教会你文件上传)
    在开始之前我们得先了解什么是文件上传漏洞,为什么会产生漏洞?以及文件上传漏洞有什么危害?文件上传漏洞顾名思义是指开发者或者程序员在开发网站的时候没有对用户上传的文件进行识别和过滤,因为很多网站提供的功能比较多,比如前台用户注册上传头像,允许上传图片,视频等等,没有做很好......
  • iOS开发基础129-音频录制上传
    在Objective-C中,音频录制过程涉及几个关键步骤,包括配置录音设置、创建和启动录音机、处理录音会话以及将录制的音频文件上传到服务器。下面是一个详细的示例,包括创建一个简单的音频录制应用,以及将录制的音频文件上传到服务器的代码。1.设置音频会话我们需要使用AVFoundation框......
  • 使用SecureCRT上传下载文件
    一、建立连接用SSH协议,22端口二、连接SFTP快捷键ALT+P​或者右键对话框,点击新建SFTP标签页三、设置目的地址3.1设置本地目录lcd本地目录 3.2远程目录cd远程目录 3.3上传方法put本地目录下的文件名/拖动文件至标签页3.4下载方法get远程目录下的文件名......
  • 使用Django框架实现音频上传功能
    数据库设计(models.py)classMusic(models.Model):"""音乐"""name=models.CharField(verbose_name="音乐名字",max_length=32)singer=models.CharField(verbose_name="歌手",max_length=32)#本质上数据库也是Cha......
  • gitee入门_如何上传文件
    前提条件:1,已经安装完git相关环境2,在gitee上已经创建完仓库1,初始化本地仓库在本地新建一个文件夹,点击鼠标右键,选择gitbash在打开后输入代码:gitinit2,同步文件打开gitee,选择自己的仓库,复制输入:gitremoteaddorigin此处粘贴然后再执行上述图片中的第二步第三步......
  • NETCORE -MinIO的基本使用
    NETCORE-MinIO的基本使用 环境:.net6+miniominio服务部署:https://www.cnblogs.com/1285026182YUAN/p/18308075 一. 创建net6项目二. 安装minionuget包 三.在appsetting.json配置文件中设置MinIO配置 {"Logging":{"LogLevel":{......
  • Docker 部署 minio
     Docker部署minio minio是分布式文件存储 一.minio的yaml部署 http版的 services:minio-http:command:-'server/data--console-address:9001'container_name:minio-httpenvironment:-MINIO_ACCESS_KEY=username-MI......