开发者社区 问答 正文

OSS进度条

下载了.net SDK,和OssSamples,

public static void PutObjectProgress(string bucketName,FileInfo finfo)
    {
        const string key = "PutObjectProgress";
        try
        {
            using (var fs = File.Open(finfo.Directory.ToString(), FileMode.Open))
            {
                var putObjectRequest = new PutObjectRequest(bucketName, key, fs);
                putObjectRequest.StreamTransferProgress += streamProgressCallback;

                client.PutObject(putObjectRequest);
            }
            Console.WriteLine("Put object:{0} succeeded", key);
        }
        catch (OssException ex)
        {
            Console.WriteLine("Failed with error code: {0}; Error info: {1}. \nRequestID:{2}\tHostID:{3}",
                ex.ErrorCode, ex.Message, ex.RequestId, ex.HostId);
        }
        catch (Exception ex)
        {
            Console.WriteLine("Failed with error info: {0}", ex.Message);
        }
    }

    private  static void streamProgressCallback(object sender, StreamTransferProgressArgs args)
    {

        System.Console.WriteLine("ProgressCallback - TotalBytes:{0}, TransferredBytes:{1}",
            args.TotalBytes, args.TransferredBytes);           
    }
    private void button1_Click(object sender, EventArgs e)
    {
        if (openFileDialog1.ShowDialog() == DialogResult.OK)
        {
            string fName = openFileDialog1.FileName;
            FileInfo fileInf = new FileInfo(fName);
            PutObjectProgress(bucketName, fileInf);
            SimpleListObjects(bucketName);
        }

    }

1.如何 在winform 显示进度,streamProgressCallback方法是静态的,无法访问 winform form中 控件

  1. using (var fs = File.Open(finfo.Directory.ToString(), FileMode.Open)) 提示访问被拒绝

展开
收起
gy348 2017-06-24 14:34:48 5154 分享 版权
阿里云 AI 助理回答

在WinForms应用中处理异步上传进度并更新UI控件时,由于UI更新需要在主线程上执行,而回调(如您的streamProgressCallback)可能在非UI线程上触发,因此您需要使用委托或者Invoke/BeginInvoke来安全地更新UI。对于静态方法无法直接访问UI控件的问题,可以通过传递一个对UI控件的引用或者使用表单实例的公共方法来解决。

针对您的问题,我提供以下修改建议:

1. 修改streamProgressCallback以更新UI

首先,确保您的Form类有一个公开的方法用于更新进度条或标签等UI元素。例如,如果您有一个ProgressBar控件名为progressBar1,可以添加这样的方法:

public void UpdateProgress(long totalBytes, long transferredBytes)
{
    if (InvokeRequired)
    {
        Invoke(new Action<long, long>(UpdateProgress), totalBytes, transferredBytes);
        return;
    }
    progressBar1.Value = (int)((double)transferredBytes / totalBytes * progressBar1.Maximum);
    // 可以根据需要更新其他UI控件
}

2. 调整PutObjectProgress方法以使用新方法更新UI

修改PutObjectProgress方法,使其能够接受一个对Form实例的引用,并在回调中调用上面定义的UpdateProgress方法:

public static void PutObjectProgress(string bucketName, FileInfo finfo, YourFormType formInstance)
{
    // ... 其他代码不变 ...
    putObjectRequest.StreamTransferProgress += (sender, args) =>
    {
        formInstance.UpdateProgress(args.TotalBytes, args.TransferredBytes);
    };
    // ... 继续原有逻辑 ...
}

3. 解决文件访问权限问题

关于File.Open提示“访问被拒绝”,请确保您有权限访问指定的文件路径。finfo.Directory.ToString()返回的是目录路径而非文件路径,您应该使用finfo.FullName来获取完整的文件路径:

using (var fs = File.Open(finfo.FullName, FileMode.Open))
{
    // ... 继续原有逻辑 ...
}

总结

  • 通过在Form类中添加一个更新UI的方法,并在回调中通过表单实例调用该方法,可以解决UI更新问题。
  • 使用正确的文件路径解决文件访问权限问题。

这样,您就可以在WinForms应用中显示OSS上传的进度了。记得替换YourFormType为您的实际表单类名。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答标签:
问答地址: