Sie sind zurzeit offline. Es wird auf die erneute Herstellung einer Internetverbindung gewartet.

Uploaden einer Datei auf einen Webserver in ASP.NET mithilfe von Visual C# .NET

Dieser Artikel ist eine Übersetzung des folgenden englischsprachigen Artikels der Microsoft Knowledge Base:
323246 How to upload a file to a Web server in ASP.NET by using Visual C# .NET
Zusammenfassung
Der vorliegende Artikel beschreibt Schritt für Schritt das Uploaden einer Datei auf einen Webserver mithilfe von Visual C# .NET. Es wird erläutert, wie Sie eine Microsoft ASP.NET-Datei (WebForm1.aspx) und die zugehörige Codebehind-Datei (WebForm1.aspx.c) erstellen, um Dateien in ein Verzeichnis mit dem Namen "Data" uploaden zu können.


Erstellen der ASP.NET-Anwendung

Gehen Sie in Microsoft Visual Studio .NET wie folgt vor, um eine neue Anwendung zum Uploaden von Dateien auf den Webserver zu erstellen:
  1. Starten Sie Microsoft Visual Studio .NET.
  2. Zeigen Sie im Menü Datei auf Neu, und klicken Sie dann auf Projekt.
  3. Klicken Sie im Dialogfeld Neues Projekt unter Projekttypen auf Visual C#-Projekte, und klicken Sie dann unter Vorlagen auf ASP.NET-Webanwendung.
  4. In das Feld Speicherort geben Sie den URL zur Erstellung des Projekts ein. Für die Zwecke dieses Beispiels geben Sie http://localhost/CSharpUpload ein. Dadurch wird der Standardprojektname "CSharpUpload" erstellt. Die Datei "WebForm1.aspx" wird in der Entwurfsansicht von Visual Studio .NET geladen.

Verzeichnis "Data" erstellen

Nachdem Sie die Anwendung erstellt haben, erstellen Sie das Verzeichnis "Data", in dem die Upload-Dateien gespeichert werden. Nachdem Sie dieses Verzeichnis erstellt haben, müssen Sie Schreibberechtigungen für das ASPNET-Arbeitskonto festlegen.
  1. Klicken Sie im Projektmappen-Explorer von Visual Studio .NET mit der rechten Maustaste auf CSharpUpload, zeigen Sie auf Hinzufügen, und klicken Sie dann auf Neuer Ordner. Standardmäßig wird jetzt ein neuer Ordner mit dem Namen "NewFolder1" erstellt.
  2. Klicken Sie mit der rechten Maustaste auf NewFolder1, klicken Sie auf Umbenennen, und geben Sie dann Data ein, um den Ordnernamen zu "Data" zu ändern.
  3. Starten Sie Windows Explorer, und gehen Sie dann zu dem Dateisystemordner "Data", den Sie in Schritt 2 erstellt haben. Standardmäßig befindet sich dieser Ordner am folgenden Speicherort:
    C:\Inetpub\wwwroot\CSharpUpload\Data
  4. Um die Sicherheitseinstellungen zu ändern und Schreibberechtigungen für den Ordner "Data" festzulegen, klicken Sie mit der rechten Maustaste auf Data, und klicken Sie danach auf Eigenschaften.
  5. Klicken Sie im Dialogfeld Eigenschaften von Data auf die Registerkarte Sicherheit, und klicken Sie anschließend auf Hinzufügen.
  6. Klicken Sie im Dialogfeld Benutzer oder Gruppen auswählen auf das Konto ASPNET, und klicken Sie anschließend auf Hinzufügen. Klicken Sie auf OK, um das Dialogfeld Benutzer oder Gruppen auswählen zu schließen.
  7. Klicken Sie auf das Konto aspnet_wp account (Computername\ASPNET), und aktivieren Sie dann die Kontrollkästchen Zulassen für die folgenden Berechtigungen:

    • Lesen und Ausführen
    • Ordnerinhalt auflisten
    • Lesen
    • Schreiben

    Deaktivieren Sie alle anderen Kontrollkästchen mit der Beschriftung Zulassen und Verweigern.
  8. Klicken Sie auf OK, um das Dialogfeld Eigenschaften von Data zu schließen. Sie haben die Berechtigungen für das Verzeichnis "Data" jetzt so geändert, dass vom Benutzer geuploadete Dateien zulässig sind.

Ändern der Seite "WebForm1.aspx"

Gehen Sie folgendermaßen vor, um den HTML-Code für die Datei "WebForm1.aspx" so zu modifizieren, dass ein Upload von Dateien durch Benutzer zulässig ist:
  1. Wechseln Sie wieder zu der offenen Instanz von Visual Studio .NET. "WebForm1.aspx" müsste im Designer-Fenster geöffnet sein.
  2. Um den HTML-Code für die Seite "WebForm1.aspx" einzusehen, klicken Sie im Designer-Fenster mit der rechten Maustaste auf WebForm1.aspx, und klicken Sie dann auf HTML-Code anzeigen.
  3. Suchen Sie den folgenden HTML-Code, der den Tag <form> enthält:
    <form id="Form1" method="post" runat="server">					
  4. Fügen Sie dem Tag <form> wie folgt das Namenswertattribut enctype="multipart/form-data" hinzu:
    <form id="Form1" method="post" enctype="multipart/form-data" runat="server">					
  5. Fügen Sie den folgenden Code nach dem öffnenden Tag <form> ein:
    <INPUT type=file id=File1 name=File1 runat="server" /><br><input type="submit" id="Submit1" value="Upload" runat="server" />					
  6. Vergewissern Sie sich, dass der HTML-Tag <form> jetzt wie folgt aussieht:
    <form id="Form1" method="post" enctype="multipart/form-data" runat="server"><INPUT type=file id=File1 name=File1 runat="server" /><br><input type="submit" id="Submit1" value="Upload" runat="server" /></form>					

Uploadcode der Codebehind-Datei "WebForm1.aspx.cs" hinzufügen

