Carga de archivos en ASP.NET 2.0 – tips

Limitaciones de tamaño de archivos

Quizás no lo note, pero existe un límite para el tamaño de los archivos que se pueden cargar mediante esta técnica. El límite predeterminado para los archivos que se cargan en el servidor con el control FileUpload es alrededor de 4 MB. No se puede cargar nada que supere ese límite.

Una de las grandes virtudes de .NET, no obstante, es que suele ofrecer alguna forma de superar las limitaciones. Por lo general, se puede modificar la configuración predeterminada. Para cambiar el límite de tamaño, debe realizar algunos cambios en el archivo web.config.comments (ubicado en la carpeta de configuración de ASP.NET 2.0, C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\CONFIG) o web.config de su aplicación.

En el archivo web.config.comments, busque el nodo <httpRuntime>, que es similar a éste:

<httpRuntime

 executionTimeout="110"

 maxRequestLength="4096"

 requestLengthDiskThreshold="80"

 useFullyQualifiedRedirectUrl="false"

 minFreeThreads="8"

 minLocalRequestFreeThreads="4"

 appRequestQueueLimit="5000"

 enableKernelOutputCache="true"

 enableVersionHeader="true"

 requireRootedSaveAsPath="true"

 enable="true"

 shutdownTimeout="90"

 delayNotificationTimeout="5"

 waitChangeNotification="0"

 maxWaitChangeNotification="0"

 enableHeaderChecking="true"

 sendCacheControlHeader="true"

 apartmentThreading="false" />

En este nodo ocurren muchas cosas, pero la configuración que se encarga del tamaño de los archivo que se cargan es el atributo maxRequestLength. El valor predeterminado es 4096 kilobytes (KB). Simplemente modifique el valor para aumentar el tamaño límite. Si desea poder cargar archivos de 10 megabytes (MB) en el servidor, configure el valor maxRequestLength en 11264, lo cual significa que la aplicación permitirá cargar archivos de hasta 11.000 KB.

Este cambio en el archivo web.config.comments aplica la configuración a todas las aplicaciones del servidor. Si desea aplicarla sólo a la aplicación con la que está trabajando, aplique este nodo en el archivo web.config de su aplicación reemplazando la configuración del archivo web.config.comments. Asegúrese de que este nodo se encuentre entre los nodos <system.web> del archivo de configuración.

Otra configuración involucrada en la limitación de tamaño de los archivos es el valor del atributo executionTimeout del nodo <httpRuntime>

El valor del atributo executionTimeout es la cantidad de segundos de carga permitidos antes de que ASP.NET la termine. Si permitirá cargar archivos más grandes, deberá incrementar este valor además del de maxRequestLength.

Una desventaja de aumentar el tamaño permitido es que hay piratas informáticos que atacan servidores enviándoles una gran cantidad de solicitudes. Para protegerse de esto, puede reducir el tamaño permitido o, de lo contrario, descubrirá cientos y hasta miles de solicitudes de 10 MB en el servidor.

Validación en el cliente de los tipos de archivos que se pueden cargar

Existen varios métodos para controlar los tipos de archivos que se pueden cargar en el servidor. Desafortunadamente, ninguno es infalible para protegerlo de la carga de archivos malintencionados. Sin embargo, existen pasos para simplificar un poco este proceso de permitir que los usuarios finales carguen archivos.

Un buen método es utilizar los controles de validación ASP.NET incluidos de forma gratuita con ASP.NET. Estos controles permiten realizar comprobaciones de expresiones regulares en los archivos cargados para ver si la extensión está permitida.

Esto es ideal para los exploradores que permiten el uso de controles de validación por parte de los clientes ya que obliga al cliente a realizar la comprobación y el archivo no se carga en el servidor si la firma no está permitida. En el listado 3 se muestra un ejemplo de uso de los controles de validación para llevar esto a cabo.

 

  Nota:

Aquí no se explica el uso de controles de validación. Consulte Validating ASP.NET Server Controls (en inglés) para obtener una explicación completa de los controles de validación y cómo utilizarlos en las páginas de ASP.NET.

 

Esta sencilla página de ASP.NET utiliza controles de validación para que el usuario final sólo pueda cargar archivos .mp3, .mpeg o .m3u en el servidor. Si se trata de otro tipo de archivo, un control Validation inicia una excepción en la pantalla. Esto se muestra en la figura 4.

 

 

Los controles Validation no son un método infalible para controlar qué archivos se cargan en el servidor. No es demasiado difícil sortear este sencillo modelo de seguridad. Basta con modificar la extensión de un archivo para que se lo acepte y se cargue en el servidor.

Validación de tipos de archivos en el servidor

Acaba de ver una forma sencilla de agregar controles de servidor de validación ASP.NET en su página de ASP.NET para que el cliente valide las extensiones de archivos (en forma de texto). Ahora veamos cómo realizar una operación similar en el servidor. Esto se muestra en el listado.

