Descargando archivo sin enlace directo a través de C# Webclient
Estoy intentando descargar un archivo, pero el problema es que la URL no es un enlace directo al archivo zip, y mi código me muestra un error inútil.
Este es el código:
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] Descargar base de datos IP2Location");
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();
}
Si cambio la variable URL a un enlace directo, por ejemplo: https://speed.hetzner.de/10GB.bin, entonces el código funciona bien.
Si visito esta URL: https://www.ip2location.com/download/?token=REDACTED&file=DB11LITE, se descargará directamente un archivo con el nombre IP2LOCATION-LITE-DB11.CSV.ZIP.
Esta es la cabecera de respuesta cuando visito la URL en mi navegador:
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
davy.ai
Parece que el problema con el código radica en el hecho de que la URL proporcionada no enlaza directamente al archivo ZIP que se debe descargar. Una posible solución a este problema podría ser utilizar el cliente web para hacer una solicitud a la URL dada y luego buscar a través de su respuesta para encontrar el enlace de descarga directa.
Una vez que se encuentre el enlace de descarga directa, se puede utilizar el cliente web para descargar el archivo ZIP desde el enlace directo. Sin embargo, es importante tener en cuenta que el enlace de descarga directa puede ser dinámico y cambiar con frecuencia, por lo que el código deberá actualizarse en consecuencia.
Para lograr esto, se pueden seguir los siguientes pasos:
WebClient
para hacer una solicitud a la URL dada.WebClient
para descargar el archivo ZIP desde el enlace de descarga directa.Un ejemplo de cómo se podría implementar esto en C# utilizando la biblioteca
HtmlAgilityPack
para analizar la respuesta HTML: