Salvare i file in formato binario dentro un database MSSQL Server

Commenti 1

logo asp.net del blog filippoamadori.itOrmai 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

 Cattura


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.



Articoli Correlati

Form in Jquery ed Asp.Net Eliminare tutte le tabelle, viste e stored procedure presenti all'interno di un database SQL Server Recuperare tutte le stored procedure da un database SQL Server Recuperare elenco tabelle da un DataBase SQL Server

Commenti

25/03/2015

Lascia un commento

Il tuo indirizzo e-amil non sarà pubblicato.

Salva commento Anteprima