Share via


Hochladen von Dateien (VB)

von Scott Mitchell

PDF herunterladen

Erfahren Sie, wie Sie Benutzern das Hochladen von Binärdateien (z. B. Word oder PDF-Dokumenten) auf Ihre Website ermöglichen, wo sie entweder im Dateisystem des Servers oder in der Datenbank gespeichert werden können.

Einführung

Alle bisher untersuchten Tutorials haben ausschließlich mit Textdaten gearbeitet. Viele Anwendungen verfügen jedoch über Datenmodelle, die sowohl Text- als auch Binärdaten erfassen. Eine Online-Dating-Website kann es Benutzern ermöglichen, ein Bild hochzuladen, um es ihrem Profil zuzuordnen. Eine Recruiting-Website kann Benutzern ermöglichen, ihren Lebenslauf als Microsoft Word- oder PDF-Dokument hochzuladen.

Die Arbeit mit Binärdaten stellt neue Herausforderungen bereit. Wir müssen entscheiden, wie die Binärdaten in der Anwendung gespeichert werden. Die Zum Einfügen neuer Datensätze verwendete Schnittstelle muss aktualisiert werden, damit der Benutzer eine Datei von ihrem Computer hochladen kann, und es müssen zusätzliche Schritte ausgeführt werden, um ein Mittel zum Herunterladen eines Datensatzes mit zugeordneten Binärdaten anzuzeigen oder bereitzustellen. In diesem Tutorial und den nächsten drei Lernprogramm erfahren Sie, wie Sie diese Herausforderungen überwinden können. Am Ende dieser Tutorials haben wir eine voll funktionsfähige Anwendung erstellt, die jeder Kategorie ein Bild und eine PDF-Broschüre ordnet. In diesem speziellen Tutorial untersuchen wir verschiedene Techniken zum Speichern von Binärdaten und untersuchen, wie Benutzer eine Datei von ihrem Computer hochladen und im Dateisystem des Webservers speichern können.

Hinweis

Binärdaten, die Teil eines Anwendungsdatenmodells sind, werden manchmal als BLOB bezeichnet, ein Akronym für Binary Large OBject. In diesen Tutorials habe ich mich für die Verwendung der Terminologie-Binärdaten entschieden, obwohl der Begriff BLOB synonym ist.

Schritt 1: Erstellen der Webseiten zum Arbeiten mit binären Daten

Bevor wir uns mit den Herausforderungen im Zusammenhang mit dem Hinzufügen von Unterstützung für Binärdaten befassen, nehmen wir uns zunächst einen Moment Zeit, um die ASP.NET Seiten in unserem Websiteprojekt zu erstellen, die wir für dieses Tutorial und die nächsten drei benötigen. Fügen Sie zunächst einen neuen Ordner mit dem Namen hinzu BinaryData. Fügen Sie als Nächstes die folgenden ASP.NET Seiten zu diesem Ordner hinzu, und stellen Sie sicher, dass Sie jede Seite der Site.master master Seite zuordnen:

  • Default.aspx
  • FileUpload.aspx
  • DisplayOrDownloadData.aspx
  • UploadInDetailsView.aspx
  • UpdatingAndDeleting.aspx

Hinzufügen der ASP.NET Pages für die Tutorials für binäre Data-Related

Abbildung 1: Hinzufügen der ASP.NET Pages für die Tutorials zu binären Data-Related

Wie in den anderen Ordnern Default.aspx listet der BinaryData Ordner die Tutorials in seinem Abschnitt auf. Denken Sie daran, dass das SectionLevelTutorialListing.ascx Benutzersteuerelement diese Funktionalität bereitstellt. Fügen Sie daher dieses Benutzersteuerelement zu Default.aspx hinzu, indem Sie es vom Projektmappen-Explorer in die Entwurfsansicht der Seite ziehen.

Hinzufügen des SectionLevelTutorialListing.ascx-Benutzersteuerelements zu Default.aspx

Abbildung 2: Hinzufügen des SectionLevelTutorialListing.ascx Benutzersteuerelements zu (Klicken Sie hier, umDefault.aspx das Bild in voller Größe anzuzeigen)

Fügen Sie schließlich diese Seiten als Einträge zur Web.sitemap Datei hinzu. Fügen Sie insbesondere das folgende Markup nach dem Abschnitt Verbessern der GridView <siteMapNode>hinzu:

<siteMapNode 
    title="Working with Binary Data" 
    url="~/BinaryData/Default.aspx" 
    description="Extend the data model to include collecting binary data.">
    
    <siteMapNode 
        title="Uploading Files" 
        url="~/BinaryData/FileUpload.aspx" 
        description="Examine the different ways to store binary data on the 
                     web server and see how to accept uploaded files from users 
                     with the FileUpload control." />
    <siteMapNode 
        title="Display or Download Binary Data" 
        url="~/BinaryData/DisplayOrDownloadData.aspx" 
        description="Let users view or download the captured binary data." />
    <siteMapNode 
        title="Adding New Binary Data" 
        url="~/BinaryData/UploadInDetailsView.aspx" 
        description="Learn how to augment the inserting interface to 
                     include a FileUpload control." />
    <siteMapNode 
        title="Updating and Deleting Existing Binary Data" 
        url="~/BinaryData/UpdatingAndDeleting.aspx" 
        description="Learn how to update and delete existing binary data." />
