码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Simple WPF: S3实现MINIO大文件上传并显示上传进度


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

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

  • 相关阅读:
    JavaScript 布尔类型(boolean) 和为定义类型(undefined)
    2022年信息安全工程师考试知识点:访问控制
    Linux 基本语句_4_指针和函数
    Java 中的深拷贝和浅拷贝你了解吗?
    正则表达式(常用最新版)
    为什么说,企业数字化转型归根到底是人的转型?
    web网站 固定的邀请码字符 能被爬虫爬取吗?动态改变邀请码的字符是不是可以避免爬虫爬取或数据泄露
    Python开发技术—面向对象程序设计2
    php定时任务
    SpringCloudAlibaba实战-nacos集群部署
  • 原文地址:https://www.cnblogs.com/mrchip/p/18297187
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号