viernes, 25 de febrero de 2011

ASP.NET - Determinar tamaño del archivo antes de descargarlo

FileDownload Si nos ponemos a analizar cómo podemos saber la longitud de un archivo sin antes haberlo descargado parece que fuera imposible, no es cierto?, dado que el archivo está en una ubicación remota…
Pero sí es posible ;)
dado que cada petición web que hacemos incluye un paquete de información adicional que es la metadata de la petición.
Entonces, lo que tenemos que hacer es solicitar precisamente la información solamente de esas cabeceras o HEAD, específicamente usaremos la cabecera Content-Length. Adicionalmente estoy incluyendo un par de métodos que me permiten formatear la cantidad numérica expresada en bytes que retorna del servidor.
Lo hacemos de la sgte manera:
protected void Page_Load(object sender, EventArgs e)
{
//url del archivo que queremos determinar su tamaño
string Url = "http://www.midominio.com/mi_archivo.zip";
System.Net.WebClient wc = new System.Net.WebClient();
System.IO.Stream stream = wc.OpenRead(Url);

double bytes = Convert.ToDouble(wc.ResponseHeaders["Content-Length"]);
Response.Write(FormatBytes(bytes));

stream.Close();
wc = null;
}

private string FormatBytes(double num_bytes)
{
const double ONE_KB = 1024;
const double ONE_MB = ONE_KB * 1024;
const double ONE_GB = ONE_MB * 1024;
const double ONE_TB = ONE_GB * 1024;
const double ONE_PB = ONE_TB * 1024;
const double ONE_EB = ONE_PB * 1024;
const double ONE_ZB = ONE_EB * 1024;
const double ONE_YB = ONE_ZB * 1024;

if (num_bytes <= 999)
{
return String.Format("{0:0} bytes", num_bytes);
}
else if (num_bytes <= ONE_KB * 999)
{
return ThreeNonZeroDigits(num_bytes / ONE_KB) + " " + "KB";
}
else if (num_bytes <= ONE_MB * 999)
{
return ThreeNonZeroDigits(num_bytes / ONE_MB) + " " + "MB";
}
else if (num_bytes <= ONE_GB * 999)
{
return ThreeNonZeroDigits(num_bytes / ONE_GB) + " " + "GB";
}
else if (num_bytes <= ONE_TB * 999)
{
return ThreeNonZeroDigits(num_bytes / ONE_TB) + " " + "TB";
}
else if (num_bytes <= ONE_PB * 999)
{
return ThreeNonZeroDigits(num_bytes / ONE_PB) + " " + "PB";
}
else if (num_bytes <= ONE_EB * 999)
{
return ThreeNonZeroDigits(num_bytes / ONE_EB) + " " + "EB";
}
else if (num_bytes <= ONE_ZB * 999)
{
return ThreeNonZeroDigits(num_bytes / ONE_ZB) + " " + "ZB";
}
else
{
return ThreeNonZeroDigits(num_bytes / ONE_YB) + " " + "YB";
}
}

private string ThreeNonZeroDigits(double value)
{
if (value >= 100)
{
return String.Format("{0}", value);
}
else if (value >= 10)
{
return String.Format("{0:0.0}", value);
}
else
{
return String.Format("{0:0.00}", value);
}
}
Espero que les sea de utilidad ;)

No hay comentarios.: