El siguiente ejemplo muestra una forma sencilla de almacenar archivos (documentos, imagenes, etc) en una tabla en base de datos. El tipo de datos de SQL Server más recomendado para almacenar archivos es el varbinary. Existe otro tipo que se solía utilizar denominado image, pero ya es obsoleto y posiblemente deje de venir en futuras versiones de SQL.
Primero armamos la tabla y un stored procedure de inserción:
CREATE TABLE [dbo].[Archivos](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Nombre] [varchar](200) NOT NULL,
[Archivo] [varbinary](max) NOT NULL,
[Tipo] [varchar](30) NOT NULL,
CONSTRAINT [PK_Archivos] PRIMARY KEY CLUSTERED
(
[Id] ASC
) ON [PRIMARY]
) ON [PRIMARY]
alter procedure [dbo].[spInsertarArchivo]
@Nombre as varchar(200),
@Archivo as varbinary(MAX),
@Tipo as varchar(30)
as
insert into archivos (nombre, archivo, tipo)
values (@nombre, @archivo, @tipo)
Ahora armamos el aspx con un control FileUpload y un botón:
<div>
Imagen <asp:FileUpload runat="server" ID="FupArchivo" />
<asp:Button runat="server" ID="BtnUpload" Text="Upload" onclick="BtnUpload_Click" />
</div>
Y este es el códgio que hace todo. Lo que hacemos es convertir el stream de entrada que nos provee el control FileUpload, a un array de bytes, que es el tipo soportado para insertar en el campo varbinary:
protected void BtnUpload_Click(object sender, EventArgs e)
{
byte[] archivoBuffer = new byte[FupArchivo.PostedFile.ContentLength];
FupArchivo.PostedFile.InputStream.Read(archivoBuffer, 0, FupArchivo.PostedFile.ContentLength);
using (SqlConnection cn = new SqlConnection(_cadenaConexion))
{
cn.Open();
SqlCommand cm = new SqlCommand("spInsertarArchivo", cn);
cm.CommandType = CommandType.StoredProcedure;
cm.Parameters.Add(new SqlParameter("@Nombre", Path.GetFileName(FupArchivo.PostedFile.FileName)));
cm.Parameters.Add(new SqlParameter("@Tipo", FupArchivo.PostedFile.ContentType));
SqlParameter paramBlob = new SqlParameter("@Archivo", SqlDbType.VarBinary);
paramBlob.Direction = ParameterDirection.Input;
paramBlob.Size = FupArchivo.PostedFile.ContentLength;
paramBlob.Value = archivoBuffer;
cm.Parameters.Add(paramBlob);
cm.ExecuteNonQuery();
}
}
En el próximo post voy a armar un ejemplo de como obtener un archivo ya guardado en base de datos, para mostrarlo en una página web.