下载了.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中 控件
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在WinForms应用中处理异步上传进度并更新UI控件时,由于UI更新需要在主线程上执行,而回调(如您的streamProgressCallback)可能在非UI线程上触发,因此您需要使用委托或者Invoke/BeginInvoke来安全地更新UI。对于静态方法无法直接访问UI控件的问题,可以通过传递一个对UI控件的引用或者使用表单实例的公共方法来解决。
针对您的问题,我提供以下修改建议:
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控件
}
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);
};
// ... 继续原有逻辑 ...
}
关于File.Open提示“访问被拒绝”,请确保您有权限访问指定的文件路径。finfo.Directory.ToString()返回的是目录路径而非文件路径,您应该使用finfo.FullName来获取完整的文件路径:
using (var fs = File.Open(finfo.FullName, FileMode.Open))
{
// ... 继续原有逻辑 ...
}
这样,您就可以在WinForms应用中显示OSS上传的进度了。记得替换YourFormType为您的实际表单类名。