Ormai ogni sito web utilizza uno o più database per contenere i propri contenuti. In questo articolo vedremo come Salvare immagini ed altri tipi di file all’interno di un Database MSSQL Server e come recuperarli al bisogno.
Per questo esempio ho deciso di utilizzare Microsoft SQL Server Express 2008, in quanto gratuito e gestibile tramite Visual Studio o Visual Web Developer.
Da Visual Studio o Visual Web Developer creare un nuovo database all’interno della cartella App_Data e chiamarlo “Database.mdf”. Il database conterrà tre campi:
ID: INT Identity 1,1
Tipo: nchar(50)
Filer: varbinary(MAX)
Ricordarsi di impostare il campo ID come Chiave primaria e con Identità autoincrementale.
Database.mdf

Ora creeremo le pagine per il caricamento dei dati all’interno del database.
Carica.aspx
In questa pagina inseriremo i controlli che ci permetteranno di caricare i file all’interno del database, ovvero: un controllo FileUpload che chiameremo FileUpload1 ed un controllo Button che chiameremo Button1.
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Carica.aspx.vb" Inherits="_Carica" %>
<html xmlns="http://www.w3.org/1999/xhtml"gt;
<head runat="server">
<title%>Caricamento File</title>
</head%>
<body%>
<form id="form1" runat="server">
Carica un file
<asp:FileUpload ID="FileUpload1" runat="server" Width="286px" />
<asp:Button ID="Button1" runat="server" Text="Carica" />
</body>
</htnl>
Carica.aspx.vb
Questa pagina conterrà il Code behind utilizzato per salvare il file caricato dentro il database, gestendo l’evento CLick di Button1.
Imports System.IO
Imports System.Data
Imports System.Data.SqlClient
Partial Class _Carica
Inherits System.Web.UI.Page
Protected Sub Button1_Click(sender As Object, e As System.EventArgs) Handles Button1.Click
'se sto caricando un file
If FileUpload1.HasFile Then
'recupero i byte del file che sto caricando
Dim buffer(FileUpload1.FileBytes.Length) As Byte
'creo uno stream dal file che sto caricando
Dim objStream As Stream = FileUpload1.FileContent
'variabile per contenere il tipo di file
Dim contentType As String = ""
'verifico il tipo dipo di file
Select Case Path.GetExtension(FileUpload1.FileName).ToLower
Case ".pdf"
contentType = "application/pdf"
Case ".zip"
contentType = "application/zip"
Case ".doc", ".docx"
contentType = "application/msword"
Case ".xls", ".xlsx"
contentType = "application/vnd.ms-excel"
Case ".avi"
contentType = "video/avi"
Case ".mpg", ".mpeg"
contentType = "video/mpeg"
Case ".wav", ".wave"
contentType = "audio/wav"
Case ".mp3"
contentType = "audio/mpeg3"
Case ".jpg", ".jpeg"
contentType = "image/jpeg"
Case ".gif"
contentType = "image/gif"
Case ".png"
contentType = "image/png"
Case Else
contentType = "application/octet-stream"
End Select
'trasporto il contenuto del file in byte dentro
'la variabile buffer
objStream.Read(buffer, 0, objStream.Length)
'registro i dati all'interno del database
Dim con As New SqlConnection("Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Database.mdf;Integrated Security=True;User Instance=True")
Dim com As New SqlCommand("INSERT INTO HostedFiles (Tipo,Filer) VALUES (@Tipo,@Filer)", con)
com.Parameters.Clear()
com.Parameters.AddWithValue("Tipo", contentType)
com.Parameters.AddWithValue("Filer", buffer)
con.Open()
com.ExecuteNonQuery()
con.Close()
'aggiorno le visualizzazioni dati
GridView1.DataBind()
DataList1.DataBind()
'pulisco
buffer = Nothing
objStream.Dispose()
contentType = Nothing
con.Dispose()
com.Dispose()
End If
End Sub
End Class
Quando un utente fa click sul pulsante di caricamento viene scatenato l’evento “Button1_Click”, il quale recupera il file dal controllo FileUpload1, ne verifica il tipo e lo salva sotto forma binaria all’interno del database.
A questo punto è necessario creare un algoritmo che recuperi un determinato file dal database per poi riutilizzarlo come vogliamo.
Filer.ashx
Come già detto, questo script recupererà un determinato file dal database leggendolo in forma binaria e rovesciandone i dati verso la pagina che ha eseguito la richiesta.
Quando si richiama la pagina Filer.ashx per recuperare un file dal databsae, è necessario passarle un parametro denominato “id”, tramite querystring in modo da indicarle che record del database deve recuperare.
<%@ WebHandler Language="VB" Class="Images" %>
Imports System
Imports System.Web
Imports System.IO
Imports System.Data
Imports System.Data.SqlClient
Public Class Images : Implements IHttpHandler
Public Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest
'recupero il record del database in base al numero ID
'passato alla querystring
Dim dt As New DataTable
Dim con As New SqlConnection("Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Database.mdf;Integrated Security=True;User Instance=True")
Dim da As New SqlDataAdapter("SELECT * FROM HostedFiles WHERE ID=" & context.Request.QueryString("id"), con)
da.Fill(dt)
'imposto il contentType restituito, prelevandolo
'dal database
context.Response.ContentType = dt.Rows(0)("Tipo").ToString
'apriamo il file recuperandolo dal database
context.Response.BinaryWrite(dt.Rows(0)("Filer"))
'pulisco
dt.Dispose()
con.Dispose()
da.Dispose()
End Sub
Public ReadOnly Property IsReusable() As Boolean Implements IHttpHandler.IsReusable
Get
Return False
End Get
End Property
End Class
La variabile “con” può essere modificata in base alle vostre esigenze di connessione.
Questa pagina (se così la vogliamo chiamare), prenderà la forma del file recuperato dal database, così potremo utilizzarla sia come link, come immagine o come collegamento script.
Supponiamo che i file presenti all’interno del database abbiano questo aspetto:
|
ID |
Tipo |
Filer |
|
1 |
text/plain |
valori binari |
|
2 |
application/pdf |
valori binari |
|
3 |
image/jpeg |
valori binari |
Esempio per impostare un determinato file di scripting nell’head di una pagina html:
<head>
<script type="javascript" src="Filer.ashx?id=1"></script>
</head>
Esempio per impostare un link ad un file pdf:
<a href="filer.ashx?id=2">clicca qui</a>
Esempio per impostare visualizzare un’immagine a browser:
<img src="Filer.ashx?id=3" />
Un esempio competo di tutto quello spiegato in questo articolo potete scaricarlo qui.