2015-05-12 2 views
0

Я изучаю, как использовать HTTP-запросы и webclient в формах окон C#. В настоящее время я получил следующий код от Example, и я пытаюсь заставить его работать, а также понимать его.Загрузить файлы с C# Windows Forms и webclient

Код успешно выполнен и отображает окно «Завершить загрузку», но фактически не загружает файл. Кто-нибудь объяснит мне, как это работает и что я делаю неправильно?

private void btnDownload_Click(object sender, EventArgs e) 
    { 
     string filepath = txtBxSaveTo.Text.ToString(); 
     WebClient webClient = new WebClient(); 
     webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(Completed); 
     webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressChanged); 
     webClient.DownloadFileAsync(new Uri("http://download.thinkbroadband.com/10MB.zip"), filepath); 
    } 

    private void ProgressChanged(object sender, DownloadProgressChangedEventArgs e) 
    { 
     progressBar.Value = e.ProgressPercentage; 
    } 

    private void Completed(object sender, AsyncCompletedEventArgs e) 
    { 
     MessageBox.Show("Download completed!"); 
    } 

    private void btnSavetoLocation_Click(object sender, EventArgs e) 
    { 
     FolderBrowserDialog selectedFolder = new FolderBrowserDialog(); 

     if (selectedFolder.ShowDialog() == DialogResult.OK) 
     { 
      txtBxSaveTo.Text = selectedFolder.SelectedPath; 

     } 
    } 
} 

}

+0

В обработчике 'Completed' попробуйте проверить' e.Error' и 'e.Cancelled' https://msdn.microsoft.com/en-us/library/system.componentmodel.asynccompletedeventargs(v=vs.110) .aspx –

ответ

0

Метод загрузки файла бросает исключение. Также ... используйте не-асинхронные версии для начала, прежде чем перейти к async.

{ «Удаленный сервер возвратил ошибку:. (407) Proxy Authentication Required»}

+0

Это та же самая проблема, которую я получаю. Есть ли подсказка, как пройти мимо этого? – PKD

1

В этом случае, если вы просто хотите, чтобы загрузить файл, вы можете захотеть сделать Синхронно скачать вызов вместо Асинхронно вызывается так, как вы пытаетесь реализовать.

Это может быть сделано в манере, подобной этой:

private void btnDownload_Click(object sender, EventArgs e) 
{ 
    string filepath = txtBxSaveTo.Text.ToString(); 
    WebClient webClient = new WebClient(); 
    webClient.DownloadFile("http://download.thinkbroadband.com/10MB.zip", filepath); 
} 

Это заблокирует программу, пока файл не будет загружен или произошла ошибка, но у вас есть особая потребность сделать это скачать Асинхронный? Если вы делаете, то следующее объяснение может быть полезно:

private void btnDownload_Click(object sender, EventArgs e) 
{ 
    //Retrieve the path from the input textbox 
    string filepath = txtBxSaveTo.Text.ToString(); 

    //Create a WebClient to use as our download proxy for the program. 
    WebClient webClient = new WebClient(); 

    //Attach the DownloadFileCompleted event to your new AsyncCompletedEventHandler Completed 
    //so when the event occurs the method is called. 
    webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(Completed); 

    //Attach the DownloadProgressChanged event to your DownloadProgressChangedEventHandler ProgressChanged, 
    //so again when the event occurs the method is called. 
    webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressChanged); 

    //Attempt to actually download the file, this is where the error that you 
    //won't see is probably occurring, this is because it checks the url in 
    //the blocking function internally and won't execute the download itself 
    //until this clears. 
    webClient.DownloadFileAsync(new Uri("http://example.com/myfile.txt"), filepath); 
} 

//Method that just increments the progressBar every time the DownloadProgressChangedEvent from webClient fires. 
private void ProgressChanged(object sender, DownloadProgressChangedEventArgs e) 
{ 
    progressBar.Value = e.ProgressPercentage; 
} 

//This is your method that will pop when the AsyncCompletedEvent is fired, 
//this doesn't mean that the download was successful though which is why 
//it's misleading, it just means that the Async process completed. 
private void Completed(object sender, AsyncCompletedEventArgs e) 
{ 
    MessageBox.Show("Download completed!"); 
} 

Лично я хотел бы использовать синхронный вызов в этом случае, пока вы не получите лучше понять из асинхронных вызовов и плюсов и минусов между ними.

+0

Отличное объяснение. Благодаря! –

+0

У меня все еще были проблемы с тем, чтобы это работало, пока я не поместил имя файла в строку пути к файлу. Можно ли использовать метод, который будет иметь загруженный файл, автоматически называемый так же, как файл на сервере? –

+0

Есть ли причина, по которой вы не можете аннотировать имя файла так: 'txtBxSaveTo.Text.ToString() +" 10MB.zip "'? Мне любопытно, поскольку вы, казалось, жестко кодировали путь к файлу на сервере. –

Смежные вопросы