Gehen Sie folgendermaßen vor, um die Codebehind-Datei "WebForm1.aspx.cs" so zu modifizieren, dass sie Upload-Daten zulässt:
  1. Klicken Sie im Menü Ansicht auf Entwurf.
  2. Doppelklicken Sie auf Uploaden. Visual Studio öffnet die Codebehind-Datei "WebForm1.aspx.cs" und generiert automatisch den folgenden Methodencode:
    private void Submit1_ServerClick(object sender, System.EventArgs e){}
  3. Vergewissern Sie sich, dass der folgende Code auf der Klassenebene der Datei "WebForm1.cs" vorhanden ist:
    protected System.Web.UI.HtmlControls.HtmlInputFile File1;protected System.Web.UI.HtmlControls.HtmlInputButton Submit1;						
    Ist dieser Code in der Datei nicht vorhanden, fügen Sie ihn nach der folgenden Zeile ein:
    public class WebForm1 : System.Web.UI.Page{					
  4. Suchen Sie folgenden Code:
    private void Submit1_ServerClick(object sender, System.EventArgs e){					
  5. Drücken Sie die [EINGABETASTE], um eine leere Zeile einzufügen, und fügen Sie dann den folgenden Code hinzu.
    if( ( File1.PostedFile != null ) && ( File1.PostedFile.ContentLength > 0 ) ){	string fn = System.IO.Path.GetFileName(File1.PostedFile.FileName);	string SaveLocation = Server.MapPath("Data") + "\\" +  fn;	try	{		File1.PostedFile.SaveAs(SaveLocation);		Response.Write("The file has been uploaded.");	}	catch ( Exception ex )	{		Response.Write("Error: " + ex.Message);		//Note: Exception.Message returns a detailed message that describes the current exception. 		//For security reasons, we do not recommend that you return Exception.Message to end users in 		//production environments. It would be better to put a generic error message. 	}}else{	Response.Write("Please select a file to upload.");}
    Dieser Code überprüft, ob eine Datei geuploadet wurde. Wurde keine Datei ausgewählt, wird Ihnen die Meldung "Bitte wählen Sie eine Upload-Datei aus" (Please select a file to upload) angezeigt. Wird eine gültige Datei geuploadet, wird deren Name mithilfe des Namespace System.IO extrahiert und deren Zielspeicherort in einem SaveAs-Pfad definiert. Nachdem der endgültige Zielspeicherort bekannt ist, wird die Datei mithilfe der Methode File1.PostedFile.SaveAs gespeichert. Etwaige Ausnahmen werden aufgefangen, und die entsprechenden Meldungen zu Ausnahmefehlern werden am Bildschirm angezeigt.
  6. Vergewissern Sie sich, dass die Unterroutine Submit1 das folgende Erscheinungsbild aufweist:
    private void Submit1_ServerClick(object sender, System.EventArgs e){	if( ( File1.PostedFile != null ) && ( File1.PostedFile.ContentLength > 0 ) )	{		string fn = System.IO.Path.GetFileName(File1.PostedFile.FileName);		string SaveLocation = Server.MapPath("Data") + "\\" +  fn;		try		{			File1.PostedFile.SaveAs(SaveLocation);			Response.Write("The file has been uploaded.");		}		catch ( Exception ex )		{			Response.Write("Error: " + ex.Message);			//Note: Exception.Message returns detailed message that describes the current exception. 			//For security reasons, we do not recommend you return Exception.Message to end users in 			//production environments. It would be better just to put a generic error message. 		}	}	else	{		Response.Write("Please select a file to upload.");	}}

Testen der Anwendung

Gehen Sie folgendermaßen vor, um Ihre Visual Studio .NET-Lösung zu erstellen und die Anwendung zu testen:
  1. Klicken Sie im Menü Erstellen auf Projektmappe erstellen.
  2. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf WebForm1.aspx. Klicken Sie dann auf In Browser anzeigen.
  3. Wenn "WebForm1.aspx" im Browser geöffnet wurde, klicken Sie auf Durchsuchen.
  4. Wählen Sie im Dialogfeld Datei auswählen eine Datei aus, die kleiner ist als 4 MB, und klicken Sie anschließend auf Öffnen.
  5. Klicken Sie auf Uploaden, um den Upload der Datei zu starten. Die Datei wird auf den Webserver geuploadet und Ihnen wird die Meldung "Upload der Datei erfolgt" (The file has been uploaded) angezeigt.
  6. Wechseln Sie wieder zu der offenen Instanz von Windows Explorer, und gehen Sie dann zu dem Verzeichnis "Data".
  7. Vergewissern Sie sich, dass der Upload der Datei in das Verzeichnis "Data" erfolgt ist.

Upload größerer Dateien

Standardmäßig erlaubt ASP.NET nur das Uploaden von Dateien mit weniger als 4.096 Kilobyte (KB) (oder 4 MB) auf den Webserver. Sie müssen den Parameter maxRequestLength des Abschnitts <httpRuntime> in der Datei "Web.config" ändern, um das Uploaden größerer Dateien zu ermöglichen.

Hinweis: Wenn das Attribut maxRequestLength in der Datei "Machine.config" festgelegt ist und dann eine Anforderung übermittelt wird, zum Beispiel für das Uploaden einer Datei, die größer ist als der für maxRequestLength festgelegte Wert, kann keine benutzerdefinierte Fehlerseite angezeigt werden. Stattdessen wird in Microsoft Internet Explorer die Fehlermeldung "Server oder DNS kann nicht gefunden werden" angezeigt.

Falls Sie diese Einstellung für den gesamten Computer und nicht nur für die ASP.NET-Anwendung ändern möchten, müssen Sie die Datei "Machine.config" modifizieren.

Standardmäßig sind für das Element <httpRuntime> in der Datei "Machine.config" die folgenden Parameter festgelegt:
<httpRuntime executionTimeout="90" maxRequestLength="4096"useFullyQualifiedRedirectUrl="false" minFreeThreads="8" minLocalRequestFreeThreads="4"appRequestQueueLimit="100"/>				
Die Datei "Machine.config" ist im Verzeichnis "\Systemstamm\Microsoft.NET\Framework\Versionsnummer\CONFIG" gespeichert.


Vollständiges Codelisting

WebForm1.aspx

<%@ Page language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false" Inherits="CSharpUpload.WebForm1" %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" ><HTML>  <HEAD>    <title>WebForm1</title>    <meta name="GENERATOR" Content="Microsoft Visual Studio 7.0">    <meta name="CODE_LANGUAGE" Content="C#">    <meta name=vs_defaultClientScript content="JavaScript">    <meta name=vs_targetSchema content="http://schemas.microsoft.com/intellisense/ie5">  </HEAD>  <body MS_POSITIONING="GridLayout"><form id="Form1" method="post" enctype="multipart/form-data" runat="server"><INPUT type=file id=File1 name=File1 runat="server" ><br><input type="submit" id="Submit1" value="Upload" runat="server" NAME="Submit1"></form>	  </body></HTML>				

WebForm1.aspx.cs

using System;using System.Collections;using System.ComponentModel;using System.Data;using System.Drawing;using System.Web;using System.Web.SessionState;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.HtmlControls;namespace CSharpUpload{	/// <summary>	/// Summary description for WebForm1.	/// </summary>	public class WebForm1 : System.Web.UI.Page	{		protected System.Web.UI.HtmlControls.HtmlInputFile File1;		protected System.Web.UI.HtmlControls.HtmlInputButton Submit1;			private void Page_Load(object sender, System.EventArgs e)		{			// Put user code to initialize the page here		}		#region Web Form Designer generated code		override protected void OnInit(EventArgs e)		{			// 			// CODEGEN: This call is required by the ASP.NET Web Form Designer.			// 			InitializeComponent();			base.OnInit(e);		}				/// <summary>		/// Required method for Designer support - do not modify		/// the contents of this method with the code editor.		/// </summary>		private void InitializeComponent()		{    			this.Submit1.ServerClick += new System.EventHandler(this.Submit1_ServerClick);			this.Load += new System.EventHandler(this.Page_Load);		}		#endregion		private void Submit1_ServerClick(object sender, System.EventArgs e)		{			if( ( File1.PostedFile != null ) && ( File1.PostedFile.ContentLength > 0 ) )			{				string fn = System.IO.Path.GetFileName(File1.PostedFile.FileName);				string SaveLocation = Server.MapPath("Data") + "\\" +  fn;				try				{					File1.PostedFile.SaveAs(SaveLocation);					Response.Write("The file has been uploaded.");				}				catch ( Exception ex )				{					Response.Write("Error: " + ex.Message);					//Note: Exception.Message returns a detailed message that describes the current exception. 					//For security reasons, we do not recommend that you return Exception.Message to end users in 					//production environments. It would be better to return a generic error message. 				}			}			else			{				Response.Write("Please select a file to upload.");			}		}	}}	
Weitere Informationen
Theoretisch ist der Maximalwert für die Größe einer Upload-Datei relativ hoch. Wegen der ASP.NET-Systemüberwachung ist das Uploaden sehr umfangreicher Dateien in ASP.NET jedoch nicht möglich. Der ASP.NET-Workerprozess hat einen virtuellen Adressraum von 2 Gigabyte (GB). Der ASP.NET-Workerprozess verwendet jedoch aufgrund der Systemüberwachung und der Speicherfragmentierung nur etwas mehr als 1 GB.

Während des Upload-Vorgangs lädt ASP.NET die gesamte Datei in den Arbeitsspeicher, bevor der Benutzer die Datei auf der Festplatte speichern kann. Der Prozess wird wegen des Attributs memoryLimit für den Tag processModel in der Datei "Machine.config" möglicherweise wiederverwendet. Das Attribut memoryLimit legt fest, wieviel Prozent des physischen Speichers der ASP.NET-Workerprozess verbrauchen kann, bevor der Prozess automatisch wiederverwendet wird. Die Wiederverwendung verhindert, dass ASP.NET abstürzt oder nicht mehr reagiert, weil nicht der gesamte reservierte Speicher freigegeben wird.

Auch andere Faktoren haben Einfluss auf die maximale Größe einer Upload-Datei. Zu diesen Faktoren zählen der verfügbare Arbeitsspeicher, der verfügbare Festplattenspeicher und der aktuelle Netzwerkverkehr. Werden regelmäßig Dateien geuploadet, empfiehlt Microsoft eine maximale Dateigröße von 10 bis 20 Megabyte (MB). Werden nur selten Dateien geuploadet, kann auch eine maximale Dateigröße von 100 MB festgelegt werden.

Hinweis: In ASP.NET ist auch ein Uploaden von Dateien möglich, die größer sind als 100 MB. Microsoft empfiehlt jedoch, die in diesem Artikel genannten Werte für die maximale Größe einer Upload-Datei zu verwenden. Um die mögliche Dateigröße präziser bestimmen zu können, führen Sie Belastungstests auf Computern durch, deren Eigenschaften denen ähneln, die in der Produktionsumgebung eingesetzt werden.

Werden die Grenzen für die maximale Dateigröße bei einem Upload-Vorgang überschritten, können die folgenden Fehlermeldungen angezeigt werden:
  • Die Seite kann nicht angezeigt werden.
  • Die Serveranwendung ist nicht verfügbar.
    Im Ereignisprotokoll würde eine Fehlermeldung wie die folgende protokolliert werden:

    "aspnet_wp.exe (PID:PID-Nummer) wurde erneut verwendet, da die Speicherbelegung Maximalgröße MB (Prozentsatz Prozent des verfügbaren RAM) überschritten hat."

  • Eine Ausnahme vom Typ "System.OutOfMemoryException" wurde ausgelöst.
Außerdem stellen Sie eventuell fest, dass ein Upload sehr viel Zeit in Anspruch nimmt. Wenn Sie den Aspnet_wp.exe-Prozess im Windows Task-Manager beobachten, sehen Sie, dass sich der Speicherwert alle 1 bis 2 Sekunden um 64 KB verändert. In Abhängigkeit von der Größe der Datei kann diese Verzögerung dazu führen, dass der ASP.NET-Workerprozess wegen eines "responseDeadlock"-Fehlers wiederverwendet wird.
Bitte beachten Sie: Bei diesem Artikel handelt es sich um eine Übersetzung aus dem Englischen. Es ist möglich, dass nachträgliche Änderungen bzw. Ergänzungen im englischen Originalartikel in dieser Übersetzung nicht berücksichtigt sind. Die in diesem Artikel enthaltenen Informationen basieren auf der/den englischsprachigen Produktversion(en). Die Richtigkeit dieser Informationen in Zusammenhang mit anderssprachigen Produktversionen wurde im Rahmen dieser Übersetzung nicht getestet. Microsoft stellt diese Informationen ohne Gewähr für Richtigkeit bzw. Funktionalität zur Verfügung und übernimmt auch keine Gewährleistung bezüglich der Vollständigkeit oder Richtigkeit der Übersetzung.
Eigenschaften

Artikelnummer: 323246 – Letzte Überarbeitung: 04/27/2007 02:02:14 – Revision: 5.8

  • Microsoft ASP.NET 1.0
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft ASP.NET 1.1
  • Microsoft Visual C# .NET 2003 Standard Edition
  • kbhowtomaster KB323246
Feedback
tml> s.js'" + "'><\/script>");