Cómo cargar un archivo en un servidor web en ASP.NET mediante Visual C# .NET

Seleccione idioma Seleccione idioma
Id. de artículo: 323246 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

En esta página

Resumen

En este artículo paso a paso se describe cómo cargar un archivo en un servidor web mediante Visual C# .NET. En este artículo se crea un archivo ASP.NET (WebForm1.aspx) de Microsoft y su archivo de código subyacente relacionado (WebForm1.aspx.cs) para cargar los archivos en un directorio denominado Data.


Crear la aplicación ASP.NET

En Microsoft Visual Studio .NET, siga estos pasos para crear una aplicación nueva y cargar los archivos en el servidor web:
  1. Inicie Microsoft Visual Studio .NET.
  2. En el menú Archivo, seleccione Nuevo y haga clic enProyecto.
  3. En el cuadro de diálogo Nuevo proyecto, haga clic en Proyectos Visual C# en Tipos de proyecto y, después, haga clic en Aplicación Web ASP.NET en Plantillas.
  4. En el cuadro Ubicación, escriba la dirección URL para crear el proyecto. En este ejemplo, escriba http://localhost/CSharpUpload, que crea el nombre de proyecto predeterminado CSharpUpload. Observe que el archivo WebForm1.aspx se carga en la vista Diseñador de Visual Studio .NET.

Crear el directorio Data

Después de crear la aplicación, crea el directorio Data que aceptará los archivos cargados. Después de crear este directorio, también debe establecer permisos de escritura para la cuenta de trabajo ASPNET.
  1. En la ventana Explorador de soluciones de Visual Studio .NET, haga clic con el botón secundario en CSharpUpload, seleccione Agregar y haga clic en Nueva carpeta. De forma predeterminada, se crea una carpeta nueva denominada NewFolder1.
  2. Para cambiar el nombre de la carpeta a Data, haga clic con el botón secundario en NewFolder1, haga clic en Cambiar nombre y, después, escriba Data.
  3. Inicie el Explorador de Windows y busque la carpeta del sistema de archivos Data que creó en el paso 2. De forma predeterminada, esta carpeta se encuentra en la carpeta siguiente:
    C:\Inetpub\wwwroot\CSharpUpload\Data
  4. Para cambiar la configuración de seguridad para conceder permisos de escritura al directorio Data, haga clic con el botón secundario en Data y haga clic en Propiedades.
  5. En el cuadro de diálogo Propiedades de Data, haga clic en la pestaña Seguridad y después en Agregar.
  6. En el cuadro de diálogo Seleccionar usuarios o grupos, haga clic en la cuenta ASPNET y, después, en Agregar. Haga clic en Aceptar para cerrar el cuadro de diálogo Seleccionar usuarios o grupos.
  7. Haga clic en la cuenta cuenta aspnet_wp (nombre_equipo\ASPNET) y haga clic para activar las casillas de verificación Permitir de los permisos siguientes:

    • Lectura y ejecución
    • Mostrar el contenido de las carpetas
    • Lectura
    • Escritura

    Haga clic para desactivar las demás casillas de verificación Permitir y Denegar.
  8. Haga clic en Aceptar para cerrar el cuadro de diálogo Propiedades de Data. Ha modificado correctamente los permisos del directorio Data para aceptar los archivos cargados por los usuarios.

Modificar la página WebForm1.aspx

Para modificar el código HTML del archivo WebForm1.aspx de modo que se permita a los usuarios cargar archivos, siga estos pasos:
  1. Vuelva a la sesión abierta de Visual Studio .NET. WebForm1.aspx debe abrirse en la ventana Diseñador.
  2. Para ver el código HTML de la página WebForm1.aspx , haga clic con el botón secundario en WebForm1.aspx en la ventana Diseñador y, después, haga clic en Ver código fuente HTML.
  3. Busque el código HTML siguiente, que contiene la etiqueta <form>:
    <form id="Form1" method="post" runat="server">
    					
  4. Agregue el atributo name-value enctype="multipart/form-data" a la etiqueta <form> como se indica a continuación:
    <form id="Form1" method="post" enctype="multipart/form-data" runat="server">
    					
  5. Después de la etiqueta <form> de apertura, agregue el código siguiente:
    <INPUT type=file id=File1 name=File1 runat="server" />
    <br>
    <input type="submit" id="Submit1" value="Upload" runat="server" />
    					
  6. Compruebe que la etiqueta HTML <form> aparece así:
    <form id="Form1" method="post" enctype="multipart/form-data" runat="server">
    <INPUT type=file id=File1 name=File1 runat="server" />
    <br>
    <input type="submit" id="Submit1" value="Upload" runat="server" />
    </form>
    					

