You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Mega API的UploadFileAsync?C#上传进度与参数咨询

解决MegaApiClient上传进度条不显示的问题(附UploadFileAsync参数详解)

我来帮你拆解这个UploadFileAsync方法的参数,顺便解决进度条不显示的问题——毕竟我之前用Mega API做上传功能时也踩过一模一样的坑😉

先搞懂UploadFileAsync的每个参数

你看到的方法完整定义应该是这样的:

Task<INode> UploadFileAsync(
    string filename, 
    INode parentNode, 
    IProgress<TransferProgress> progress, 
    CancellationToken? cancellationToken = null
);

逐个解释每个参数的作用:

  • string filename:本地待上传文件的完整路径(比如D:\Backup\photo.jpg),这个你应该已经用对了,毕竟上传成功了。
  • INode parentNode:Mega账户里的目标父文件夹节点。如果传null,文件会直接传到Mega的根目录;如果要传到指定文件夹,需要先通过GetNodesAsync()之类的方法获取到对应文件夹的INode实例。
  • IProgress<TransferProgress> progress:这是实现进度条的核心!你之前看不到进度,大概率是这里传了null,或者没正确实现回调逻辑。Mega API会在上传过程中不断调用这个对象的Report方法,把当前上传进度传回来。
  • CancellationToken? cancellationToken:可选参数,用来取消上传任务(比如用户点击“取消”按钮时触发)。不需要取消功能的话,直接传CancellationToken.None或者null就行。

实现进度条的具体步骤

以WinForms为例(WPF/控制台的逻辑类似,只是UI更新方式不同):

  1. 准备UI控件:在你的窗体上拖一个ProgressBar(命名为uploadProgressBar)和一个Label(命名为progressLabel,用来显示百分比和字节数)。
  2. 创建进度回调实例:
// 实例化Progress<T>,传入回调方法处理进度更新
var uploadProgress = new Progress<TransferProgress>(progressUpdate =>
{
    // 注意:Mega的回调是在后台线程执行的,必须切换回UI线程更新控件
    this.Invoke((Action)(() =>
    {
        // TransferProgress的关键属性:
        // - Progress: 0~1之间的浮点数(0=0%,1=100%)
        // - BytesTransferred: 已上传的字节数
        // - TotalBytes: 文件总字节数
        int percentage = (int)(progressUpdate.Progress * 100);
        uploadProgressBar.Value = percentage;
        // 转换成MB显示更直观
        double uploadedMB = progressUpdate.BytesTransferred / 1024.0 / 1024.0;
        double totalMB = progressUpdate.TotalBytes / 1024.0 / 1024.0;
        progressLabel.Text = $"上传进度:{percentage}% ({uploadedMB:F2}MB/{totalMB:F2}MB)";
    }));
});
  1. 调用UploadFileAsync时传入进度对象:
// 假设你已经初始化了MegaApiClient并登录成功
// 这里以上传到根目录为例,parentNode传null
var uploadedFileNode = await megaApiClient.UploadFileAsync(
    @"D:\MyFiles\large_file.zip", 
    null, 
    uploadProgress, 
    CancellationToken.None
);

常见坑点提醒

  • 必须切换回UI线程更新控件:如果直接在回调里更新UI,会抛出跨线程操作异常,一定要用Invoke(WinForms)或Dispatcher.Invoke(WPF)。
  • 不要传null给progress参数:传null的话,Mega API不会触发任何进度回调,自然看不到进度条变化。
  • 注意Progress属性的范围:它是0到1的浮点数,转换成百分比要乘以100,ProgressBar的Maximum默认是100,不用额外修改。

内容的提问来源于stack exchange,提问作者Eng.Mohamed Bassuny

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 11:05:07