</siteMapNode>

Nehmen Sie sich nach dem Aktualisieren Web.sitemapeinen Moment Zeit, um die Tutorials-Website über einen Browser anzuzeigen. Das Menü auf der linken Seite enthält nun Elemente für die Tutorials Arbeiten mit Binärdaten.

Die Siteübersicht enthält jetzt Einträge für die Tutorials zum Arbeiten mit Binärdaten.

Abbildung 3: Die Siteübersicht enthält jetzt Einträge für die Tutorials zum Arbeiten mit binären Daten.

Schritt 2: Entscheiden, wo die Binärdaten gespeichert werden sollen

Binärdaten, die dem Datenmodell der Anwendung zugeordnet sind, können an einem von zwei Orten gespeichert werden: im Dateisystem des Webservers mit einem Verweis auf die in der Datenbank gespeicherte Datei; oder direkt in der Datenbank selbst (siehe Abbildung 4). Jeder Ansatz hat seine eigenen Vor- und Nachteile und verdient eine ausführlichere Diskussion.

Binärdaten können im Dateisystem oder direkt in der Datenbank gespeichert werden.

Abbildung 4: Binärdaten können im Dateisystem oder direkt in der Datenbank gespeichert werden (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)

Stellen Sie sich vor, wir wollten die Northwind-Datenbank erweitern, um jedem Produkt ein Bild zuzuordnen. Eine Möglichkeit wäre, diese Bilddateien im Dateisystem des Webservers zu speichern und den Pfad in der Products Tabelle aufzuzeichnen. Bei diesem Ansatz fügen wir der Products Tabelle möglicherweise eine ImagePath Spalte vom Typ varchar(200)hinzu. Wenn ein Benutzer ein Bild für Chai hochgeladen hat, wird dieses Bild möglicherweise im Dateisystem des Webservers unter ~/Images/Tea.jpggespeichert, wobei ~ der physische Pfad der Anwendung darstellt. Das heißt, wenn die Website am physischen Pfad C:\Websites\Northwind\verwurzelt ist, ~/Images/Tea.jpg entspricht C:\Websites\Northwind\Images\Tea.jpg. Nach dem Hochladen der Bilddatei wird der Chai-Datensatz in der Products Tabelle aktualisiert, sodass seine ImagePath Spalte auf den Pfad des neuen Images verweist. Wir könnten oder nur Tea.jpg verwenden~/Images/Tea.jpg, wenn wir entschieden haben, dass alle Produktbilder im Ordner der Images Anwendung platziert werden.

Die Standard Vorteile der Speicherung der Binärdaten im Dateisystem sind:

  • Einfache Implementierung , wie wir in Kürze sehen werden, das Speichern und Abrufen von binärdaten, die direkt in der Datenbank gespeichert sind, erfordert etwas mehr Code als bei der Arbeit mit Daten über das Dateisystem. Darüber hinaus muss ein Benutzer, damit er Binärdaten anzeigen oder herunterladen kann, eine URL zu diesen Daten angezeigt werden. Wenn sich die Daten im Dateisystem des Webservers befinden, ist die URL einfach. Wenn die Daten jedoch in der Datenbank gespeichert sind, muss eine Webseite erstellt werden, die die Daten aus der Datenbank abruft und zurückgibt.
  • Breiterer Zugriff auf die Binärdaten , auf die die Binärdaten möglicherweise für andere Dienste oder Anwendungen zugreifen müssen, die die Daten nicht aus der Datenbank abrufen können. Beispielsweise müssen die jedem Produkt zugeordneten Bilder möglicherweise auch über FTP für Benutzer verfügbar sein. In diesem Fall möchten wir die Binärdaten im Dateisystem speichern.
  • Leistung : Wenn die Binärdaten im Dateisystem gespeichert werden, ist der Bedarf und die Netzwerküberlastung zwischen Datenbankserver und Webserver geringer, als wenn die Binärdaten direkt in der Datenbank gespeichert werden.

Der Standard Nachteil des Speicherns von Binärdaten im Dateisystem besteht darin, dass die Daten von der Datenbank entkoppelt werden. Wenn ein Datensatz aus der Products Tabelle gelöscht wird, wird die zugeordnete Datei im Dateisystem des Webservers nicht automatisch gelöscht. Wir müssen zusätzlichen Code schreiben, um die Datei zu löschen, andernfalls wird das Dateisystem mit nicht verwendeten, verwaisten Dateien überladen. Darüber hinaus müssen wir beim Sichern der Datenbank sicherstellen, dass auch sicherungen der zugehörigen Binärdaten im Dateisystem erstellt werden. Das Verschieben der Datenbank an einen anderen Standort oder Server stellt ähnliche Herausforderungen.

