通过 C# Webclient 下载文件而不直接 link
Downloading file without direct link through C# Webclient
我正在尝试下载一个文件,但问题是 URL 不是直接 link 到 zip 文件,我的代码给了我无用的错误。
这是代码:
var zipFile = new FileInfo(Path.Combine(directory.FullName, "temp.zip"));
var progressInfo =
new ProgressBarInfo(
$"{DateTime.Now:dd-MM-yyyy HH:mm:ss.ffff}\t[PROGRESS] Download IP2Location database");
UiManager.UiImplementation.ShowProgressBar(progressInfo);
try
{
using (var webClient = new WebClient { Proxy = null })
{
var url = $"https://www.ip2location.com/download/?token={downloadToken}&file={DatabaseProduct}";
webClient.DownloadProgressChanged +=
(sender, args) =>
progressInfo.ReportProgress(args.ProgressPercentage / 100d);
using (var autoResetEvent = new AutoResetEvent(false))
{
webClient.DownloadFileCompleted += (sender, args) => autoResetEvent.Set();
webClient.DownloadFileAsync(new Uri(url), zipFile.FullName);
autoResetEvent.WaitOne();
}
}
}
finally
{
progressInfo.Close();
}
如果我将 URL 变量更改为直接 link 例如:https://speed.hetzner.de/10GB.bin
那么代码工作正常
如果我访问这个URL:https://www.ip2location.com/download/?token=REDACTED&file=DB11LITE
它将直接下载一个名为 IP2LOCATION-LITE-DB11.CSV.ZIP
的文件
这是我在浏览器中访问URL时的响应头
HTTP/1.1 200 OK
Server: nginx
Date: Mon, 13 Dec 2021 23:22:15 GMT
Content-Type: application/zip
Content-Length: 48726637
Connection: keep-alive
Expires: 0
Cache-Control: must-revalidate, post-check=0, pre-check=0
Pragma: public
Cache-Control: private
Content-Disposition: attachment; filename="IP2LOCATION-LITE-DB11.CSV.ZIP"
Content-Transfer-Encoding: binary
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
Referrer-Policy: no-referrer-when-downgrade
Content-Security-Policy: default-src * data: 'unsafe-eval' 'unsafe-inline';frame-ancestors 'self';
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
请务必注意,Webclient
class 使用 RETR 命令下载 FTP 资源。对于 HTTP 资源,使用 GET 方法。这意味着,如果您向可下载文件提供不包含正确参数的 URL,您最终会遇到一些未处理的异常,因为 Webclient
已替换为 System.Net.Http.HttpClient
,我建议您改用它。
下面您可以看到 Webclient
如何工作的示例,在您的情况下,您会收到“无用错误”,因为您使用的是异步方法。我建议使用像下面这样的正常方法来调试并获得正确的异常。
public void downloadProgrambyURL(string url, string filename)
{
using (WebClient client = new WebClient())
{
var pathVariable = "%USERPROFILE%\Downloads\" + filename;
var filePath = Environment.ExpandEnvironmentVariables(pathVariable);
client.DownloadFile(url, filePath);
}
}
另外,我让thislink供大家参考。
我正在尝试下载一个文件,但问题是 URL 不是直接 link 到 zip 文件,我的代码给了我无用的错误。
这是代码:
var zipFile = new FileInfo(Path.Combine(directory.FullName, "temp.zip"));
var progressInfo =
new ProgressBarInfo(
$"{DateTime.Now:dd-MM-yyyy HH:mm:ss.ffff}\t[PROGRESS] Download IP2Location database");
UiManager.UiImplementation.ShowProgressBar(progressInfo);
try
{
using (var webClient = new WebClient { Proxy = null })
{
var url = $"https://www.ip2location.com/download/?token={downloadToken}&file={DatabaseProduct}";
webClient.DownloadProgressChanged +=
(sender, args) =>
progressInfo.ReportProgress(args.ProgressPercentage / 100d);
using (var autoResetEvent = new AutoResetEvent(false))
{
webClient.DownloadFileCompleted += (sender, args) => autoResetEvent.Set();
webClient.DownloadFileAsync(new Uri(url), zipFile.FullName);
autoResetEvent.WaitOne();
}
}
}
finally
{
progressInfo.Close();
}
如果我将 URL 变量更改为直接 link 例如:https://speed.hetzner.de/10GB.bin 那么代码工作正常
如果我访问这个URL:https://www.ip2location.com/download/?token=REDACTED&file=DB11LITE 它将直接下载一个名为 IP2LOCATION-LITE-DB11.CSV.ZIP
的文件这是我在浏览器中访问URL时的响应头
HTTP/1.1 200 OK
Server: nginx
Date: Mon, 13 Dec 2021 23:22:15 GMT
Content-Type: application/zip
Content-Length: 48726637
Connection: keep-alive
Expires: 0
Cache-Control: must-revalidate, post-check=0, pre-check=0
Pragma: public
Cache-Control: private
Content-Disposition: attachment; filename="IP2LOCATION-LITE-DB11.CSV.ZIP"
Content-Transfer-Encoding: binary
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
Referrer-Policy: no-referrer-when-downgrade
Content-Security-Policy: default-src * data: 'unsafe-eval' 'unsafe-inline';frame-ancestors 'self';
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
请务必注意,Webclient
class 使用 RETR 命令下载 FTP 资源。对于 HTTP 资源,使用 GET 方法。这意味着,如果您向可下载文件提供不包含正确参数的 URL,您最终会遇到一些未处理的异常,因为 Webclient
已替换为 System.Net.Http.HttpClient
,我建议您改用它。
下面您可以看到 Webclient
如何工作的示例,在您的情况下,您会收到“无用错误”,因为您使用的是异步方法。我建议使用像下面这样的正常方法来调试并获得正确的异常。
public void downloadProgrambyURL(string url, string filename)
{
using (WebClient client = new WebClient())
{
var pathVariable = "%USERPROFILE%\Downloads\" + filename;
var filePath = Environment.ExpandEnvironmentVariables(pathVariable);
client.DownloadFile(url, filePath);
}
}
另外,我让thislink供大家参考。