英文:
Progress in FTP file upload with WebClient in C#
问题
以下是翻译好的部分:
我有以下代码可以正常工作 - 上传文件,但既没有进度事件也没有完成事件触发。有什么想法为什么?
try
{
string srcFilePath = @"C:\Projects\MySetup.zip";
string url = "ftp://xxx.xxx.xxx.xxx/downloads/MySetup.zip";
Uri uri = new Uri(url);
WebClient client = new WebClient();
client.Credentials = new NetworkCredential("userName", "pass");
client.DownloadFileCompleted += Client_DownloadFileCompleted;
client.DownloadProgressChanged += Client_DownloadProgressChanged;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
client.UploadFileAsync(uri, srcFilePath);
}
catch(System.Net.WebException e)
{
Console.WriteLine(e.Message + ": " + e.Status);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
private static void Client_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
Console.WriteLine(String.Format("完成百分比:{0}", e.ProgressPercentage));
}
private static void Client_DownloadFileCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
{
doneEvent.Set();
}
英文:
I have the following code that works - uploads the file, but neither progress nor completion events are fired. Any ideas why?
try
{
string srcFilePath = @"C:\Projects\MySetup.zip";
string url = "ftp://xxx.xxx.xxx.xxx/downloads/MySetup.zip";
Uri uri = new Uri(url);
WebClient client = new WebClient();
client.Credentials = new NetworkCredential("userName", "pass");
client.DownloadFileCompleted += Client_DownloadFileCompleted;
client.DownloadProgressChanged += Client_DownloadProgressChanged;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
client.UploadFileAsync(uri, srcFilePath);
}
catch(System.Net.WebException e)
{
Console.WriteLine(e.Message + ": " + e.Status);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
private static void Client_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
Console.WriteLine(String.Format("Percent complete: {0}", e.ProgressPercentage));
}
private static void Client_DownloadFileCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
{
doneEvent.Set();
}
I tried the above code and expected that the event will fire and will provide feedback about completion and progress...
答案1
得分: 0
在你的代码中,你正在使用 UploadFileAsync 方法来将文件上传到服务器。然而,由于这是一个上传操作,DownloadProgressChanged 和 DownloadFileCompleted 事件不会被触发,因为它们是设计用来跟踪下载操作的。
你应该使用 WebClient.UploadProgressChanged 事件代替 DownloadProgressChanged,以及 WebClient.UploadFileCompleted 事件代替 DownloadFileCompleted。这些事件专门设计用于跟踪上传进度:
client.UploadFileCompleted += Client_UploadFileCompleted;
client.UploadProgressChanged += Client_UploadProgressChanged;
...
private static void Client_UploadProgressChanged(object sender, UploadProgressChangedEventArgs e)
{
Console.WriteLine(String.Format("上传进度:{0}%", e.ProgressPercentage));
}
private static void Client_UploadFileCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
{
doneEvent.Set();
}
UploadFileCompleted在每次异步文件上传操作完成时触发。异步文件上传是通过调用UploadFileAsync方法来启动的。
UploadProgressChanged在每次异步上传操作取得进展时触发。此事件在使用以下任一方法启动上传时触发:UploadDataAsync、UploadFileAsync、UploadValuesAsync。
英文:
In your code, you are using UploadFileAsync method to upload a file to the server. However, since it is an upload operation, the DownloadProgressChanged and DownloadFileCompleted events will not be fired because they are designed for tracking download operations.
You should use WebClient.UploadProgressChanged event instead of DownloadProgressChanged and WebClient.UploadFileCompleted event instead of DownloadFileCompleted. This events are specifically designed for tracking upload progress:
client.UploadFileCompleted += Client_UploadFileCompleted;
client.UploadProgressChanged += Client_UploadProgressChanged;
...
private static void Client_UploadProgressChanged(object sender, UploadProgressChangedEventArgs e)
{
Console.WriteLine(String.Format("Percent complete: {0}", e.ProgressPercentage));
}
private static void Client_UploadFileCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
{
doneEvent.Set();
}
> UploadFileCompleted is raised each time an asynchronous file upload operation completes. Asynchronous file uploads are started by calling the UploadFileAsync methods.
> UploadProgressChanged is raised each time an asynchronous upload makes progress. This event is raised when uploads are started using any of the following methods: UploadDataAsync, UploadFileAsync, UploadValuesAsync.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论