Alternativ können Binärdaten direkt in einer Microsoft SQL Server 2005-Datenbank gespeichert werden, indem eine Spalte vom Typ varbinaryerstellt wird. Wie bei anderen Datentypen mit variabler Länge können Sie eine maximale Länge der Binärdaten angeben, die in dieser Spalte gespeichert werden können. Um beispielsweise maximal 5.000 Bytes zu reservieren, verwenden Sie varbinary(5000); varbinary(MAX) ermöglicht die maximale Speichergröße von ca. 2 GB.

Der Standard Vorteil der direkten Speicherung von Binärdaten in der Datenbank ist die enge Kopplung zwischen den Binärdaten und dem Datenbankdatensatz. Dadurch werden Datenbankverwaltungsaufgaben wie Sicherungen oder das Verschieben der Datenbank an einen anderen Standort oder Server erheblich vereinfacht. Außerdem werden beim Löschen eines Datensatzes automatisch die entsprechenden Binärdaten gelöscht. Es gibt auch subtilere Vorteile der Speicherung der Binärdaten in der Datenbank.

Hinweis

In Microsoft SQL Server 2000 und früheren Versionen war der varbinary Datentyp maximal 8.000 Bytes. Zum Speichern von bis zu 2 GB Binärdaten muss stattdessen der image Datentyp verwendet werden. Mit dem Hinzufügen von MAX in SQL Server 2005 ist der image Datentyp jedoch veraltet. Es wird weiterhin aus Gründen der Abwärtskompatibilität unterstützt, aber Microsoft hat angekündigt, dass der image Datentyp in einer zukünftigen Version von SQL Server entfernt wird.

Wenn Sie mit einem älteren Datenmodell arbeiten, wird möglicherweise der image Datentyp angezeigt. Die Tabelle der Northwind-Datenbank Categories enthält eine Picture Spalte, die zum Speichern der Binärdaten einer Bilddatei für die Kategorie verwendet werden kann. Da die Northwind-Datenbank ihre Wurzeln in Microsoft Access und früheren Versionen von SQL Server hat, hat diese Spalte den Typ image.

Für dieses Tutorial und die nächsten drei Ansätze werden beide Ansätze verwendet. Die Categories Tabelle enthält bereits eine Picture Spalte zum Speichern des binären Inhalts eines Bilds für die Kategorie. Wir fügen eine zusätzliche Spalte hinzu, BrochurePath, um einen Pfad zu einer PDF-Datei im Dateisystem des Webservers zu speichern, die verwendet werden kann, um eine übersichtliche Übersicht über die Kategorie in Druckqualität bereitzustellen.

Schritt 3: Hinzufügen derBrochurePathSpalte zurCategoriesTabelle

Derzeit enthält die Tabelle Categories nur vier Spalten: CategoryID, CategoryName, Descriptionund Picture. Zusätzlich zu diesen Feldern müssen wir ein neues hinzufügen, das auf die Broschüre der Kategorie verweist (sofern vorhanden). Wechseln Sie zum Hinzufügen dieser Spalte zum serverbasierten Explorer, führen Sie einen Drilldown in die Tabellen durch, klicken Sie mit der rechten Maustaste auf die Categories Tabelle, und wählen Sie Tabellendefinition öffnen aus (siehe Abbildung 5). Wenn die Server-Explorer nicht angezeigt wird, rufen Sie ihn auf, indem Sie im Menü Ansicht die Option Server Explorer auswählen oder STRG+ALT+S drücken.

Fügen Sie der Tabelle eine neue varchar(200) Spalte mit dem Categories Namen BrochurePath hinzu, die s zulässt NULL , und klicken Sie auf das Symbol Speichern (oder drücken Sie STRG+S).

Hinzufügen einer BrochurePath-Spalte zur Tabelle

Abbildung 5: Hinzufügen einer BrochurePath Spalte zur Categories Tabelle (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)

Schritt 4: Aktualisieren der Architektur zur Verwendung derPictureSpalten undBrochurePath

In CategoriesDataTable der Datenzugriffsschicht (Data Access Layer, DAL) sind derzeit vier DataColumn s definiert: CategoryID, CategoryName, Descriptionund NumberOfProducts. Als wir diese DataTable ursprünglich im Tutorial Erstellen einer Datenzugriffsebene entworfen haben, hatte die CategoriesDataTable nur die ersten drei Spalten. Die NumberOfProducts Spalte wurde im Tutorial Master/Detail Using a Bulleted List of Master Records with a Details DataList hinzugefügt.

