1. Einführung
Beim Erstellen datengesteuerter Anwendungen ist es häufig erforderlich, Text- und Binärdaten zu erfassen. Ein solches Programm muss möglicherweise Bilder, PDFs, Word-Dateien oder andere Binärdaten speichern. Es gibt zwei Möglichkeiten, diese Binärdaten zu speichern: im Dateisystem des Webservers und durch Hinzufügen eines Verweises auf die entsprechende Datei in der Datenbank oder direkt in der Datenbank selbst.
Textdaten wie Zeichenfolgen, Zahlen, Datumsangaben, GUIDs, Geldwerte usw. verfügen über geeignete und entsprechende Datentypdefinitionen im Datenbanksystem. Beispielsweise können Sie in Microsoft SQL Server den Datentyp int verwenden, um einen ganzzahligen Wert zu speichern, und um einen Zeichenfolgenwert zu speichern, können Sie einen varchar- oder nvarchar-Typ verwenden. Darüber hinaus stellt die Datenbank auch Typdefinitionen zum Speichern von Binärdaten bereit. In Microsoft SQL SERVER 2000 und früheren Versionen wird der Datentyp „image“ zum Speichern von Binärdaten verwendet. In SQL SERVER 2005 wird der Datentyp „varbinary“ (MAX) verwendet. Diese Datentypen können mit einer der beiden oben genannten Methoden Binärdaten mit einer Größe von bis zu 2 GB speichern.
Wenn Binärdaten jedoch direkt in der Datenbank gespeichert werden, sind einige zusätzliche Arbeiten erforderlich, um die Binärdaten einzufügen, zu aktualisieren und abzurufen. Glücklicherweise können wir diesen komplexen T-SQL-Vorgang auf niedriger Ebene durch Datenzugriffsbibliotheken auf höherer Ebene – wie ADO.NET – abstrahieren, sodass das Problem recht einfach wird. Allerdings unterscheidet sich die Arbeit mit Binärdaten über ADO.NET ein wenig von der Arbeit mit Textdaten. In diesem Artikel analysieren wir, wie man ADO.NET und das ASP.NET 2.0 SqlDataSource-Steuerelement verwendet, um Bilddateien direkt aus einer Datenbank zu speichern und abzurufen. Bitte lesen Sie weiter!
2. Vergleich zwischen der Speicherung von Daten in der Datenbank und der Speicherung im Dateisystem.
Bei der Erfassung von Binärdaten in einer Anwendung können die Binärdaten direkt in der Datenbank oder als Datei auf dem Server gespeichert werden Dateisystem – es wird nur ein Verweis auf die Datei in der Datenbank beibehalten. Meiner Erfahrung nach bevorzugen die meisten Entwickler die Speicherung von Binärdaten im Dateisystem, hauptsächlich aus folgenden Gründen:
· Geringerer Aufwand – Das Speichern und Abrufen von in einer Datenbank gespeicherten Binärdateien erfordert mehr Programmieraufwand. Darüber hinaus wird die Aktualisierung dieser Binärdaten einfacher – Sie müssen nicht mit der Datenbank kommunizieren, sondern ändern Sie einfach die Datei direkt!
· URLs, die auf Dateien verweisen, sind direkter. Wie wir in diesem Artikel sehen werden, müssen wir eine weitere ASP.NET-Seite erstellen, die diese Daten zurückgeben kann, um Zugriff auf in einer Datenbank gespeicherte Binärdaten zu ermöglichen. Normalerweise wird dieser Seite eine eindeutige Kennung übergeben, die dem entsprechenden Datensatz in der Datenbank entspricht (und dessen Binärdaten zurückgibt). Das Ergebnis ist, dass für den Zugriff auf die Binärdaten – beispielsweise ein hochgeladenes Bild – die URL wie folgt aussieht: http://www.yourserver.com/ShowImage.aspx?ID=4352 , während das Bild direkt in der Datei In gespeichert wurde Im System wird die URL direkter sein – zum Beispiel http://www.yourserver.com/UploadedImages/Sam.jpg.
· Bessere Toolunterstützung für die Anzeige von Bildern – Wenn Sie ASP.NET 2.0 verwenden, können Sie ein ImageField-Steuerelement in einem GridView- oder DetailsView-Steuerelement verwenden, um ein Bild anzuzeigen (sein Bildpfad wird in der Datenbank gespeichert). Leider kann dieses ImageField die Bilddaten in der Datenbank nicht direkt anzeigen (da es die Abfrage einer externen Seite und die Rückgabe der entsprechenden Daten erfordert).
· Leistung – Da die Binärdateien im Dateisystem des Webservers und nicht in der Datenbank gespeichert werden, kann die Anwendung auf weniger Daten in der Datenbank zugreifen, wodurch die Anforderungen an die Datenbank und entsprechend die Anforderungen an das Web und die Netzwerküberlastung dazwischen reduziert werden Datenbankserver.
Der Hauptvorteil der direkten Speicherung von Daten in der Datenbank besteht darin, dass die Daten „eigenständig“ sind. Da nun alle Daten in der Datenbank enthalten sind, sind Datenunterstützung, Datenverschiebung zwischen Datenbankservern, Datenbankreplikation usw. viel einfacher, da Sie sich keine Gedanken über das Kopieren oder Sichern des im Dateisystem gespeicherten Binärinhalts machen müssen.
Wie immer hängt die Wahl der Speicherlösung vom tatsächlichen Einsatzort und den Geschäftsanforderungen ab. Ich habe beispielsweise einen Client entwickelt, bei dem die Binärdaten in einer Datenbank gespeichert werden mussten, da die von ihnen verwendete Berichtssoftware nur Binärdaten in den Bericht aufnehmen konnte – wenn sie aus der Datenbank stammten. In einem anderen Fall arbeitete ein Kollege von mir an einem Projekt, bei dem die Binärdateien von einer Webanwendung verwendet und über FTP verfügbar sein mussten. In diesem Fall mussten die Binärdaten im Dateisystem gespeichert werden.
3. Erstellen Sie eine Datenbanktabelle zum Speichern von Binärdaten.
Der Rest dieses Artikels analysiert eine einfache ASP.NET 2.0-Bildergalerieanwendung, die ich mit Microsoft SQL Server 2005 Express Edition geschrieben habe, um die direkten Konzepte im Zusammenhang mit dem Speichern und Abrufen von Binärdaten in einem zu demonstrieren Datenbank.
Das Datenmodell dieser Bildergalerie-Anwendung besteht aus einer Tabelle – Bilder, wobei jeder Datensatz einem Bild in der Galerie entspricht. Das MIMEType-Feld dieser Bildertabelle speichert den MIME-Typ des hochgeladenen Bildes (image/jpeg für JPG-Dateien, image/gif für GIF-Dateien usw.); der MIME-Typ gibt hier dem Browser an, wie die Binärdaten generiert werden sollen. Die ImageData-Spalte speichert den tatsächlichen Binärinhalt des Bildes.
4. Laden Sie ein Bild hoch und speichern Sie Binärdaten mit ADO.NET-Code.
Mit dieser Bildergalerie können Besucher Bilddateien (GIF-, JPG- und PNG-Formate) in diese Anwendung hochladen. Nach dem Hochladen wird ein neuer Datensatz zur Bildertabelle hinzugefügt und der Inhalt der Bilddatei wird in der ImageData-Spalte des neuen Datensatzes gespeichert. Um in ASP.NET 2.0 Dateien vom Webbrowser auf den Webserver hochzuladen, wird in diesem Beispiel das FileUpload-Steuerelement verwendet. Die Verwendung des FileUpload-Steuerelements ist sehr einfach – ziehen Sie es einfach aus der Symbolleiste auf Ihre Seite. Letztendlich wird dieses FileUpload-Steuerelement im Browser des Benutzers als Standardformular zum Hochladen von Dateien generiert – eine Schaltfläche „Durchsuchen“ (wenn sie angeklickt wird) ermöglicht es dem Benutzer, eine Datei von seiner Festplatte auszuwählen, um sie auf den Webserver hochzuladen.
Um beispielsweise eine Schnittstelle zum Hinzufügen eines neuen Bildes zu erstellen, habe ich ein TextBox-Steuerelement verwendet, um den Titel des Bildes zu erfassen, und ein FileUpload-Steuerelement, damit der Benutzer das hochzuladende Bild angeben kann:
<b>Title:</b>
<asp:TextBox ID="PictureTitle" runat="server" />
<br />
<b>Bild:</b>
<asp:FileUpload ID="UploadedFile" runat="server" />
<br />
<asp:LinkButton ID="btnInsert" runat="server" Text="Insert" />
<asp:LinkButton ID="btnCancel" runat="server" Text="Cancel" />
Der obige Code erstellt eine Seite, auf der der Benutzer eine Datei von seiner Festplatte angeben kann, die auf den Webserver hochgeladen werden soll.
Sobald der Benutzer eine Datei auswählt und das Formular sendet (z. B. durch Klicken auf die Schaltfläche „Einfügen“), wird der binäre Inhalt der angegebenen Datei an den Webserver gesendet. Aus serverseitigem Code werden diese Binärdaten über die PostedFile.InputStream-Eigenschaft des FileUpload-Steuerelements verfügbar, wie durch das folgende Markup und den folgenden Code veranschaulicht:
Protected Sub btnInsert_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnInsert . Klicken
„Stellen Sie sicher, dass eine Datei erfolgreich hochgeladen wurde.“
Wenn UploadedFile.PostedFile nichts ist, oder sonst String.IsNullOrEmpty(UploadedFile.PostedFile.FileName) oder sonst, ist UploadedFile.PostedFile.InputStream dann nichts
...Fehlermeldung anzeigen...
Sub verlassen
Ende wenn
„Stellen Sie sicher, dass wir mit einer JPG- oder GIF-Datei arbeiten.“
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...“
Sub verlassen
Ende Wählen Sie
„Mit der Datenbank verbinden und einen neuen Datensatz in die Produkttabelle einfügen“.
Verwenden von myConnection As New SqlConnection(ConfigurationManager.ConnectionStrings("ImageGalleryConnectionString").ConnectionString)
Const SQL As String = "INSERT INTO [Pictures] ([Title], [MIMEType], [ImageData]) VALUES (@Title, @MIMEType, @ Bilddaten)“
Dimmen Sie myCommand als neues SqlCommand(SQL, myConnection)
myCommand.Parameters.AddWithValue("@Title", PictureTitle.Text.Trim())
myCommand.Parameters.AddWithValue("@MIMEType", MIMEType)
'Laden Sie den InputStream des FileUpload-Steuerelements in ein Byte-Array
Dimmen Sie imageBytes(UploadedFile.PostedFile.InputStream.Length) als Byte
UploadedFile.PostedFile.InputStream.Read(imageBytes, 0, imageBytes.Length)
myCommand.Parameters.AddWithValue("@ImageData", imageBytes)
myConnection.Open()
myCommand.ExecuteNonQuery()
myConnection.Close()
Beenden Sie die Verwendung
End
SubHere, dieser Event-Handler stellt zunächst sicher, dass eine Datei hochgeladen wurde. Anschließend wird der MIME-Typ anhand der hochgeladenen Dateierweiterung ermittelt.
Der bemerkenswerteste Teil des oben Gesagten ist der Codeabschnitt, der die @ImageData-Parameter festlegt. Erstellen Sie zunächst ein Byte-Array mit dem Namen imageBytes und machen Sie dessen Länge zum entsprechenden InputStream der hochzuladenden Datei. Verwenden Sie dann die Read-Methode von InputStream, um den binären Inhalt in dieses Byte-Array zu füllen. Beachten Sie, dass dieses Byte-Array als Wert von @ImageData angegeben wird.