Cargar un archivo con FileUpload en ASP.NET C#
En ambientes web podemos cargar un archivo con FileUpload en ASP.NET y C#, el control permite obtener los bytes y datos generales del archivo cargado.
FileUpload es un control de ASP.NET que permite seleccionar desde el equipo local un archivo y enviarla al servidor para su manipulación con C#.
Recomendaciones
Al utilizar este control, considera algunas recomendaciones para no afectar el rendimiento de tu aplicación.
- Tamaño máximo de archivos es de 4 MB.
- No cambiar la ubicación del archivo seleccionado hasta terminar su manejo.
- Puedes cargar prácticamente cualquier archivo.
Agregar los controles en la página aspx
Coloquemos los controles necesarios en la página aspx, primero agreguemos el control FileUpload para seleccionar los archivos:
<asp:FileUpload ID="fuArchivo" runat="server" />
- Definir la propiedad ID, para identificarlo desde el servidor.
- Además de la propiedad runat, permite que el control sea visible desde el servidor.
Para cargar el archivo seleccionado necesitamos de un control que ejecute la acción de obtener los datos.
Para ello agregaremos un botón, realizara un evento en el servidor al ser presionado:
<asp:Button ID="btnCargarArchivo" runat="server" Text="Cargar archivo" OnClick="btnCargarArchivo_Click" />
- Coloco propiedades básicas para trabajar desde el servidor.
- El texto sobre el botón será “Cargar archivo”.
- La propiedad OnClick ejecuta un evento en el servidor, en ese evento obtendremos todos los datos del archivo cargado.
Podría interesarte Publicar aplicación web en Azure con Visual Studio 2017
Cargar archivo desde C#
Ahora desde el código C# de la página aspx, agregaremos el código necesario para obtener los datos del archivo, primero agreguemos los espacios de nombres necesarios:
using System.IO;
Buscamos el evento OnClick del botón creado al agregar el botón, o crearlo como sigue:
protected void btnCargarArchivo_Click(object sender, EventArgs e)
{
}
Dentro del método anterior colocaremos las operaciones necesarias para cargar el archivo seleccionado.
Declarare tres variables para guardar los datos del archivo:
Byte[] Archivo = null;
string nombreArchivo = string.Empty;
string extensionArchivo = string. Empty;
Para evitar algún conflicto cuando no se seleccione ningún archivo, verificamos que el control FileUpload este cargado:
if (fuArchivo.HasFile == true)
{
}
Dentro del if voy a obtener los datos del archivo, primero recuperare los bytes del archivo seleccionado:
using (BinaryReader reader = new BinaryReader(fuArchivo.PostedFile.InputStream))
{
Archivo = reader.ReadBytes(fuArchivo.PostedFile.ContentLength);
}
- Verificamos si la información leída corresponde a datos binarios.
- Asignamos en la variable Archivo los bytes leídos del archivo seleccionado.
Quiero recuperar también el nombre del archivo, para ello realizo lo siguiente:
nombreArchivo = Path.GetFileNameWithoutExtension(fuArchivo.FileName);
- Mediante el método GetFileNameWithoutExtension obtengo únicamente el nombre del archivo sin extensión.
Por último, quiero recuperar la extensión del archivo, utilizare el código siguiente:
extensionArchivo = Path.GetExtension(fuArchivo.FileName);
- Con el método GetExtension obtengo la extensión con punto, por ejemplo .pdf.
El código completo del evento clic del botón quedara de la siguiente manera:
protected void btnCargarArchivo_Click(object sender, EventArgs e)
{
Byte[] Archivo = null;
string nombreArchivo = string.Empty;
string extensionArchivo = string.Empty;
if (fuArchivo.HasFile == true)
{
using (BinaryReader reader = new
BinaryReader(fuArchivo.PostedFile.InputStream))
{
Archivo = reader.ReadBytes(fuArchivo.PostedFile.ContentLength);
}
nombreArchivo = Path.GetFileNameWithoutExtension(fuArchivo.FileName);
extensionArchivo = Path.GetExtension(fuArchivo.FileName);
}
}
Con estos datos puedes manipular en tiempo de ejecución el archivo o también guardarlo en una base de datos.
Para más información de este control puedes consultar la documentación oficial.
hay una forma mas corta de hacerlo, les dejo el código
protected void btnCargarImagen_Click(object sender, EventArgs e)
{
string nombreArchivo=string.Empty;
string destino = @”~/Noticias/”;//poner la ruta donde quieres que quede el archivo
if (fuimagen.HasFile)
{
string carpetaDestino = Server.MapPath(destino);
nombreArchivo = System.IO.Path.GetFileName(fuimagen.PostedFile.FileName);
string SaveLocation = carpetaDestino + nombreArchivo;
//guardamos el archivo
fuimagen.PostedFile.SaveAs(SaveLocation);
}
}
Omitiendo algunas variables se puede simplificar el código, como lo muestras; gracias por tu aporte.
No solo eso, el articulo no graba el archivo, solo se queda con los Bytes en la mano 😀
Existe alguna forma de analizar el archivo antes de subirlo, esto para evitar que nos suban archivos con malware.
No estoy seguro sobre si es posible analizar los archivos antes de cargarlos al servidor, lo que puedes hacer es guardar estos archivos como binarios en una base de datos, de esta manera evitas que se ejecuten.
pregunta, a mi me marca un error diciendo que el nombre del respectivo id que asigno al fileupload no existe y me da error, intente arreglarlo instanciando el form, pero me dice el nivel de proteccion no deja que accesar a el, alguna ayuda?
Verifica que la propiedad runat este en el control fileupload, además comprueba que en la propiedad codebehind del aspx se este asignando la clase donde estas utilizando el control.
Hola, soy nuevo, intento hacer este procedimiento pero no se como crear el segundo archivo que explicas
Que tal, un archivo WebForm consta de dos partes el archivo aspx que contiene el código html y la clase C#; con el segundo archivo te refieres a la clase C#, para acceder a el da clic derecho sobre el archivo aspx y seleccione Ver código (o presiona F7)
gracias por tu respuesta, estuve buscando la forma y nomas no doy con la clase, estoy usando visual estudio Community 2019, tendra algo que ver con la versión?
eso me tiene detenido para poder realizar esta función
En cualquier versión de visual studio es igual, también estoy utilizando la 2019;
Crea un proyecto web de tipo WebForm(es la que utilizo en el ejemplo), se agregan las paginas aspx de la siguiente forma:
En el proyecto el archivo aparece de la siguiente manera:
Expandiendo el archivo aspx puedes ver la clase C#
Ahora entiendo, es que mi proyecto no esta creado de esta forma por esa razón no me muestra la clase, creo que tendria que cambiar el tipo de proyecto?
¿Qué tipo de proyecto creaste? ya que no es webform
si necesitas esta función puedes cambiar, en caso contrario debes buscar esta misma función para el el tipo de proyecto que creaste
son un grupo de archivos .aspx en una sola carpeta así como se guardan los php, en el servidor esta configurado para que busque el index, es un proyecto local de intranet
Por lo que me explicas entiendo que intentas hacer cambios en un deploy (proyecto listo para publicarlo), si ese es el caso, no podrás ver los archivos como lo mencione arriba; una opción será que crees un nuevo proyecto y copies el código fuente de los archivos que tienes.
pregunta como puedo hacer eso posible sin nesecidad de ese boton axu si no que automaticamente cuando yo eligo la imagen la suba al servidor
Con este control no se puede hacer lo que necesitas, sin embargo, puedes revisar la carga de archivos por medio de Ajax específicamente la librería de AjaxControlToolkit.
Y si necesito este método para varios archivos, es decir necesito cargar varios archivos, como hacer para que este método me sirva para todos y no tener que andar repitiendo código.
Hola, si quieres usar este código, puedes crear métodos que le envíes el nombre del control para que reciba los datos del archivo; haciendo esto puedes reutilizar el código sin repetir. Sin embargo, si quieres cargar varios archivos con un único cargador, esta opción no lo puede hacer, tendrías que utilizar una librería de ajax.
Tengo que subir dos archivos, en el primero uso estos controles y el primer objeto cuando le doy el hasfile me manda true y jala todo bien, en el segundo control file upload, cuando le doy el hasfile me lo manda en false aunque si tenga un archivo, que puede ser?
Intenta con utilizar variables distintos para cada Fileupload