Wie unter Erstellen einer Datenzugriffsebene beschrieben, bilden die DataTables im typisierten DataSet die Geschäftsobjekte. Die TableAdapters sind für die Kommunikation mit der Datenbank und das Auffüllen der Geschäftsobjekte mit den Abfrageergebnissen verantwortlich. Wird CategoriesDataTable von aufgefüllt, das CategoriesTableAdapterüber drei Datenabrufmethoden verfügt:

  • GetCategories()führt die TableAdapter-Standard Abfrage aus und gibt die CategoryIDFelder , CategoryNameund Description aller Datensätze in der Categories Tabelle zurück. Die Standard Abfrage wird von den automatisch generierten Insert Methoden und Update verwendet.
  • GetCategoryByCategoryID(categoryID) gibt die CategoryIDFelder , CategoryNameund Description der Kategorie zurück, deren CategoryIDKategorie gleich categoryID ist.
  • GetCategoriesAndNumberOfProducts() - gibt die CategoryIDFelder , CategoryNameund Description für alle Datensätze in der Categories Tabelle zurück. Verwendet auch eine Unterabfrage, um die Anzahl der Produkte zurückzugeben, die jeder Kategorie zugeordnet sind.

Beachten Sie, dass keine dieser Abfragen die Categories Tabellen oder PictureBrochurePath Spalten zurückgibt, und dass die CategoriesDataTable s für diese Felder nicht bereitstellt DataColumn . Um mit den Eigenschaften "Bild" und BrochurePath "Bild" zu arbeiten, müssen sie zuerst der CategoriesDataTable -Klasse hinzugefügt und dann aktualisiert werden CategoriesTableAdapter , um diese Spalten zurückzugeben.

Hinzufügen von undPictureBrochurePath``DataColumn

Fügen Sie zunächst diese beiden Spalten hinzu CategoriesDataTable. Klicken Sie mit der rechten Maustaste auf die CategoriesDataTable Kopfzeile s, wählen Sie im Kontextmenü Hinzufügen aus, und wählen Sie dann die Option Spalte aus. Dadurch wird ein neues DataColumn in der DataTable mit dem Namen Column1erstellt. Benennen Sie diese Spalte in um Picture. Legen Sie in der Eigenschaftenfenster die DataColumn s-Eigenschaft auf System.Byte[] fest (dies DataType ist keine Option in der Dropdownliste; Sie müssen sie eingeben).

Erstellen eines benannten DataColumn-Bilds, dessen DataType System.Byte[]

Abbildung 6: Erstellen eines DataColumn Namens Picture , dessen DataType Name ist System.Byte[] (Klicken Sie hier, um das bild in voller Größe anzuzeigen)

Fügen Sie der DataTable eine weitere DataColumn hinzu, und benennen Sie sie BrochurePath mithilfe des Standardwerts DataType (System.String).

Zurückgeben derPictureWerte undBrochurePathaus dem TableAdapter

Nachdem diese beiden DataColumn s hinzugefügt wurden CategoriesDataTable, sind wir bereit, die CategoriesTableAdapterzu aktualisieren. Wir könnten beide Spaltenwerte in der Standard TableAdapter-Abfrage zurückgeben, aber dies würde die Binärdaten jedes Mal zurückbringen, wenn die GetCategories() Methode aufgerufen wurde. Aktualisieren Sie stattdessen die Standard TableAdapter-Abfrage, um eine zusätzliche Datenabrufmethode zurückzubringen BrochurePath und zu erstellen, die eine bestimmte Spalte der Picture Kategorie zurückgibt.

Um die Standard TableAdapter-Abfrage zu aktualisieren, klicken Sie mit der rechten Maustaste auf den CategoriesTableAdapter Header s, und wählen Sie im Kontextmenü die Option Konfigurieren aus. Dadurch wird der Konfigurations-Assistent für Tabellenadapter angezeigt, den wir in einer Reihe früherer Tutorials gesehen haben. Aktualisieren Sie die Abfrage, um die zurückzubringen, BrochurePath und klicken Sie auf Fertig stellen.

Aktualisieren sie die Spaltenliste in der SELECT-Anweisung, um auch BrochurePath zurückzugeben.

Abbildung 7: Aktualisieren der Spaltenliste in der SELECT Anweisung auf Auch Zurückgeben BrochurePath (Klicken Sie hier, um das bild in voller Größe anzuzeigen)