Agregar el código de la carga al archivo de código subyacente WebForm1.aspx.cs

Para modificar el archivo de código subyacente WebForm1.aspx.cs de modo que acepte los datos cargados, siga estos pasos:
  1. En el menú Ver, haga clic en Diseño.
  2. Haga doble clic en Cargar. Visual Studio abre el archivo de código subyacente WebForm1.aspx.cs y genera automáticamente el código del método siguiente:
    private void Submit1_ServerClick(object sender, System.EventArgs e)
    {
    
    
    }
  3. Compruebe que el código siguiente existe en las clases del archivo WebForm1.cs:
    protected System.Web.UI.HtmlControls.HtmlInputFile File1;
    protected System.Web.UI.HtmlControls.HtmlInputButton Submit1;
    						
    Si este código no existe en el archivo, agregue el código al archivo después de la línea siguiente:
    public class WebForm1 : System.Web.UI.Page
    {
    					
  4. Ubique el código siguiente:
    private void Submit1_ServerClick(object sender, System.EventArgs e)
    {
    					
  5. Presione ENTRAR para agregar una línea en blanco y agregue el código siguiente:
    if( ( File1.PostedFile != null ) && ( File1.PostedFile.ContentLength > 0 ) )
    {
    	string fn = System.IO.Path.GetFileName(File1.PostedFile.FileName);
    	string SaveLocation = Server.MapPath("Data") + "\\" +  fn;
    	try
    	{
    		File1.PostedFile.SaveAs(SaveLocation);
    		Response.Write("El archivo se ha cargado.");
    	}
    	catch ( Exception ex )
    	{
    		Response.Write("Error : " + ex.Message);
    		//Nota: Exception.Message devuelve un mensaje detallado que describe la excepción actual. 
    		//Por motivos de seguridad, no se recomienda devolver Exception.Message a los usuarios finales de 
    		//entornos de producción. Sería más aconsejable poner un mensaje de error genérico. 
    	}
    }
    else
    {
    	Response.Write("Seleccione un archivo que cargar.");
    }
    Este código comprueba primero que se ha cargado un archivo. Si no se seleccionó ningún archivo, recibe el mensaje "Seleccione un archivo que cargar.". Si se carga un archivo válido, su nombre se extrae con el espacio de nombres System.IO y su destino se reúne en una ruta de acceso SaveAs. Cuando se conozca el destino final, el archivo se guarda con el método File1.PostedFile.SaveAs. Se captura una excepción y el mensaje de la misma se muestra en la pantalla.
  6. Compruebe que la subrutina Submit1 aparece como sigue:
    private void Submit1_ServerClick(object sender, System.EventArgs e)
    {
    	if( ( File1.PostedFile != null ) && ( File1.PostedFile.ContentLength > 0 ) )
    	{
    		string fn = System.IO.Path.GetFileName(File1.PostedFile.FileName);
    		string SaveLocation = Server.MapPath("Data") + "\\" +  fn;
    		try
    		{
    			File1.PostedFile.SaveAs(SaveLocation);
    			Response.Write("El archivo se ha cargado.");
    		}
    		catch ( Exception ex )
    		{
    			Response.Write("Error : " + ex.Message);
    			//Nota: Exception.Message devuelve un mensaje detallado que describe la excepción actual. 
    			//Por motivos de seguridad, no se recomienda devolver Exception.Message a los usuarios finales de 
    			//entornos de producción. Sería más aconsejable poner sólo un mensaje de error genérico. 
    		}
    	}
    	else
    	{
    		Response.Write("Seleccione un archivo que cargar.");
    	}
    }

Probar la aplicación

Para generar la solución de Visual Studio .NET y probar la aplicación, siga estos pasos:
  1. En el menú Generar, haga clic en Generar solución.
  2. En el Explorador de soluciones, haga clic con el botón secundario en WebForm1.aspx y, después, haga clic en Ver en el explorador.
  3. Cuando WebForm1.aspx se abra en el explorador, haga clic en Examinar.
  4. En el cuadro de diálogo Elegir archivo, seleccione un archivo menor de 4 megabytes (MB) y haga clic en Abrir.
  5. Para cargar el archivo, haga clic en Cargar. Observe que el archivo se carga en el servidor web y que recibe el mensaje "El archivo se ha cargado".
  6. Vuelva a la sesión abierta del Explorador de Windows y busque el directorio Data.
  7. Compruebe que el archivo se ha cargado en el directorio Data.

Cargar los archivos más grandes

De forma predeterminada, ASP.NET solo permite que se carguen en el servidor web los archivos de 4.096 kilobytes (KB) (o 4 MB) o menos. Para cargar archivos más grandes, debe cambiar el parámetro maxRequestLength de la sección <httpRuntime> del archivo Web.config.

Nota: cuando el atributo maxRequestLength se establece en el archivo Machine.config y después se expone una solicitud (como la carga de un archivo) que supera el valor de maxRequestLength, no se puede mostrar una página de errores personalizados. En su lugar, Microsoft Internet Explorer mostrará un mensaje de error "No se puede encontrar el servidor o DNS".

Si desea cambiar esta opción en todo el equipo y no solo en esta aplicación ASP.NET, debe modificar el archivo Machine.config.

De forma predeterminada, el elemento <httpRuntime> se establece en los parámetros siguientes del archivo Machine.config:
<httpRuntime 
executionTimeout="90" 
maxRequestLength="4096"
useFullyQualifiedRedirectUrl="false" 
minFreeThreads="8" 
minLocalRequestFreeThreads="4"
appRequestQueueLimit="100"
/>
				
El archivo Machine.config se encuentra se encuentra en el directorio \Raíz del sistema\Microsoft.NET\Framework\Número de versión\CONFIG.


Lista de código completo

WebForm1.aspx

<%@ Page language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false" Inherits="CSharpUpload.WebForm1" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
  <HEAD>
    <title>WebForm1</title>
    <meta name="GENERATOR" Content="Microsoft Visual Studio 7.0">
    <meta name="CODE_LANGUAGE" Content="C#">
    <meta name=vs_defaultClientScript content="JavaScript">
    <meta name=vs_targetSchema content="http://schemas.microsoft.com/intellisense/ie5">
  </HEAD>
  <body MS_POSITIONING="GridLayout">
<form id="Form1" method="post" enctype="multipart/form-data" runat="server">
<INPUT type=file id=File1 name=File1 runat="server" >
<br>
<input type="submit" id="Submit1" value="Upload" runat="server" NAME="Submit1">
</form>

	
  </body>
</HTML>
				

WebForm1.aspx.cs

using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;

namespace CSharpUpload
{
	/// <summary>
	/// Descripción del resumen de WebForm1.
	/// </summary>
	public class WebForm1 : System.Web.UI.Page
	{
		protected System.Web.UI.HtmlControls.HtmlInputFile File1;
		protected System.Web.UI.HtmlControls.HtmlInputButton Submit1;
	
		private void Page_Load(object sender, System.EventArgs e)
		{
			// Colocar el código de usuario para inicializar la página aquí
		}

		#region Web Form Designer generated code
		override protected void OnInit(EventArgs e)
		{
			// 
			// CODEGEN: El Diseñador de formularios Web Forms ASP.NET requiere esta llamada.
			// 
			InitializeComponent();
			base.OnInit(e);
		}
		
		/// <summary>
		/// Método requerido para la compatibilidad del Diseñador - no modificar
		/// el contenido de este método con el editor de código.
		/// </summary>
		private void InitializeComponent()
		{    
			this.Submit1.ServerClick += new System.EventHandler(this.Submit1_ServerClick);
			this.Load += new System.EventHandler(this.Page_Load);

		}
		#endregion

		private void Submit1_ServerClick(object sender, System.EventArgs e)
		{
			if( ( File1.PostedFile != null ) && ( File1.PostedFile.ContentLength > 0 ) )
			{
				string fn = System.IO.Path.GetFileName(File1.PostedFile.FileName);
				string SaveLocation = Server.MapPath("Data") + "\\" +  fn;
				try
				{
					File1.PostedFile.SaveAs(SaveLocation);
					Response.Write("El archivo se ha cargado.");
				}
				catch ( Exception ex )
				{
					Response.Write("Error : " + ex.Message);
					//Nota: Exception.Message devuelve un mensaje detallado que describe la excepción actual. 
					//Por motivos de seguridad, no se recomienda devolver Exception.Message a los usuarios finales de 
					//entornos de producción. Sería más aconsejable devolver un mensaje de error genérico. 
				}
			}
			else
			{
				Response.Write("Seleccione un archivo que cargar.");
			}
		}
	}
}
	

Más información

En teoría, el tamaño máximo del archivo cargado es bastante grande. Sin embargo, debido a la supervisión del estado de ASP.NET, no puede cargar archivos muy grandes en ASP.NET. El proceso de trabajo de ASP.NET tiene un espacio de direcciones virtuales de 2 gigabytes (GB). Sin embargo, el proceso de trabajo de ASP.NET solo usa un poco más de 1 GB debido a la supervisión del estado y la fragmentación de la memoria.

Durante el proceso de carga, ASP.NET carga todo el archivo en la memoria para que el usuario pueda guardarlo en el disco. Por lo tanto, el proceso puede reciclarse debido al atributo memoryLimit de la etiqueta processModel del archivo Machine.config. El atributo memoryLimit especifica el porcentaje de memoria física que el proceso de trabajo puede utilizar antes de que el proceso se recicle automáticamente. El reciclaje impide que las pérdidas de memoria hagan que ASP.NET se bloquee o deje de responder.

Además, hay más factores que influyen en el tamaño de archivo máximo que se puede descargar. Estos factores son, entre otros, la memoria y el espacio de disco duro disponibles, la velocidad del procesador y el tráfico de red actual. Con un tráfico normal en la descarga de archivos, Microsoft recomienda usar un tamaño de archivo máximo de entre 10 y 20 megabytes (MB). Si carga archivos muy de vez en cuando, el tamaño máximo podría ser de 100 MB.

Nota: puede cargar archivos mayores de 100 MB en ASP.NET. Sin embargo, Microsoft recomienda seguir los tamaños máximos de carga de archivos que se mencionan en este artículo. Para determinar tamaños más precisos, realice pruebas de utilización en equipos similares a los que se vayan a usar en producción.

Puede que observe los mensajes de error siguientes si encuentra límites de tamaño de archivo durante el proceso de carga de archivos:
  • No se puede mostrar la página.
  • Aplicación de servidor no disponible
    En el registro de errores, el mensaje de error será similar al siguiente:

    aspnet_wp.exe (PID:PID) se recicló porque el consumo de memoria sobrepasó límite_tamaño MB (porcentaje por ciento de RAM disponible).

  • Se emitió la excepción de tipo System.OutOfMemoryException.
También puede encontrarse que las cargas son muy lentas. Si observa el proceso Aspnet_wp.exe en el Administrador de tareas de Windows, apreciará que la diferencia de memoria cambia en 64 KB cada 1 o 2 segundos. Según el tamaño del archivo, este retraso puede hacer que el proceso de trabajo de ASP.NET se recicle debido a un error de responseDeadlock.

Referencias

Para obtener información adicional, visite los siguientes sitios web de Microsoft Developer Network (MSDN);elemento
<httpRuntime>
http://msdn.microsoft.com/es-es/library/e1f13641(vs.71).aspx

Elemento INPUT | objeto input
http://msdn.microsoft.com/es-es/library/ms535260(VS.85).aspx

Atributo ENCTYPE | propiedad enctype
http://msdn.microsoft.com/es-es/library/ms533745.aspx

Clase HtmlInputFile
http://msdn.microsoft.com/es-es/library/system.web.ui.htmlcontrols.htmlinputfile(vs.71).aspx

Propiedad HtmlInputFile.PostedFile
http://msdn.microsoft.com/es-es/library/system.web.ui.htmlcontrols.htmlinputfile.postedfile(vs.71).aspx
Nota: es un artículo de "PUBLICACIÓN RÁPIDA" creado directamente por la organización de soporte técnico de Microsoft. La información aquí contenida se proporciona como está, como respuesta a problemas que han surgido. Como consecuencia de la rapidez con la que lo hemos puesto disponible, los materiales podrían incluir errores tipográficos y pueden ser revisados en cualquier momento sin previo aviso. Vea las Condiciones de uso para otras consideraciones

Propiedades

Id. de artículo: 323246 - Última revisión: miércoles, 26 de marzo de 2014 - Versión: 1.0
La información de este artículo se refiere a:
  • Microsoft ASP.NET 1.0
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft ASP.NET 1.1
  • Microsoft Visual C# .NET 2003 Standard Edition
Palabras clave: 
kbhowtomaster KB323246

Enviar comentarios

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com