Listado 4. Comprobación del tipo de archivo en el servidor

 protected void btnUplaod_Click(object sender, EventArgs e)
    {
        StringBuilder sbServerPath = new StringBuilder(280);
        StringBuilder sbInfo = new StringBuilder(870);

        if (fuCustom.HasFile)
        {
            #region hasfile
            string fileExt = Path.GetExtension(fuCustom.FileName);

            sbServerPath.Append(Server.MapPath(VirtualPath));
            sbServerPath.Append(fuCustom.FileName);

            if (fileExt == ".mp3" || fileExt == ".mpeg")
            {
                try
                {
                    fuCustom.SaveAs(sbServerPath.ToString());
                    sbInfo.Append("File Name: ");
                    sbInfo.Append(fuCustom.PostedFile.FileName);
                    sbInfo.Append("<br>");
                    sbInfo.Append(fuCustom.PostedFile.ContentLength);
                    sbInfo.Append(" Kb <br>");
                    sbInfo.Append("Content Type: ");
                    sbInfo.Append(fuCustom.PostedFile.ContentType);

                    lblInfo.Text = sbInfo.ToString();
                }
                catch (Exception ex)
                {
                    lblInfo.Text = "Error: " + ex.Message;
                }
            }
            else
            {
                lblInfo.Text = "Only .mp3 and .mpeg files allowed!";
            }
            #endregion
        }
        else
        {
            lblInfo.Text = "You have not specified a file.";
        }
    }

 
Ahora, al utilizar el método GetExtension del espacio de nombres System.IO.Path, puede básicamente llevar a cabo la misma operación. Es importante señalar que esto no evita que el usuario final pueda modificar la extensión del archivo y cargarlo en el servidor de alojamiento.

Carga simultánea de varios archivos

Hasta aquí, hemos visto buenos ejemplos de cómo cargar un archivo en el servidor sin grandes inconvenientes. Ahora veamos cómo cargar en el servidor varios archivos de una misma página.

Microsoft .NET Framework no posee una función que permita cargar varios archivos desde una página de ASP.NET. De todas formas, con un poco de trabajo se puede lograr fácilmente al igual que en el pasado al utilizar .NET 1.x.

La clave es importar la clase System.IO en su página de ASP.NET y luego utilizar la clase HttpFileCollection para capturar todos los archivos enviados junto al objeto Request. Esto permite cargar todos los archivos que uno desee de una misma página.

protected void btnFileUploads_Click(object sender, EventArgs e)

{

StringBuilder sbServerPath = null;

HttpFileCollection uploadedFiles = Request.Files;

StringBuilder sbInfo = new StringBuilder(780);

for (int i = 0; i < uploadedFiles.Count; i++)

{

HttpPostedFile userPostedFile = uploadedFiles[i];

sbServerPath =

new StringBuilder(280);

sbServerPath.Append(Server.MapPath(VirtualPath));

try

{

if (userPostedFile.ContentLength > 0)

{

sbInfo.Append(

"<u>File #");

sbInfo.Append(i + 1);

sbInfo.Append(

"</u><br>");

sbInfo.Append(

"File Content Type: ");

sbInfo.Append(userPostedFile.ContentType);

sbInfo.Append(

"<br>");

sbInfo.Append(

"File Size: ");

sbInfo.Append(userPostedFile.ContentLength);

sbInfo.Append(

"kb <br>");

sbInfo.Append(

"File Name: ");

sbInfo.Append(userPostedFile.FileName);

sbInfo.Append(

"<br>");

sbServerPath.Append(

Path.GetFileName(userPostedFile.FileName));

userPostedFile.SaveAs(sbServerPath.ToString());

sbInfo.Append(

"Location where saved: ");

sbInfo.Append(Server.MapPath(VirtualPath));

sbInfo.Append(

Path.GetFileName(userPostedFile.FileName));

}

}

catch (Exception ex)

{

lblInfo.Text =

"Error: " + ex.Message;

}

}

}

 

 usuario final puede seleccionar hasta cuatro archivos y hacer clic en el botón Cargar archivos, que inicializa el evento btnFileUploads_Click. Utilizar la clase HttpFileCollection con la propiedad Request.Files permite controlar todos los archivos cargados de la página. Cuando los archivos se encuentran en este estado, puede hacer lo que quiera con ellos. En este caso, las propiedades de los archivos se examinan y se escriben en la pantalla. Finalmente, los archivos se guardan en la carpeta Uploads del directorio raíz del servidor. En la figura 5 se ilustra el resultado de esta acción.

 

About justindeveloper

I am MCP (Microsoft Certified Professional). MCTS (Microsoft Certified Technology Specialist) and MCPD (Microsoft Certified Professional Developer), also I am SAP Business One Certified!! Desarrollando desde el IDE de Visual Studio NET 2003 hasta ahora con el Visual Studio NET 2010. Desde Microsoft SQL Server 2000 hasta ahora con el Microsoft SQL Server 2008 R2 y tambien con SharePoint, desde WSS 3.0 y MOSS 2007 y ahora familirizandome con el Sharepoint Foundation 2010 & Sharepoint Server 2010. The software development will follow being every time more wonderful!
This entry was posted in Development. Bookmark the permalink.

2 Responses to Carga de archivos en ASP.NET 2.0 – tips

  1. Ricardo says:

    Se puede crear un foro en visual studio 2008, si es asi, cual es el objeto que debo utilizar, para enlace desde una base de datos sql server 2005?

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s