1. Introduction
Lors de la création d'applications basées sur les données, il est souvent nécessaire de capturer du texte et des données binaires. Un tel programme peut avoir besoin de stocker des images, des PDF, des fichiers Word ou d'autres données binaires. Il existe deux manières de stocker ces données binaires : sur le système de fichiers du serveur web et en ajoutant une référence au fichier correspondant dans la base de données ou directement dans la base de données elle-même ;
Les données textuelles telles que les chaînes, les nombres, les dates, les GUID, les valeurs monétaires, etc. - ont des définitions de types de données appropriées et correspondantes dans le système de base de données. Par exemple, dans Microsoft SQL Server, vous pouvez utiliser le type de données int pour stocker une valeur entière et pour stocker une valeur de chaîne, vous pouvez utiliser un type varchar ou nvarchar ; De plus, la base de données fournit également des définitions de types pour stocker les données binaires. Dans Microsoft SQL SERVER 2000 et les versions antérieures, le type de données image est utilisé pour stocker des données binaires ; dans SQL SERVER 2005, le type de données varbinary (MAX) est utilisé. Ces types de données sont capables de stocker des données binaires jusqu’à 2 Go en utilisant l’une des deux méthodes ci-dessus.
Cependant, lors du stockage de données binaires directement dans la base de données, un travail supplémentaire est requis pour insérer, mettre à jour et récupérer les données binaires. Heureusement, nous pouvons résumer cette opération T-SQL complexe de bas niveau via des bibliothèques d'accès aux données de niveau supérieur - telles que ADO.NET - afin que le problème devienne assez simple. Cependant, travailler avec des données binaires via ADO.NET est un peu différent de travailler avec des données texte. Dans cet article, nous analyserons comment utiliser ADO.NET et le contrôle SqlDataSource ASP.NET 2.0 pour stocker et récupérer des fichiers image directement à partir d'une base de données. Veuillez continuer à lire !
2. Comparaison entre le stockage des données dans la base de données et leur stockage dans le système de fichiers.
Comme nous venons de l'introduire, lors de la capture de données binaires dans une application, les données binaires peuvent être stockées directement dans la base de données ou sous forme de fichier sur le serveur. système de fichiers - seule une référence au fichier dans la base de données est conservée. D'après mon expérience, j'ai constaté que la plupart des développeurs préfèrent stocker les données binaires dans le système de fichiers, principalement pour les raisons suivantes :
· Moins d'effort requis - Le stockage et la récupération des binaires stockés dans une base de données nécessitent plus d'efforts de codage. De plus, la mise à jour de ces données binaires sera plus simple : pas besoin de communiquer avec la base de données, il suffit de modifier directement le fichier !
· Les URL pointant vers des fichiers sont plus directes - Comme nous le verrons dans cet article, afin de donner accès aux données binaires stockées dans une base de données, nous devons créer une autre page ASP.NET pouvant renvoyer ces données. Typiquement, un identifiant unique correspondant à l'enregistrement correspondant dans la base de données (renvoyant ses données binaires) est transmis à cette page. Le résultat est que pour accéder aux données binaires - par exemple une image téléchargée - l'URL ressemble à http://www.yourserver.com/ShowImage.aspx?ID=4352 , alors que si l'image était stockée directement dans le fichier In le système, l'URL sera plus directe - par exemple http://www.yourserver.com/UploadedImages/Sam.jpg.
· Meilleure prise en charge des outils pour l'affichage des images - Si vous utilisez ASP.NET 2.0, vous pouvez utiliser un contrôle ImageField dans un contrôle GridView ou DetailsView pour afficher une image (son chemin d'accès à l'image est stocké dans la base de données). Cependant, malheureusement, cet ImageField ne peut pas afficher directement les données d'image dans la base de données (car il nécessite d'interroger une page externe et de renvoyer les données correspondantes).
· Performance – Étant donné que les fichiers binaires sont stockés dans le système de fichiers du serveur Web plutôt que dans la base de données, l'application peut accéder à moins de données dans la base de données, réduisant ainsi les exigences de la base de données et réduisant en conséquence les exigences du Web et la congestion du réseau entre serveurs de bases de données.
Le principal avantage du stockage des données directement dans la base de données est qu’il les rend « autonomes ». Maintenant que toutes les données sont contenues dans la base de données, la prise en charge des données, le mouvement des données entre les serveurs de base de données, la réplication de la base de données, etc. sont beaucoup plus faciles car il n'y a plus besoin de s'inquiéter de la copie ou de la sauvegarde du contenu binaire stocké dans le système de fichiers.
Comme toujours, la solution de stockage à choisir dépendra du site d’utilisation réel et des besoins de l’entreprise. Par exemple, j'ai développé un client dans lequel les données binaires devaient être stockées dans une base de données car le logiciel de reporting qu'ils utilisaient ne pouvait inclure des données binaires dans le rapport que si elles provenaient de la base de données. Dans un autre cas, un de mes collègues travaillait sur un projet dans lequel les binaires devaient être utilisés par une application Web et disponibles via FTP, auquel cas il était nécessaire de stocker les données binaires dans le système de fichiers.
3. Créer une table de base de données pour stocker des données binaires
Le reste de cet article analysera une simple application de galerie d'images ASP.NET 2.0 que j'ai écrite à l'aide de Microsoft SQL Server 2005 Express Edition pour démontrer les concepts directs liés au stockage et à la récupération de données binaires dans un base de données.
Le modèle de données de cette application de galerie d'images se compose d'un tableau - Images, où chaque enregistrement correspond à une image de la galerie. Le champ MIMEType de cette table Pictures stocke le type MIME de l'image téléchargée (image/jpeg pour les fichiers JPG, image/gif pour les fichiers GIF, etc.) ; le type MIME spécifie ici au navigateur comment générer les données binaires. La colonne ImageData stocke le contenu binaire réel de l'image.
4. Téléchargez une image et stockez des données binaires à l'aide du code ADO.NET.
Cette galerie d'images permet aux visiteurs de télécharger des fichiers image (formats GIF, JPG et PNG) dans cette application. Une fois téléchargé, un nouvel enregistrement est ajouté à la table Images et le contenu du fichier image est stocké dans la colonne ImageData du nouvel enregistrement. Afin de télécharger des fichiers du navigateur Web vers le serveur Web dans ASP.NET 2.0, le contrôle FileUpload est utilisé dans cet exemple. L'utilisation du contrôle FileUpload est très simple : faites-le simplement glisser de la barre d'outils vers votre page. En fin de compte, ce contrôle FileUpload sera généré dans le navigateur de l'utilisateur sous la forme d'un formulaire de téléchargement de fichier standard - un bouton "Parcourir" (lorsqu'il est cliqué) permet à l'utilisateur de sélectionner un fichier sur son disque dur à télécharger sur le serveur Web.
Par exemple, pour créer une interface permettant d'ajouter une nouvelle image, j'ai utilisé un contrôle TextBox pour capturer le titre de l'image, et un contrôle FileUpload pour permettre à l'utilisateur de spécifier l'image à télécharger :
<b>Titre :</b>
<asp:TextBox ID="PictureTitle" runat="serveur" />
<br />
<b>Image :</b>
<asp:FileUpload ID="UploadedFile" runat="serveur" />
<br />
<asp:LinkButton ID="btnInsert" runat="server" Text="Insérer" />
<asp:LinkButton ID="btnCancel" runat="server" Text="Cancel" />
Le code ci-dessus crée une page où l'utilisateur peut spécifier un fichier de son disque dur à télécharger sur le serveur Web.
Une fois que l'utilisateur sélectionne un fichier et envoie le formulaire (par exemple, en cliquant sur le bouton "Insérer"), le contenu binaire du fichier spécifié est envoyé au serveur Web. À partir du code côté serveur, ces données binaires deviennent disponibles via la propriété PostedFile.InputStream du contrôle FileUpload, comme le démontrent le balisage et le code suivants :
Protected Sub btnInsert_Click(ByVal sender As Object, ByVal et As System.EventArgs) Handles btnInsert . Cliquez
'Assurez-vous qu'un fichier a été téléchargé avec succès
Si UploadedFile.PostedFile n'est rien ou Else String.IsNullOrEmpty (UploadedFile.PostedFile.FileName) OrElse UploadedFile.PostedFile.InputStream n'est rien alors
...afficher un message d'erreur...
Quitter le sous-marin
Fin si
'Assurez-vous que nous travaillons avec un fichier JPG ou GIF
Dim extension As String = Path.GetExtension(UploadedFile.PostedFile.FileName).ToLower()
Dim MIMEType As String = Rien
Sélectionnez l'extension du dossier
Cas ".gif"
TypeMIME = "image/gif"
Cas ".jpg", ".jpeg", ".jpe"
TypeMIME = "image/jpeg"
Cas ".png"
TypeMIME = "image/png"
Autre cas
'Téléchargement d'un type de fichier non valide... message d'erreur affiché...
Quitter le sous-marin
Fin Sélectionnez
'Se connecter à la base de données et insérer un nouvel enregistrement dans la table Produits
Utilisation de myConnection comme nouveau SqlConnection(ConfigurationManager.ConnectionStrings("ImageGalleryConnectionString").ConnectionString)
Const SQL As String = "INSERT INTO [Pictures] ([Title], [MIMEType], [ImageData]) VALUES (@Title, @MIMEType, @ Données d'image)"
Atténuer myCommand en tant que nouveau SqlCommand (SQL, myConnection)
myCommand.Parameters.AddWithValue("@Title", PictureTitle.Text.Trim())
myCommand.Parameters.AddWithValue("@MIMEType", MIMEType)
'Charger le InputStream du contrôle FileUpload dans un tableau d'octets
Dim imageBytes (UploadedFile.PostedFile.InputStream.Length) en tant qu'octet
UploadedFile.PostedFile.InputStream.Read(imageBytes, 0, imageBytes.Length)
maCommand.Parameters.AddWithValue("@ImageData", imageBytes)
maConnexion.Open()
maCommand.ExecuteNonQuery()
maConnexion.Close()
Fin de l'utilisation
End
SubIci, ce gestionnaire d'événements s'assure d'abord qu'un fichier a été téléchargé. Il détermine ensuite le type MIME en fonction de l'extension du fichier en cours de téléchargement.
La partie la plus remarquable de ce qui précède est la section de code qui définit les paramètres @ImageData. Tout d’abord, créez un tableau d’octets nommé imageBytes et définissez sa longueur comme InputStream correspondante du fichier en cours de téléchargement. Ensuite, utilisez la méthode Read de InputStream pour remplir le contenu binaire dans ce tableau d'octets. Notez que c'est ce tableau d'octets qui est spécifié comme valeur de @ImageData.