Ну, ваше решение почти работает.Чтобы упростить его, необходимо учитывать несколько моментов:
Отмените навигацию по умолчанию только для определенных URL-адресов, которые, как вы знаете, будут загружены, или пользователь не сможетперемещаться куда угодноЭто означает, что вы не должны изменять URL-адреса загрузки своего веб-сайта.
DownloadFileAsync
не знает имя, указанное сервером в заголовке Content-Disposition
, поэтому вы должны указать его,или вычислите один из исходного URL, если это возможно.Вы не можете просто указать папку и ожидать, что имя файла будет получено автоматически.
Вы должны обрабатывать ошибки сервера загрузки из обратного вызова DownloadCompleted
, потому что управление веб-браузером не будетэто больше для вас.
Пример кода, который будет загружен в каталог, указанный в textBox1
, но со случайным именем файла и без какой-либо дополнительной обработки ошибок:
private void webBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e) {
/* change this to match your URL. For example, if the URL always is something like "getfile.php?file=xxx", try e.Url.ToString().Contains("getfile.php?") */
if (e.Url.ToString().EndsWith(".zip")) {
e.Cancel = true;
string filePath = Path.Combine(textBox1.Text, Path.GetRandomFileName());
var client = new WebClient();
client.DownloadFileCompleted += client_DownloadFileCompleted;
client.DownloadFileAsync(e.Url, filePath);
}
}
private void client_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e) {
MessageBox.Show("File downloaded");
}
Это решение должно работать, но его очень легко сломать.Попробуйте рассмотреть некоторые веб-службы, перечисляющие доступные для загрузки файлы, и создайте для них пользовательский интерфейс.Это будет проще, и вы будете контролировать весь процесс.