martes, 29 de junio de 2010

Subir y bajar archivos en web y con SQLDataBase C#

Si lo que necesitas es subir archivos a una base de datos en SQL Server y asi mismo bajar el archivo y permitir que el explorador te de la opcion de guardar o descargar el archivo, aqui esta mi experiencia y hasta el momento funciona. Supongo que ya tienes conocimientos un poco mas que basico en Visual Studio por lo que ire mas al código que se debe implementar.

En el formulario ademas de unos textBox y unos Labels o etiquetas, debemos poner un FileUpLoad Object, este componente nos permite facilemente subir el archivo. Debemos poner un boton para poder guardar los datos.

Ahora vamos al evento del boton en el codigo.

Aqui declaramos una tabla de memoria o datatable
Datatable dt=new DataTable();
despues declaramos tambien un SQLCOnnection, un String para la cadena de conexion a la base de datos y un SQLDataAdaptaer así como un SQLCommand.

string strcon="Cadena de conexion a datos"
SqlConnection scon=new SqlConnection(strcon)
SqlDataAdapter sda=new SqlDataAdapter("SELECT * FROM TABLA",scon)
SqlCommand scom=new SqlCommand(sda)

Con esto ya estamos listos para trabajar.
Primero cargarmos la estructura de nuestra tabla:
sda.fillSchema(dt,SchemaType.Source)
Ahora creamos un elemento DataRow:
DataRow dr=dt.NewDataRow(); Esto es para accesar a los campos de la tabla de memoria
Ahora asignamos los valores del formulario a nuestra tabla. Aqui se debe asignar los valores a los campos de la tabla tantos queramos o necesitemos, solo pondre los correspondientes a los archivos.
Debido a que el nombre del archivo viene junto con la extension debemos hacer un split. Siempre es bueno tener el nombre y la extension del archivo por separado.
String [] datos=FileUpLoad1.FileName.Split('.');
dr["File_Nombre"]=datos[0];
dr["File_Tipo"]=datos[1];
dr["File_Archivo"]=FileUpLoad1.FileBytes; //Aqui obtenemos el archivo expresado en arreglos de bytes lo cual es necesario para poder almacenarlo en nuestra base de datos.
dr["File_ContentType"]=FileUpLoad1.PostedFile.ContentType;
dr["File_Size"]=FileUpLoad1.PostedFile.ContentLength;

ahora asignamos el datarow ala tabla de memoria
dt.rows.add(dr);
y por ultimo hacemos el update de los datos para que se graven en la base de datos
sda.update(dt);

Es necesario implementar control de errores y validaciones pero bueno esos detalles se los dejos a ustedes.
Hasta aqui ya tenemos en nuestra base de datos un archivo del tipo que sea almacenado en un tipo de dato Blob que es un arreglo de bytes.

Ahora para poder accesarlo imaginemos que tenemos un GridView en donde queremos que el usuario de click en el nombre del archivo y le permita descargar el archivo que esta almacenado en la base de datos. Para esto necesitamos un GridView ligado a los datos, especificamente a la tabla en donde esta nuestro archivo. Puedes poner varias columnas yo para el ejemplo pondré solo 2 Id (llave primaria de mi tabla), File_Nombre. Ahora el siguiente codigo es justo como yo lo hice, se que debe haber mas formas o maneras de implementarlo pero bueno, yo comparto la mia.

En el gridView vamos al evento RowCreated (este evento se dispara cuando se carga la página y se carga el grid con cada una de las lineas)

GridView1_RowCreated(...

Aqui lo que vamos a hacer es cambiar el icono en un evento onmouseover y agregar el evento onclick.

primero preguntamos si el renglo insertado en el grid es de tipo datarow
if (e.Row.RowType==DataControlRowType.DataRow)
{
Despues asignamos los eventos
e.Rows.Cells[1].Attributes.Add("onmouseover","this.style.cursor='hand'");
e.Rows.Cells[1].Attributes.Add("onclick","OnGridClick('"+row.ToString()+"')");
En esta ultima linea necesitamos declarar una variable de tipo int que nos va a indicar en que renglo se encuentra el dato en donde demos click
}Despues de cerrar el if inbcrementamos la variable row
row++;
En el evento Load puedes inicializar la variable row=0; pero recuerda declararla como global para este documento: Private int row;

Bien ahora vamos al codigo de la pagina. Ahi debemos declarar un segmento JavaScript. El evento que le hemos puesto arriba es para que al dar click dispare un evento o una funcion en javascript.
para feectos del ejemplo yo usare un datareader dr
El codigo es como sigue:

Response.Claer();
string file_name=dr["File_Nombre"].ToString().Trim();
string file_ext=dr["File_Tipo"].ToString().Trim();
Response.AddHeader("Content-Disposition","inline;filename="+file_name+"."+file_ext);
Response.ContentType=dr["file_ContentType"].ToString();
Ahora como el archivo esta guardado en un arreglo de bytes debemos usar la siguiente linea para leerlo correctamente.
Response.OutPutStream.Write((byte[])dr["File_archivo"], 0, dr["File_size"]);
Response.End();

Listo con estos pasos el explorer nos va a preguntar donde guardar el archivo.

Y como dice Squall C'Ya........

No hay comentarios:

Publicar un comentario