Wenn Sie Ad-hoc-SQL-Anweisungen für den TableAdapter verwenden, aktualisiert das Aktualisieren der Spaltenliste in der Standard Abfrage die Spaltenliste für alle SELECT Abfragemethoden im TableAdapter. Das bedeutet, dass die GetCategoryByCategoryID(categoryID) Methode aktualisiert wurde, um die BrochurePath Spalte zurückzugeben, was möglicherweise beabsichtigt ist. Es wurde jedoch auch die Spaltenliste in der GetCategoriesAndNumberOfProducts() -Methode aktualisiert und die Unterabfrage entfernt, die die Anzahl der Produkte für jede Kategorie zurückgibt! Daher müssen wir die Abfrage dieser Methode SELECT aktualisieren. Klicken Sie mit der rechten Maustaste auf die GetCategoriesAndNumberOfProducts() Methode, wählen Sie Konfigurieren aus, und rückgängig machen Sie die SELECT Abfrage wieder auf ihren ursprünglichen Wert zurück:

SELECT CategoryID, CategoryName, Description, 
       (SELECT COUNT(*) 
            FROM Products p 
            WHERE p.CategoryID = c.CategoryID) 
       as NumberOfProducts
FROM Categories c

Erstellen Sie als Nächstes eine neue TableAdapter-Methode, die einen bestimmten Spaltenwert der Picture Kategorie zurückgibt. Klicken Sie mit der rechten Maustaste auf den CategoriesTableAdapter Header s, und wählen Sie die Option Abfrage hinzufügen aus, um den TableAdapter-Abfragekonfigurations-Assistenten zu starten. Im ersten Schritt dieses Assistenten werden wir gefragt, ob wir Daten mithilfe einer Ad-hoc-SQL-Anweisung, einer neuen gespeicherten Prozedur oder einer vorhandenen abfragen möchten. Wählen Sie SQL-Anweisungen verwenden aus, und klicken Sie auf Weiter. Da wir eine Zeile zurückgeben, wählen Sie die Option SELECT aus, die Zeilen zurückgibt, aus dem zweiten Schritt.

Wählen Sie die Option SQL-Anweisungen verwenden aus.

Abbildung 8: Wählen Sie die Option SQL-Anweisungen verwenden aus (Klicken Sie hier, um das bild in voller Größe anzuzeigen)

Da die Abfrage einen Datensatz aus der Tabelle Kategorien zurückgibt, wählen Sie SELECT aus, das Zeilen zurückgibt.

Abbildung 9: Da die Abfrage einen Datensatz aus der Tabelle Kategorien zurückgibt, wählen Sie SELECT aus, das Zeilen zurückgibt (Klicken Sie, um das bild in voller Größe anzuzeigen)

Geben Sie im dritten Schritt die folgende SQL-Abfrage ein, und klicken Sie auf Weiter:

SELECT     CategoryID, CategoryName, Description, BrochurePath, Picture
FROM       Categories
WHERE      CategoryID = @CategoryID

Der letzte Schritt besteht darin, den Namen für die neue Methode auszuwählen. Verwenden Sie FillCategoryWithBinaryDataByCategoryID bzw GetCategoryWithBinaryDataByCategoryID . für die Muster Füllen einer DataTable und Zurückgeben einer DataTable. Klicken Sie auf Fertig stellen, um den Assistenten abzuschließen.

Wählen Sie die Namen für die TableAdapter-Methoden aus.

Abbildung 10: Auswählen der Namen für die TableAdapter-Methoden (Klicken Sie hier, um das vollständige Bild anzuzeigen)

Hinweis

Nach Abschluss des Assistenten zum Konfigurieren von Tabellenadapterabfragen wird möglicherweise ein Dialogfeld angezeigt, in dem Sie darüber informiert werden, dass der neue Befehlstext Daten mit einem anderen Schema als dem Schema der Standard Abfrage zurückgibt. Kurz gesagt, der Assistent stellt fest, dass die TableAdapter-Standard-Abfrage GetCategories() ein anderes Schema als das soeben erstellte zurückgibt. Aber das ist es, was wir wollen, sodass Sie diese Nachricht ignorieren können.

Beachten Sie außerdem, dass, wenn Sie Ad-hoc-SQL-Anweisungen verwenden und den Assistenten verwenden, um die TableAdapter-Standard-Abfrage zu einem späteren Zeitpunkt zu ändern, die Spaltenliste der -Anweisung der GetCategoryWithBinaryDataByCategoryID Methode SELECT so ändert, dass sie nur diese Spalten aus der Standard-Abfrage enthält (d. a. die Spalte wird aus der Abfrage entferntPicture). Sie müssen die Spaltenliste manuell aktualisieren, um die Picture Spalte zurückzugeben, ähnlich wie bei der GetCategoriesAndNumberOfProducts() Methode weiter oben in diesem Schritt.

Nachdem Sie die beiden DataColumn s zur CategoriesDataTable - und -GetCategoryWithBinaryDataByCategoryIDMethode hinzugefügt CategoriesTableAdapterhaben, sollten diese Klassen im typisierten DataSet-Designer wie der Screenshot in Abbildung 11 aussehen.

Die DataSet-Designer enthält die neuen Spalten und Methoden

Abbildung 11: Das DataSet-Designer enthält die neuen Spalten und Die neue Methode

