5. Laden Sie Bilder hoch und speichern Sie Binärdaten mithilfe des ASP.NET 2.0-Datenquellensteuerungscodes.
Obwohl die ADO.NET-Methode im Kontext einer ASP.NET 2.0-Anwendung funktioniert, können Sie auch ASP.NET 2.0-Datenquellensteuerungen zum Speichern von Binärdaten verwenden Binärdaten werden in einer Datenbank gespeichert, sodass Sie keinen ADO.NET-Code schreiben müssen. Das in diesem Demoprogramm verwendete SqlDataSource-Steuerelement enthält einen InsertCommand und Parameter, die den Werten Title, MIMEType und ImageData entsprechen:
<asp:SqlDataSource ID="UploadPictureDataSource" runat="server"
ConnectionString="..."
InsertCommand="INSERT INTO [Bilder] ([Titel], [MIMEType], [ImageData]) VALUES (@Title, @MIMEType, @ImageData)">
<InsertParameters>
<asp:Parameter Name="Title" Type="String" />
<asp:Parameter Name="MIMEType" Type="String" />
<asp:Parameter Name="ImageData" />
</InsertParameters>
</asp:SqlDataSource>
Beachten Sie, dass der ImageData-Parameter hier keinen Typ angibt. Wenn Sie versuchen, die Syntax einer SqlDataSource mit dem GUI-Assistenten zu erstellen, wird dieser wahrscheinlich Type="Object" dafür angeben. Dieser Type="Object" erzeugt jedoch einen Parameter vom Typ sql_variant. Der Typ „sql_variants“ kann jedoch nicht zum Speichern von Bildern oder varbinary-Datentypen (MAX) verwendet werden, da die intrinsische Datengröße von „sql_variant“ 8.000 Byte nicht überschreiten darf. (Wenn Sie versuchen, Type="Object" zu verwenden und dann Binärdaten zu speichern, deren Größe 8.000 Byte überschreitet, löst das System eine Ausnahme mit der Meldung „Parameter '@ImageData' überschreitet die Größenbeschränkung für den Datentyp sql_variant“ aus; Wenn Sie versuchen, Binärdaten hinzuzufügen, die weniger als 8.000 Byte groß sind, wird die Ausnahme die Meldung „Implizite Konvertierung vom Datentyp sql_variant in varbinary(max) ist nicht zulässig“ anzeigen.
Darüber hinaus enthält das DetailsView-Steuerelement zwei TemplateFields. Unter anderem wird in einem TemplateField ein TextBox-Steuerelement verwendet, um die Titelleiste anzuzeigen; das andere verwendet ein FileUpload-Steuerelement, um die ImageData-Leiste darzustellen. Das Endergebnis ist eine Benutzeroberfläche, die der im Abschnitt „Hochladen von Bildern und Speichern von Binärdaten mit ADO.NET-Code“ ähnelt. Wenn auf die Schaltfläche „Einfügen“ von DetailsView geklickt wird, wird das entsprechende Inserting-Ereignis ausgelöst. Zu diesem Zeitpunkt müssen die Binärdaten vom FileUpload-Steuerelement abgerufen, in ein Byte-Array eingelesen und den entsprechenden Parametern zugewiesen werden:
Protected Sub UploadPictureUI_ItemInserting(ByVal sender As Object , ByVal e As System.Web.UI.WebControls.DetailsViewInsertEventArgs) Behandelt UploadPictureUI.ItemInserting
'Referenzieren Sie das FileUpload-Steuerelement. Dim UploadedFile As FileUpload = CType(UploadPictureUI.FindControl("UploadedFile"), FileUpload)
'Stellen Sie sicher, dass eine Datei erfolgreich hochgeladen wurde. If UploadedFile.PostedFile Is Nothing OrElse String.IsNullOrEmpty(UploadedFile.PostedFile.FileName) OrElse UploadedFile .PostedFile .InputStream ist dann nichts
...Fehlermeldung anzeigen...
e.Cancel = True
Sub verlassen
End If
„Stellen Sie sicher, dass es sich um eine JPG- oder GIF-Datei handelt.“
Dim extension As String = Path.GetExtension(UploadedFile.PostedFile.FileName).ToLower()
Dim MIMEType As String = Nothing
Wählen Sie Fallerweiterung aus
Fall „.gif“
MIMEType = "image/gif"
Fall „.jpg“, „.jpeg“, „.jpe“
MIMEType = "image/jpeg"
Fall „.png“
MIMEType = "image/png"
Fall anders
„Ungültiger Dateityp-Upload... Fehlermeldung angezeigt...“
e.Cancel = True
Sub verlassen
Ende Wählen Sie
„Geben Sie die Werte der Parameter MIMEType und ImageData an.“
e.Values("MIMEType") = MIMEType
'Laden Sie den InputStream von FileUpload in das Byte-Array
Dimmen Sie imageBytes(UploadedFile.PostedFile.InputStream.Length) als Byte
UploadedFile.PostedFile.InputStream.Read(imageBytes, 0, imageBytes.Length)
e.Values("ImageData") = imageBytes
End Sub
Genau wie der Click-Ereignishandler der vorherigen „Einfügen“-Schaltfläche führt auch der Inserting-Ereignishandler der DetailsView dieselbe Logik aus – es gibt nur einige geringfügige Syntaxunterschiede. Da sich das FileUpload-Steuerelement in einer Vorlage befindet, muss es zunächst programmgesteuert mithilfe der FindControl("controlID")-Methode referenziert werden. Sobald darauf verwiesen wird, werden dieselben Prüfungen durchgeführt, um sicherzustellen, dass eine Datei erfolgreich hochgeladen wurde und die entsprechende Erweiterung zulässig war. Ein kleiner Unterschied zum Inserting-Ereignishandler von DetailsView besteht darin, dass wir, wenn ein Fehler auftritt, DetailsView benachrichtigen müssen, um die entsprechende Einfügearbeit zu stoppen – dies wird erreicht, indem die e.Cancel-Eigenschaft auf True gesetzt wird.
Nach der Prüfung werden die Parameter MIMEType und ImageData mit der Syntax e.Values("parameterName")=value zugewiesen. Lesen Sie wie im vorherigen ADO.NET-Beispiel zunächst die Binärdaten in ein Byte-Array ein und weisen Sie dann das Byte-Array dem Parameter zu.
6. Binären Inhalt anzeigen
Unabhängig davon, welche Technologie Sie zum Speichern von Daten in der Datenbank verwenden, müssen wir zum Abrufen und Anzeigen von Binärdaten eine neue ASP.NET-Seite erstellen. Die Seite mit dem Namen ShowPicture.aspx übergibt über die Abfragezeichenfolge eine PictureID an sie und gibt die Binärdaten aus dem ImageData-Feld des angegebenen Produkts zurück. Nach der Fertigstellung kann ein bestimmtes Bild unter der Adresse /ShowPicture.aspx?PictureID=picutreID angezeigt werden. Um ein Bild auf einer Webseite anzuzeigen, können wir daher ein Bildsteuerelement verwenden und dessen ImageUrl-Eigenschaft auf die entsprechende URL festlegen.
Beachten Sie, dass ShowPicture.aspx keine HTML-Tags in seiner .aspx-Seite enthält. Im Page_Load-Ereignishandler der Code-Behind-Klasse wird ADO.NET-Code verwendet, um den MIMEType und die ImageData der angegebenen Bilderzeile aus der Datenbank abzurufen. Anschließend wird der ContentType der Seite auf den Wert des MIMEType-Felds gesetzt und die Binärdaten werden mit Response.BinaryWrite(ImageData) ausgegeben:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me. Laden
Dim PictureID As Integer = Convert.ToInt32(Request.QueryString("PictureID"))
'Stellen Sie eine Verbindung zur Datenbank her und geben Sie den Bildinhalt und den MIME-Typ des angegebenen Bildes zurück. Verwenden Sie myConnection As New SqlConnection(ConfigurationManager.ConnectionStrings("ImageGalleryConnectionString"). ConnectionString)
Const SQL As String = „SELECT [MIMEType], [ImageData] FROM [Pictures] WHERE [PictureID] = @PictureID“
Dimmen Sie myCommand als neues 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()
Response.BinaryWrite(myReader("ImageData"))
End If
myReader.Close()
myConnection.Close()
Beenden Sie die Verwendung
Sub beenden