Você está na página 1de 7

Cargar/Descargar archivos a SQL Server con ASP.

NET
Posted: 6 junio, 2011 in .Net, Base de Datos, Desarrollo de Software Etiquetas: ASP.NET, Microsoft SQL Server

Cuando requerimos subir archivos a nuestro servidor web y estos posteriormente estn disponibles para su descargas, debemos considerar la gestin de la seguridad para los directorios en los que se almacenarn estos archivos. Ms an, en un sistema que cuenta con varios roles de usuario, tal administracin en la seguridad se complica; si nuestro servidor web, es un servicio de hosting proporcionado por un tercero, no siempre tendremos la posibilidad de administrar por completo los servicios que se nos ofrece.

Una buena medida alternativa, es almacenar nuestros archivos en el formato de base de datos que estemos utilizando. De esa forma simplificamos un poco la gestin y medidas de seguridad que deberamos implementar.

As que, cmo haramos este proceso para MS SQL Server y ASP.NET? Veamos un ejemplo muy sencillo pero prtico Vamos a suponer que ya se cuentan con los conocimientos necesarios de acceso a datos con ASP.NET y ADO.NET, y no vamos a enfocarnos en el modelado correcto de la aplicacin, recordemos que deberamos dividir la interfaz de usuario de las reglas de negocio.

Diseando base de datos y aplicacin web:

La base de datos se llamar Test. Tendr una tabla llamada dbFiles con un campo Id como clave primaria autonumrica, y un campo Archivo de tipo image donde almacenaremos los bytes del archivo. Es decir, tendremos lo siguiente: CREATE TABLE [dbo].[dbFiles]( [Id] [int] IDENTITY(1,1) NOT NULL, [Archivo] [image] NOT NULL, CONSTRAINT [PK_dbFiles] PRIMARY KEY CLUSTERED ([Id] ASC)) El sitio web contendr slo dos pginas web. Upload.aspx se utilizar para cargar los archivos y mostrar en un Grid View los archivos que se han subido. Download.aspx recibir desde la url una variable con el id para descargar cierto archivo. Comencemos a codificar:

Cargar archivos:

Creamos la pgina web Upload.aspx. Agregamos un control asp:FileUpload con su correspondiente botn Cargar:

<asp:FileUpload ID="fileUpload" runat="server" /><asp:Button ID="btnUpload" runat="server" Text="Cargar" onclick="btnUpload_Click" /> Adems agreguemos un control asp:GridView que mostrar los archivos que se han subido. Cada vez que pulsemos el botn cargar, debemos recargar este grid. El grid slo tendr dos columnas; la primer columna mostrar el Id de los archivos, mientras que la segunda columna ser de tipo asp:HyperLinkField y nos direccionar hacia la pgina Download.aspx?id=?, de la siguiente manera: <asp:GridView ID="gvFiles" runat="server" AutoGenerateColumns="false"> <Columns> <asp:BoundField DataField="Id" HeaderText="Archivo" /> <asp:HyperLinkField DataNavigateUrlFields="Id" DataNavigateUrlFormatString="Download.aspx?Id={0}" NavigateUrl="~/Download.aspx" HeaderText="" Text="Descargar" /> </Columns> </asp:GridView> Ahora vamos a nuestro code-behind en el evento Page_Load de Upload.aspx llenamos nuestro grid con los archivos que se han subido (recuerden que para este caso no separamos la interfaz de usuario de las reglas de negocio ni acceso a datos, cosa que debe hacerse).. Ya deberamos conocer como llenar nuestro Grid View y nuestra cadena de conexin previamente configurada en el web.config de la aplicacin web, un ejemplo de cmo llenarlo es el siguiente mtodo: public void fillFilesGridView() { using (System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["MSSQLServer"] .ConnectionString)) using (System.Data.SqlClient.SqlDataAdapter da = new System.Data.SqlClient.SqlDataAdapter("SELECT * FROM dbFiles", conn)) using (System.Data.DataSet dataSet = new System.Data.DataSet()) { try { conn.Open(); da.Fill(dataSet); gvFiles.DataSource = dataSet; gvFiles.DataBind(); } catch (System.Data.SqlClient.SqlException ex) { //El cdigo de tratamiento de error aqu } }

} Por lo que el evento Page_Load quedara: protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) fillFilesGridView(); } Y en el evento Click del botn Cargar, ejecutaremos la sentencia SQL para insertar el archivo cargado por el usuario en el File Upload, no sin antes realizar unas pequeas comprobaciones, como vemos: protected void btnUpload_Click(object sender, EventArgs e) { //Revisamos que se haya seleccionado un archivo if (!string.IsNullOrEmpty(fileUpload.FileName)) { //Obtenemos el nombre del archivo al que hace referencia nuestro control string path = System.IO.Path.GetFileName(fileUpload.PostedFile.FileName); //Revisamos que no exceda los 4MB [Valor que se puede cambiar en el web.config if (fileUpload.PostedFile.ContentLength <= 4000000) { //Podemos incluso aceptar slo archivos que tengan determinada extensin como *.pdf if (System.IO.Path.GetExtension(path).ToLower().Equals(".pdf")) { //Insertamos el archivo a la base de datos: using (System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["MSSQLServer"] .ConnectionString)) using (System.Data.SqlClient.SqlCommand cmd = conn.CreateCommand()) { try { //Abrimos la conexin y colocamos la sentencia SQL conn.Open(); cmd.CommandText = "INSERT INTO dbFiles(Archivo) VALUES (@archivo);"; //Poner atencin a la siguiente lnea; recuperamos la secuencia de bytes desde el control asp:FileUpload cmd.Parameters.Add(new System.Data.SqlClient.SqlParameter("archivo", fileUpload.FileBytes)); cmd.ExecuteNonQuery();

//Recargamos el grid view fillFilesGridView();

} catch (System.Data.SqlClient.SqlException ex) { //El cdigo de tratamiento de error aqu } } } } } } Descargar archivos: Cuando hacemos clic en alguno de los enlaces del grid view llenado previamente, nos direcciona a la pgina Download.aspx?Id=?, donde Id ser el identificador del archivo que queremos descargar. Por lo tanto, en el evento Page_Load tendremos: protected void Page_Load(object sender, EventArgs e) { if (!string.IsNullOrEmpty(Request.QueryString["id"])) { int fileID = 0; //Damos tratamiento a la cadena de entrada para evitar sql injection o //podemos utilizar parmetros como hicimos para llenar el gridview if (int.TryParse(Request.QueryString["id"], out fileID)) { //Consultamos la base de datos para recuperar la secuencia de bytes del archivo byte[] myFile = null; using (System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["MSSQLServer"] .ConnectionString)) using (System.Data.SqlClient.SqlDataAdapter da = new System.Data.SqlClient.SqlDataAdapter(string.Format("SELECT Archivo FROM dbFiles WHERE Id = {0};", fileID), conn)) using (System.Data.DataSet ds = new System.Data.DataSet()) { try { conn.Open(); da.Fill(ds, "dbFiles"); System.Data.DataRow row = ds.Tables["dbFiles"].Rows[0]; myFile = (byte[])row["Archivo"];

} catch (Exception ex) { //Tratamiento de errores } }

//Aadimos al encabezado la informacin de nuestro archivo Response.AddHeader("Content-Disposition", "attachment;filename=myfile.pdf"); Response.ContentType = "application/pdf"; //finalmente escribimos los bytes en la respuesta de la pgina web Response.BinaryWrite(myFile); } } } Con esto, automticamente descargaramos el archivo myfile.pdf que deber ser un archivo que subimos previamente. Hasta aqu este pequeo ejemplo.

1.

amigo podrias inviarme el proyecto de esto me seria de gran utilidad

Luis dice: 6 junio, 2011 a las 8:01 PM mi correo es mortal.16@hotmail.com gracias de antemano

Ruben Aguilar dice: 6 junio, 2011 a las 10:59 PM Cuando tenga acceso a mi compu lo posteo aqu. Gracias por leer!

2.

Ruben Aguilar dice: 7 junio, 2011 a las 8:42 AM Para descargar el proyecto completo: http://dl.dropbox.com/u/30493334/CargaDescargaSqlServerAspNet.zip Cargar/Descargar archivos a SQL Server con ASP.NET DbRunas Noticias y Recursos sobre Bases de Datosdice: 7 junio, 2011 a las 10:40 AM [...] http://dtzonedev.wordpress.com/2011/06/06/cargardescargar-archivos-a-sql-server-con-asp-net/ June 7, 2011 // MsSQL // No Comments // [...] Luis dice: 7 junio, 2011 a las 9:04 PM

3.

4.

una consulta quiero subir archivos de mas de 4mb .y en la condicion if (fileUpload.PostedFile.ContentLength <= 4000000) aumento los 4000000.y en el web.config aumento el pero al momento de subirlo en la columna archivo de la bd me dice

como puedo hacerlo para aumentar el tamao de los archivos??? 5. Luis dice: 7 junio, 2011 a las 9:06 PM httpRuntime maxRequestLength=200000></httpRuntime en el web.config eso aumento y no me deja 6. Rubn Aguilar dice: 8 junio, 2011 a las 1:55 PM modificaste estos valores: executionTimeout=90 maxRequestLength=4096? 7. xavier dice: 9 julio, 2011 a las 7:31 PM

parsero una duda, yo ya cargo archivos en un a tabla de sql server parecido como lo tienes, ahora necesito en otra pagina mostrar el archivo o descargarlo como en tu ejemplo a partir de una consulta por la ke le envio 3 parametros para que me bote el link de descarga como en tu ejemplo pero no he podido hacerlo por fa si me pudieras hechar una asesoria

Ruben Aguilar dice: 11 julio, 2011 a las 1:20 AM

con gusto te ayudo, dime dnde tienes el problema? deberas hacer algo similar a lo que tengo, slo cambiara bsicamente el formato de la Url, al aadir esos dos parmetros que hacen falta y recuperarlos en el evento Page_Load. Dependiendo del tipo de archivos tambin cambiara el encabezado de la pgina 8. danny dice: 7 noviembre, 2011 a las 11:47 AM

Hola como estas podras subir nuevamente el enlace de tu archivo, esta caido o no existe el archivo 9. Cris dice: 8 noviembre, 2011 a las 7:19 PM

hola no sirve el link nos puedes ayudar

Ruben Aguilar dice: 9 noviembre, 2011 a las 11:27 AM

Ms tarde actualizo el link, o lo pongo comentario. Perdn la tardanza. Saludos!!! Ruben Aguilar Everything ends because its vanity; but the utility on the Gods hands is forever

Ruben Aguilar dice: 9 noviembre, 2011 a las 11:43 PM El nuevo enlace: http://dl.dropbox.com/u/37858652/CargaDescargaSqlServerAspNet.zip Ruben Aguilar Everything ends because its vanity; but the utility on the Gods hands is forever

Cris dice: 16 noviembre, 2011 a las 7:13 PM

Muchas gracias por la ayuda!!!

Saludos

Você também pode gostar