5. Téléchargez des images et stockez des données binaires à l'aide du code de contrôle de source de données ASP.NET 2.0
Bien que la méthode ADO.NET fonctionne dans le contexte d'une application ASP.NET 2.0, vous pouvez également utiliser des contrôles de source de données ASP.NET 2.0 pour stocker des données binaires. Les données binaires sont stockées dans une base de données, ce qui ne nécessite pas d'écrire du code ADO.NET. Le contrôle SqlDataSource utilisé dans ce programme de démonstration contient un InsertCommand et des paramètres correspondant aux valeurs Title, MIMEType et ImageData :
<asp:SqlDataSource ID="UploadPictureDataSource" runat="server"
Chaîne de connexion="..."
InsertCommand="INSÉRER DANS [Images] ([Titre], [MIMEType], [ImageData]) VALEURS (@Titre, @MIMEType, @ImageData)">
<InsertParameters>
<asp : Nom du paramètre="Titre" Type="Chaîne" />
<asp : Nom du paramètre="MIMEType" Type="String" />
<asp:Nom du paramètre="ImageData" />
</InsérerParamètres>
</asp:SqlDataSource>
Notez qu'ici, le paramètre ImageData ne spécifie pas de type. Si vous essayez d'utiliser l'assistant GUI pour créer la syntaxe d'un SqlDataSource, il spécifiera probablement Type="Object" pour celui-ci. Cependant, ce Type="Object" produira un paramètre de type sql_variant. Toutefois, le type sql_variants ne peut pas être utilisé pour stocker des images ou des types de données varbinary (MAX), car la taille intrinsèque des données de sql_variant ne peut pas dépasser 8 000 octets. (Si vous essayez d'utiliser Type="Object" puis essayez d'enregistrer des données binaires dont la taille dépasse 8 000 octets, le système lancera une exception avec le message "Le paramètre '@ImageData' dépasse la limite de taille pour le type de données sql_variant " ; Si vous tentez d'ajouter des données binaires d'une taille inférieure à 8 000 octets, l'exception affichera le message « La conversion implicite du type de données sql_variant en varbinary(max) n'est pas autorisée »).
De plus, le contrôle DetailsView contient deux TemplateFields. Parmi eux, un contrôle TextBox est utilisé dans un TemplateField pour afficher la barre de titre ; l'autre utilise un contrôle FileUpload pour représenter la barre ImageData. Le résultat final est une interface utilisateur qui ressemble à celle de la section « Téléchargement d'images et stockage de données binaires à l'aide du code ADO.NET ». Lorsque vous cliquez sur le bouton « Insérer » de DetailsView, son événement Inserting est déclenché. À ce stade, les données binaires doivent être obtenues à partir du contrôle FileUpload, lues dans un tableau d'octets et affectées aux paramètres appropriés :
Protected Sub UploadPictureUI_ItemInserting (ByVal). expéditeur As Object , ByVal et As System.Web.UI.WebControls.DetailsViewInsertEventArgs) gère UploadPictureUI.ItemInserting
'Référencer le contrôle FileUpload Dim UploadedFile As FileUpload = CType(UploadPictureUI.FindControl("UploadedFile"), FileUpload)
'Assurer qu'un fichier a été téléchargé avec succèsIf UploadedFile.PostedFile Is Nothing OrElse String.IsNullOrEmpty(UploadedFile.PostedFile.FileName) OrElse UploadedFile .PostedFile .InputStream n'est rien alors
...afficher un message d'erreur...
e.Annuler = Vrai
Quitter le sous-marin
Fin si
'Assurez-vous que nous avons affaire à 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é...
e.Annuler = Vrai
Quitter le sous-marin
Fin Sélectionnez
"Spécifier les valeurs des paramètres MIMEType et ImageData
e.Values("MIMEType") = MIMEType
'Charger le InputStream de FileUpload dans le tableau d'octets
Dim imageBytes (UploadedFile.PostedFile.InputStream.Length) en tant qu'octet
UploadedFile.PostedFile.InputStream.Read(imageBytes, 0, imageBytes.Length)
e.Values("ImageData") = imageBytes
End Sub
Tout comme le gestionnaire d'événements Click du bouton "Insérer" précédent, le gestionnaire d'événements Inserting de DetailsView exécute également la même logique - il n'y a que quelques différences de syntaxe mineures. Premièrement, puisque le contrôle FileUpload se trouve à l’intérieur d’un modèle, il doit être référencé par programme à l’aide de la méthode FindControl("controlID"). Une fois référencé, les mêmes vérifications sont effectuées pour garantir qu'un fichier a été téléchargé avec succès et que l'extension appropriée a été autorisée. Une légère différence avec le gestionnaire d'événements d'insertion de DetailsView est que si une erreur se produit, nous devons alors avertir DetailsView pour arrêter le travail d'insertion correspondant - ceci est obtenu en définissant la propriété e.Cancel sur True.
Après vérification, les paramètres MIMEType et ImageData seront attribués à l'aide de la syntaxe e.Values("parameterName")=value. Tout comme dans l'exemple ADO.NET précédent, lisez d'abord les données binaires dans un tableau d'octets, puis attribuez le tableau d'octets au paramètre.
6. Afficher le contenu binaire
Quelle que soit la technologie que vous utilisez pour stocker les données dans la base de données, afin de récupérer et d'afficher des données binaires, nous devons créer une nouvelle page ASP.NET. La page nommée ShowPicture.aspx lui transmettra un PictureID via la chaîne de requête et renverra les données binaires du champ ImageData du produit spécifié. Une fois terminée, une image spécifique peut être vue en visitant l'adresse /ShowPicture.aspx?PictureID=picutreID. Par conséquent, afin d'afficher une image sur une page Web, nous pouvons utiliser un contrôle image et définir sa propriété ImageUrl sur l'URL appropriée.
Notez que ShowPicture.aspx n'inclut aucune balise HTML dans sa page .aspx. Dans le gestionnaire d'événements Page_Load de la classe code-behind, le code ADO.NET sera utilisé pour récupérer le MIMEType et l'ImageData de la ligne Pictures spécifiée de la base de données. Ensuite, le ContentType de la page est défini sur la valeur du champ MIMEType et les données binaires sont générées à l'aide de Response.BinaryWrite(ImageData):
Protected Sub Page_Load(ByVal sender As Object, ByVal et As System.EventArgs) Handles Me. Charger
Dim PictureID As Integer = Convert.ToInt32(Request.QueryString("PictureID"))
'Connectez-vous à la base de données et renvoyez le contenu de l'image et le type MIME de l'image spécifiée en utilisant myConnection As New SqlConnection(ConfigurationManager.ConnectionStrings("ImageGalleryConnectionString"). ConnectionString)
Const SQL As String = "SELECT [MIMEType], [ImageData] FROM [Pictures] WHERE [PictureID] = @PictureID"
Atténuer myCommand en tant que nouveau SqlCommand (SQL, myConnection)
myCommand.Parameters.AddWithValue("@PictureID", PictureID)
myConnection.Open()
Dim myReader As SqlDataReader = myCommand.ExecuteReader
If myReader.Read Then
Response.ContentType = myReader("MIMEType").ToString()
Réponse.BinaryWrite(myReader("ImageData"))
Fin si
myReader.Close()
maConnexion.Close()
Fin de l'utilisation
Fin du sous-marin