Aktualisieren der Geschäftslogikebene (Business Logic Layer, BLL)

Nachdem die DAL aktualisiert wurde, müssen Sie nur noch die Business Logic Layer (BLL) erweitern, um eine Methode für die neue CategoriesTableAdapter Methode einzuschließen. Fügen Sie der CategoriesBLL-Klasse die folgende Methode hinzu:

<System.ComponentModel.DataObjectMethodAttribute _
    (System.ComponentModel.DataObjectMethodType.Select, False)> _
Public Function GetCategoryWithBinaryDataByCategoryID(categoryID As Integer) _
    As Northwind.CategoriesDataTable
    
    Return Adapter.GetCategoryWithBinaryDataByCategoryID(categoryID)
End Function

Schritt 5: Hochladen einer Datei vom Client auf den Webserver

Beim Sammeln von Binärdaten werden diese Daten häufig von einem Endbenutzer bereitgestellt. Um diese Informationen zu erfassen, muss der Benutzer in der Lage sein, eine Datei von ihrem Computer auf den Webserver hochzuladen. Die hochgeladenen Daten müssen dann in das Datenmodell integriert werden. Dies kann bedeuten, dass die Datei im Dateisystem des Webservers gespeichert und ein Pfad zur Datei in der Datenbank hinzugefügt oder der binäre Inhalt direkt in die Datenbank geschrieben wird. In diesem Schritt erfahren Sie, wie Sie einem Benutzer das Hochladen von Dateien von ihrem Computer auf den Server erlauben. Im nächsten Tutorial widmen wir uns der Integration der hochgeladenen Datei in das Datenmodell.

ASP.NET 2.0 s neues FileUpload-Websteuerelement bietet benutzern einen Mechanismus zum Senden einer Datei von ihrem Computer an den Webserver. Das FileUpload-Steuerelement wird als Element <input> gerendert, dessen type Attribut auf datei festgelegt ist, das Browser als Textfeld mit der Schaltfläche Durchsuchen anzeigen. Durch Klicken auf die Schaltfläche Durchsuchen wird ein Dialogfeld angezeigt, in dem der Benutzer eine Datei auswählen kann. Wenn das Formular zurückgesendet wird, wird der Inhalt der ausgewählten Datei zusammen mit dem Postback gesendet. Auf der Serverseite sind Informationen zur hochgeladenen Datei über die Eigenschaften des FileUpload-Steuerelements zugänglich.

Um das Hochladen von Dateien zu veranschaulichen, öffnen Sie die FileUpload.aspx Seite im BinaryData Ordner, ziehen Sie ein FileUpload-Steuerelement aus der Toolbox auf die Designer, und legen Sie die Eigenschaft des Steuerelements ID auf festUploadTest. Fügen Sie als Nächstes ein Schaltflächen-Websteuerelement hinzu, das seine ID Eigenschaften und Text bzw UploadButton . Ausgewählte Datei hochladen festlegt. Platzieren Sie schließlich ein Label Web-Steuerelement unter der Schaltfläche, löschen Sie seine Text Eigenschaft, und legen Sie seine ID Eigenschaft auf fest UploadDetails.

Hinzufügen eines FileUpload-Steuerelements zur ASP.NET Seite

Abbildung 12: Hinzufügen eines FileUpload-Steuerelements zur ASP.NET Seite (Klicken Sie hier, um das bild in voller Größe anzuzeigen)

Abbildung 13 zeigt diese Seite, wenn sie über einen Browser angezeigt wird. Beachten Sie, dass durch Klicken auf die Schaltfläche Durchsuchen ein Dateiauswahldialogfeld angezeigt wird, sodass der Benutzer eine Datei von ihrem Computer auswählen kann. Nachdem eine Datei ausgewählt wurde, führt das Klicken auf die Schaltfläche Ausgewählte Datei hochladen zu einem Postback, das den binären Inhalt der ausgewählten Datei an den Webserver sendet.

Der Benutzer kann eine Datei auswählen, die von ihrem Computer auf den Server hochgeladen werden soll.

Abbildung 13: Der Benutzer kann eine Datei auswählen, die von ihrem Computer auf den Server hochgeladen werden soll (Klicken Sie hier, um das bild in voller Größe anzuzeigen)

Beim Postback kann die hochgeladene Datei im Dateisystem gespeichert werden, oder die binären Daten können direkt über eine Stream bearbeitet werden. In diesem Beispiel erstellen sie einen ~/Brochures Ordner und speichern die hochgeladene Datei dort. Fügen Sie zunächst den Brochures Ordner zur Website als Unterordner des Stammverzeichnisses hinzu. Erstellen Sie als Nächstes einen Ereignishandler für das UploadButton s-Ereignis Click , und fügen Sie den folgenden Code hinzu:

Protected Sub UploadButton_Click(sender As Object, e As EventArgs) _
    Handles UploadButton.Click
    
    If UploadTest.HasFile = False Then
        ' No file uploaded!
        UploadDetails.Text = "Please first select a file to upload..."
    Else
        ' Display the uploaded file's details
        UploadDetails.Text = String.Format( _
                "Uploaded file: {0}<br />" & _
                "File size (in bytes): {1:N0}<br />" & _
                "Content-type: {2}", _
                UploadTest.FileName, _
                UploadTest.FileBytes.Length, _
                UploadTest.PostedFile.ContentType)
        ' Save the file
        Dim filePath As String = _
            Server.MapPath("~/Brochures/" & UploadTest.FileName)
        UploadTest.SaveAs(filePath)
    End If
End Sub

Das FileUpload-Steuerelement bietet eine Vielzahl von Eigenschaften für die Arbeit mit den hochgeladenen Daten. Für instance gibt die HasFile -Eigenschaft an, ob eine Datei vom Benutzer hochgeladen wurde, während die FileBytes -Eigenschaft zugriff auf die hochgeladenen Binärdaten als Bytearray ermöglicht. Der Click Ereignishandler stellt zunächst sicher, dass eine Datei hochgeladen wurde. Wenn eine Datei hochgeladen wurde, zeigt die Bezeichnung den Namen der hochgeladenen Datei, ihre Größe in Bytes und ihren Inhaltstyp an.

Hinweis

Um sicherzustellen, dass der Benutzer eine Datei hochlädt, können Sie die HasFile Eigenschaft überprüfen und eine Warnung anzeigen, wenn dies der Wert ist False, oder Sie können stattdessen das RequiredFieldValidator-Steuerelement verwenden.

FileUpload s SaveAs(filePath) speichert die hochgeladene Datei im angegebenen filePath. filePath muss ein physischer Pfad (C:\Websites\Brochures\SomeFile.pdf) und kein virtuellerPfad (/Brochures/SomeFile.pdf) sein. Die Server.MapPath(virtPath) Methode nimmt einen virtuellen Pfad an und gibt den entsprechenden physischen Pfad zurück. Hier ist ~/Brochures/fileNameder virtuelle Pfad , wobei fileName der Name der hochgeladenen Datei ist. Weitere Informationen zu virtuellen und physischen Pfaden und zur Verwendung finden Server.MapPathSie unter Server.MapPath Methos.

Nehmen Sie sich nach Abschluss des Click Ereignishandlers einen Moment Zeit, um die Seite in einem Browser zu testen. Klicken Sie auf die Schaltfläche Durchsuchen, wählen Sie eine Datei von Ihrer Festplatte aus, und klicken Sie dann auf die Schaltfläche Ausgewählte Datei hochladen. Das Postback sendet den Inhalt der ausgewählten Datei an den Webserver, der dann Informationen zur Datei anzeigt, bevor sie im ~/Brochures Ordner gespeichert wird. Kehren Sie nach dem Hochladen der Datei zu Visual Studio zurück, und klicken Sie im Projektmappen-Explorer auf die Schaltfläche Aktualisieren. Die soeben hochgeladene Datei sollte im Ordner ~/Brochures angezeigt werden!

Die DateiEvolutionValley.jpg auf den Webserver hochgeladen wurde

Abbildung 14: Die Datei EvolutionValley.jpg wurde auf den Webserver hochgeladen (Klicken Sie hier, um das bild in voller Größe anzuzeigen)

EvolutionValley.jpg wurde im Ordner

Abbildung 15: EvolutionValley.jpg Wurde im ~/Brochures Ordner gespeichert

Feinheiten beim Speichern hochgeladener Dateien im Dateisystem

Es gibt mehrere Feinheiten, die beim Speichern des Hochladens von Dateien in das Dateisystem des Webservers behandelt werden müssen. Da ist zunächst die Frage der Sicherheit. Um eine Datei im Dateisystem zu speichern, muss der Sicherheitskontext, unter dem die ASP.NET Seite ausgeführt wird, über Schreibberechtigungen verfügen. Der ASP.NET Development Web Server wird im Kontext Ihres aktuellen Benutzerkontos ausgeführt. Wenn Sie microsoft Internet Information Services (IIS) als Webserver verwenden, hängt der Sicherheitskontext von der Version von IIS und deren Konfiguration ab.

Eine weitere Herausforderung beim Speichern von Dateien im Dateisystem besteht darin, die Dateien zu benennen. Derzeit speichert unsere Seite alle hochgeladenen Dateien mit dem ~/Brochures gleichen Namen wie die Datei auf dem Clientcomputer in das Verzeichnis. Wenn Benutzer A eine Broschüre mit dem Namen Brochure.pdfhochlädt, wird die Datei als ~/Brochure/Brochure.pdfgespeichert. Was aber, wenn Benutzer B irgendwann später eine andere Broschürendatei hochlädt, die denselben Dateinamen (Brochure.pdf) hat? Mit dem code, den wir jetzt haben, wird die Datei von Benutzer A mit dem Upload von Benutzer B überschrieben.

