Hochladen von Dateien (C#)
von Scott Mitchell
Erfahren Sie, wie Sie Benutzern das Hochladen von Binärdateien (z. B. Word- oder PDF-Dokumente) auf Ihre Website ermöglichen, wo sie entweder im Dateisystem des Servers oder in der Datenbank gespeichert werden können.
Einführung
Alle tutorials, die wir bisher untersucht haben, 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 Benutzern das Hochladen eines Bilds ermöglichen, das ihrem Profil zugeordnet werden kann. Mit einer Recruiting-Website können Benutzer ihren Lebenslauf als Microsoft-Word- oder PDF-Dokument hochladen.
Das Arbeiten 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 unternommen werden, um die zugehörigen Binärdaten eines Datensatzes anzuzeigen oder herunterzuladen. 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 eine Bild- und PDF-Broschüre zugeordnet. 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äre Daten, 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 mit den Herausforderungen beginnen, die mit dem Hinzufügen von Unterstützung für Binärdaten verbunden sind, 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. Beginnen Sie mit dem Hinzufügen eines neuen Ordners mit dem Namen BinaryData
. Fügen Sie als Nächstes die folgenden ASP.NET Seiten zu diesem Ordner hinzu, und stellen Sie sicher, dass jede Seite der Site.master
master Seite zugeordnet wird:
Default.aspx
FileUpload.aspx
DisplayOrDownloadData.aspx
UploadInDetailsView.aspx
UpdatingAndDeleting.aspx
Abbildung 1: Hinzufügen der ASP.NET Seiten für die Tutorials für binäre Data-Related
Wie in den anderen Ordnern Default.aspx
werden im BinaryData
Ordner die Tutorials in seinem Abschnitt aufgelistet. Denken Sie daran, dass das SectionLevelTutorialListing.ascx
Benutzersteuerelement diese Funktionalität bereitstellt. Fügen Sie daher dieses Benutzersteuerelement hinzuDefault.aspx
, indem Sie es aus dem Projektmappen-Explorer auf die Entwurfsansicht der Seite ziehen.
Abbildung 2: Hinzufügen des SectionLevelTutorialListing.ascx
Benutzersteuerelements zu Default.aspx
(Klicken Sie hier, um 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 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.sitemap
einen Moment Zeit, um die Tutorials-Website über einen Browser anzuzeigen. Das Menü auf der linken Seite enthält jetzt Elemente für die Tutorials Arbeiten mit binären Daten.
Abbildung 3: Die Siteübersicht enthält jetzt Einträge für die Tutorials zum Arbeiten mit binären Daten.
Schritt 2: Entscheidung, 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.
Abbildung 4: Binäre Daten 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 Imagedateien im Dateisystem des Webservers zu speichern und den Pfad in der Products
Tabelle aufzuzeichnen. Bei diesem Ansatz fügen wir der Tabelle möglicherweise Products
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.jpg
gespeichert, wobei ~
der physische Pfad der Anwendung darstellt. Das heißt, wenn die Website am physischen Pfad C:\Websites\Northwind\
gerootet ist, ~/Images/Tea.jpg
entspricht C:\Websites\Northwind\Images\Tea.jpg
. Nach dem Hochladen der Bilddatei aktualisieren wir den Chai-Datensatz in der Products
Tabelle, sodass seine ImagePath
Spalte auf den Pfad des neuen Images verweist. Wir könnten oder nur Tea.jpg
verwenden~/Images/Tea.jpg
, wenn wir entscheiden, dass alle Produktimages Images
im Ordner der Anwendung platziert werden.
Die Standard Vorteile des Speicherns der Binärdaten im Dateisystem sind:
- Einfache Implementierung , da wir in Kürze sehen werden, ist das Speichern und Abrufen von binärdaten, die direkt in der Datenbank gespeichert sind, etwas mehr Code als beim Arbeiten mit Daten über das Dateisystem. Damit ein Benutzer Binärdaten anzeigen oder herunterladen kann, muss 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 Images möglicherweise auch für Benutzer über FTP 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ären Daten 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, sonst 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 dar.
Alternativ können binäre Daten direkt in einer Microsoft SQL Server 2005-Datenbank gespeichert werden, indem sie eine Spalte vom Typ varbinary
erstellen. 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 des direkten Speicherns 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 löscht das Löschen eines Datensatzes automatisch die entsprechenden Binärdaten. Es gibt auch subtilere Vorteile des Speicherns der Binärdaten in der Datenbank. Ausführlichere Informationen finden Sie unter Direktes Speichern von Binärdateien in der Datenbank mit ASP.NET 2.0 .
Hinweis
In Microsoft SQL Server 2000 und früheren Versionen hatte der varbinary
Datentyp eine maximale Grenze von 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 der image
Datentyp möglicherweise 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, ist diese Spalte vom Typ image
.
Für dieses Tutorial und die nächsten drei Methoden verwenden wir beide Ansätze. 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 derBrochurePath
Spalte zurCategories
Tabelle
Derzeit enthält die Tabelle Kategorien nur vier Spalten: CategoryID
, CategoryName
, Description
und Picture
. Zusätzlich zu diesen Feldern müssen wir ein neues Feld hinzufügen, das auf die Broschüre der Kategorie verweist (sofern vorhanden). Um diese Spalte hinzuzufügen, wechseln Sie zum Explorer Server, führen einen Drilldown zu den Tabellen durch, klicken Sie mit der rechten Maustaste auf die Categories
Tabelle, und wählen Sie Tabellendefinition öffnen aus (siehe Abbildung 5). Wenn der Server Explorer nicht angezeigt wird, rufen Sie ihn auf, indem Sie im Menü Ansicht die Option Server Explorer auswählen, oder drücken Sie STRG+ALT+S.
Fügen Sie der Tabelle eine neue varchar(200)
Spalte hinzu, die Categories
den Namen BrochurePath
hat und s zulässt NULL
, und klicken Sie auf das Symbol Speichern (oder drücken Sie STRG+S).
Abbildung 5: Hinzufügen einer BrochurePath
Spalte zur Tabelle (Klicken Sie hier, um dasCategories
Bild in voller Größe anzuzeigen)
Schritt 4: Aktualisieren der Architektur für die Verwendung derPicture
Spalten undBrochurePath
Die CategoriesDataTable
in der Datenzugriffsebene (Data Access Layer, DAL) hat derzeit vier DataColumn
s definiert: CategoryID
, CategoryName
, Description
und 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 erläutert, 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. Der CategoriesDataTable
wird durch aufgefüllt, das CategoriesTableAdapter
über drei Datenabrufmethoden verfügt:
GetCategories()
führt die TableAdapter s-Standard-Abfrage aus und gibt dieCategoryID
Felder ,CategoryName
undDescription
aller Datensätze in derCategories
Tabelle zurück. Die Standard Abfrage wird von den automatisch generiertenInsert
Methoden undUpdate
verwendet.GetCategoryByCategoryID(categoryID)
gibt dieCategoryID
Felder ,CategoryName
undDescription
der Kategorie zurück, derenCategoryID
categoryID gleich ist.GetCategoriesAndNumberOfProducts()
- gibt dieCategoryID
Felder ,CategoryName
undDescription
für alle Datensätze in derCategories
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 Picture
BrochurePath
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 undPicture
BrochurePath``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 Column1
erstellt. 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).
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 derPicture
Werte undBrochurePath
aus dem TableAdapter
Nachdem diese beiden DataColumn
s hinzugefügt wurden CategoriesDataTable
, sind wir bereit, die CategoriesTableAdapter
zu 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.
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.
Abbildung 8: Wählen Sie die Option SQL-Anweisungen verwenden aus (Klicken Sie hier, um das bild in voller Größe anzuzeigen)
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.
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 -GetCategoryWithBinaryDataByCategoryID
Methode hinzugefügt CategoriesTableAdapter
haben, sollten diese Klassen im typisierten DataSet-Designer wie der Screenshot in Abbildung 11 aussehen.
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 Northwind.CategoriesDataTable
GetCategoryWithBinaryDataByCategoryID(int categoryID)
{
return Adapter.GetCategoryWithBinaryDataByCategoryID(categoryID);
}
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
.
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.
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 void UploadButton_Click(object sender, EventArgs e)
{
if (UploadTest.HasFile == false)
{
// 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
string filePath =
Server.MapPath("~/Brochures/" + UploadTest.FileName);
UploadTest.SaveAs(filePath);
}
}
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/fileName
der virtuelle Pfad , wobei fileName der Name der hochgeladenen Datei ist. Weitere Informationen zu virtuellen und physischen Pfaden und zur Verwendung finden Server.MapPath
Sie unter Server.MapPath-Methode.
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!
Abbildung 14: Die Datei EvolutionValley.jpg
wurde auf den Webserver hochgeladen (Klicken Sie hier, um das bild in voller Größe anzuzeigen)
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. Zunächst geht es um die 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 internetinformationsdienste (IIS) von Microsoft 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 ~/Brochures
unter dem gleichen Namen wie die Datei auf dem Clientcomputer im Verzeichnis. Wenn Benutzer A eine Broschüre mit dem Namen Brochure.pdf
hochlädt, wird die Datei als ~/Brochure/Brochure.pdf
gespeichert. Was aber, wenn Benutzer B irgendwann 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 Möglichkeit besteht darin, das Hochladen einer Datei zu verbieten, wenn bereits eine Datei mit demselben Namen vorhanden ist. Wenn Benutzer B versucht, eine Datei mit dem Namen Brochure.pdf
hochzuladen, speichert das System die Datei nicht und 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 mit einem eindeutigen Dateinamen 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 werden diese Optionen ausführlicher erläutert.
Herausforderungen im Zusammenhang mit sehr großen Mengen von Binärdaten
In diesen Tutorials wird davon ausgegangen, dass die erfassten binären Daten bescheiden 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 standardmäßig Uploads von mehr als 4 MB ab, obwohl dies über das <httpRuntime>
-Element in Web.config
konfiguriert 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 Standardzeit von 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 bereitgestellt wird, muss der Endbenutzer geduldig warten, ohne dass bestätigt wird, dass der Upload fortgesetzt wird. Dies ist nicht so sehr ein Problem, wenn es um kleinere Dateien geht, die in wenigen Sekunden hochgeladen werden können, sondern kann ein Problem sein, wenn es um größere Dateien geht, deren Upload Minuten dauern kann. Es gibt eine Vielzahl von Steuerelementen zum Hochladen von Dateien von Drittanbietern, die sich besser für die Verarbeitung großer Uploads eignen, und viele dieser Anbieter bieten Statusindikatoren und ActiveX-Upload-Manager, die eine viel ausgefeiltere Benutzererfahrung darstellen.
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, bringt eine Reihe von Herausforderungen mit sich. In diesem Tutorial haben wir die ersten beiden untersucht: Die Entscheidung, wo die Binärdaten gespeichert werden sollen, und es einem Benutzer zu ermöglichen, binäre Inhalte über eine Webseite hochzuladen. In den nächsten drei Tutorials erfahren Sie, wie Sie die hochgeladenen Daten einem Datensatz in der Datenbank zuordnen und wie Sie die Binärdaten zusammen mit ihren Textdatenfeldern anzeigen.
Viel Spaß beim Programmieren!
Weitere Informationen
Weitere Informationen zu den in diesem Tutorial behandelten Themen finden Sie in den folgenden Ressourcen:
- Verwenden von Datentypen mit umfangreichen Werten
- Schnellstarts des FileUpload-Steuerelements
- Das ASP.NET 2.0 FileUpload-Serversteuerelement
- Die dunkle Seite von Dateiuploads
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 Hours. Er kann unter mitchell@4GuysFromRolla.comoder über seinen Blog erreicht werden, der unter http://ScottOnWriting.NETzu finden ist.
Besonderer Dank an
Diese Tutorialreihe wurde von vielen hilfreichen Prüfern überprüft. Hauptprüfer für dieses Tutorial waren Teresa Murphy und Bernadette Leigh. Möchten Sie meine bevorstehenden MSDN-Artikel lesen? Wenn dies der Fall ist, legen Sie eine Zeile unter abmitchell@4GuysFromRolla.com.
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für