Es gibt eine Reihe von Techniken zum Auflösen von Dateinamenkonflikten. Eine Option besteht darin, das Hochladen einer Datei zu verbieten, wenn bereits eine Datei mit demselben Namen vorhanden ist. Wenn Benutzer B bei diesem Ansatz versucht, eine Datei mit dem Namen Brochure.pdfhochzuladen, speichert das System die Datei nicht, sondern zeigt stattdessen eine Meldung an, in der Benutzer B aufgefordert wird, die Datei umzubenennen und es erneut zu versuchen. Ein anderer Ansatz besteht darin, die Datei mithilfe eines eindeutigen Dateinamens zu speichern, bei dem es sich um einen global eindeutigen Bezeichner (GUID) oder den Wert aus den Primärschlüsselspalten des entsprechenden Datenbankdatensatzes handeln kann (vorausgesetzt, der Upload ist einer bestimmten Zeile im Datenmodell zugeordnet). Im nächsten Tutorial untersuchen wir diese Optionen ausführlicher.

Herausforderungen im Zusammenhang mit sehr großen Mengen an Binärdaten

In diesen Tutorials wird davon ausgegangen, dass die erfassten Binärdaten bescheiden groß sind. Das Arbeiten mit sehr großen Mengen von Binärdatendateien, die mehrere Megabyte oder größer sind, stellt neue Herausforderungen dar, die den Rahmen dieser Tutorials sprengen. Beispielsweise lehnt ASP.NET Uploads von mehr als 4 MB standardmäßig ab, obwohl dies über das <httpRuntime> -Element in Web.configkonfiguriert werden kann. IIS erzwingt auch eigene Größenbeschränkungen für den Dateiupload. Darüber hinaus kann die Zeit, die zum Hochladen großer Dateien benötigt wird, die Standard 110 Sekunden überschreiten, ASP.NET auf eine Anforderung wartet. Es gibt auch Speicher- und Leistungsprobleme, die bei der Arbeit mit großen Dateien auftreten.

Das FileUpload-Steuerelement ist für große Dateiuploads nicht praktikabel. Während der Inhalt der Datei auf dem Server veröffentlicht wird, muss der Endbenutzer geduldig warten, ohne dass bestätigt wird, dass sein Upload fortschreitet. Dies ist nicht so sehr ein Problem, wenn es sich um kleinere Dateien handelt, die in wenigen Sekunden hochgeladen werden können, sondern kann ein Problem sein, wenn es um größere Dateien geht, für die das Hochladen minuten dauern kann. Es gibt eine Vielzahl von Dateiuploadsteuerelementen von Drittanbietern, die sich besser für die Verarbeitung großer Uploads eignen, und viele dieser Anbieter bieten Fortschrittsindikatoren und ActiveX-Upload-Manager, die eine viel ausgefeiltere Benutzererfahrung bieten.

Wenn Ihre Anwendung große Dateien verarbeiten muss, müssen Sie die Herausforderungen sorgfältig untersuchen und geeignete Lösungen für Ihre speziellen Anforderungen finden.

Zusammenfassung

Das Erstellen einer Anwendung, die Binärdaten erfassen muss, stellt eine Reihe von Herausforderungen dar. In diesem Tutorial haben wir die ersten beiden untersucht: Die Entscheidung, wo die Binärdaten gespeichert werden sollen, und ein Benutzer kann binäre Inhalte über eine Webseite hochladen. In den nächsten drei Tutorials erfahren Sie, wie Sie die hochgeladenen Daten einem Datensatz in der Datenbank zuordnen und wie die Binärdaten neben den Textdatenfeldern angezeigt werden.

Viel Spaß beim Programmieren!

Weitere Informationen

Weitere Informationen zu den in diesem Tutorial erläuterten Themen finden Sie in den folgenden Ressourcen:

Zum Autor

Scott Mitchell, Autor von sieben ASP/ASP.NET-Büchern und Gründer von 4GuysFromRolla.com, arbeitet seit 1998 mit Microsoft-Webtechnologien. Scott arbeitet als unabhängiger Berater, Trainer und Autor. Sein neuestes Buch ist Sams Teach Yourself ASP.NET 2.0 in 24 Stunden. Er kann unter mitchell@4GuysFromRolla.comoder über seinen Blog erreicht werden, der unter http://ScottOnWriting.NETzu finden ist.

Besonderen Dank an

Diese Tutorialreihe wurde von vielen hilfreichen Prüfern überprüft. Leitende Prüfer für dieses Tutorial waren Teresa Murphy und Bernadette Leigh. Möchten Sie meine anstehenden MSDN-Artikel lesen? Wenn dies der Fall ist, legen Sie eine Zeile unter abmitchell@4GuysFromRolla.com.