Chargement de fichiers dans ASP.NET 2.0
Bill Evjen
Reuters
Décembre 2005
S’applique à :
Microsoft ASP.NET 2.0
Microsoft Visual Web Developer 2005 Express Edition
Résumé: Découvrez comment utiliser le nouveau contrôle serveur FileUpload dans Microsoft ASP.NET 2.0. (18 pages imprimées)
Contenu
Introduction
Exemple du contrôle serveur FileUpload
Conclusion
Introduction
Depuis l’introduction de Microsoft ASP.NET avec la version 1.0, il existe un moyen intégré de créer des applications web qui avaient la possibilité de charger des fichiers sur le serveur d’hébergement. Cela a été effectué à l’aide du contrôle serveur HTML champ de fichier. J’ai précédemment écrit un article MSDN sur la façon d’utiliser efficacement ce contrôle dans vos applications ASP.NET. Cet article est une réintroduction du processus de chargement de fichiers, mais au lieu d’utiliser le contrôle Champ de fichier, je vais vous montrer comment utiliser efficacement le nouveau contrôle serveur FileUpload qui est offert via ASP.NET 2.0.
Il est important de noter que bien que cet article vous présente le nouveau contrôle serveur FileUpload , il est tout à fait possible d’utiliser le contrôle Champ de fichier dans vos applications aujourd’hui.
Exemple du contrôle serveur FileUpload
Lors de l’utilisation du contrôle Champ de fichier dans ASP.NET 1. x vous avez dû prendre quelques mesures supplémentaires pour mettre tout en ligne et fonctionner. Par exemple, vous deviez ajouter enctype="multipart/form-data » à l’élément de formulaire> de< la page par vous-même. Le nouveau contrôle serveur FileUpload fourni dans ASP.NET 2.0 simplifie le processus de chargement des fichiers sur le serveur d’hébergement.
En fin de compte, vous essayez d’autoriser l’accès pour programmer la balise HTML <input type="file ».> Cette balise est utilisée pour utiliser des données de fichier dans un formulaire HTML. Dans le passé, lors de l’utilisation d’ASP classique (ASP 3.0 ou version antérieure), de nombreux programmeurs travaillaient avec des composants tiers pour charger des fichiers du client vers le serveur. Maintenant, avec .NET et ce nouveau contrôle, le chargement est pris en charge pour vous. La liste 1 vous montre comment utiliser le contrôle FileUpload pour charger des fichiers sur le serveur.
Note L’exemple de code est fourni dans Microsoft Visual Basic et C#.
Liste 1. Chargement de fichiers sur le serveur à l’aide du contrôle FileUpload
Visual Basic
<%@ Page Language="VB" %> <script runat="server"> Protected Sub Button1_Click(ByVal sender As Object, _ ByVal e As System.EventArgs) If FileUpload1.HasFile Then Try FileUpload1.SaveAs("C:\Uploads\" & _ FileUpload1.FileName) Label1.Text = "File name: " & _ FileUpload1.PostedFile.FileName & "<br>" & _ "File Size: " & _ FileUpload1.PostedFile.ContentLength & " kb<br>" & _ "Content type: " & _ FileUpload1.PostedFile.ContentType Catch ex As Exception Label1.Text = "ERROR: " & ex.Message.ToString() End Try Else Label1.Text = "You have not specified a file." End If End Sub </script> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>Upload Files</title> </head> <body> <form id="form1" runat="server"> <div> <asp:FileUpload ID="FileUpload1" runat="server" /><br /> <br /> <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Upload File" /> <br /> <br /> <asp:Label ID="Label1" runat="server"></asp:Label></div> </form> </body> </html>
C#
<%@ Page Language="C#" %> <script runat="server"> protected void Button1_Click(object sender, EventArgs e) { if (FileUpload1.HasFile) try { FileUpload1.SaveAs("C:\\Uploads\\" + FileUpload1.FileName); Label1.Text = "File name: " + FileUpload1.PostedFile.FileName + "<br>" + FileUpload1.PostedFile.ContentLength + " kb<br>" + "Content type: " + FileUpload1.PostedFile.ContentType; } catch (Exception ex) { Label1.Text = "ERROR: " + ex.Message.ToString(); } else { Label1.Text = "You have not specified a file."; } } </script> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>Upload Files</title> </head> <body> <form id="form1" runat="server"> <div> <asp:FileUpload ID="FileUpload1" runat="server" /><br /> <br /> <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Upload File" /> <br /> <br /> <asp:Label ID="Label1" runat="server"></asp:Label></div> </form> </body> </html>
En exécutant cette page, vous remarquerez quelques éléments si vous examinez le code source généré pour la page. Ce code source est présenté dans la liste 2.
Liste 2. Code source généré à partir du contrôle FileUpload
<html xmlns="http://www.w3.org/1999/xhtml" > <head><title> Upload Files </title></head> <body> <form name="form1" method="post" action="MyFileUpload.aspx" id="form1" enctype="multipart/form-data"> <div> <input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUJNDcxNTg5NDg3D2QWAgIEDxYCHgdlbmN0eXBlBRNtdWx0aXBhcnQvZm9yb S1kYXRhZGQUQEUFMY1+/fp1mnrkbqmVNQIzFA==" /> </div> <div> <input type="file" name="FileUpload1" id="FileUpload1" /><br /> <br /> <input type="submit" name="Button1" value="Upload File" id="Button1" /> <br /> <br /> <span id="Label1"></span> </div> <div> <input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="/wEWAgLB+7jIAwKM54rGBv2Iz6LxVY7jWec0gZMxnuaK2ufq" /> </div></form> </body> </html>
La première chose à noter est que, étant donné que le contrôle FileUpload se trouve sur la page, ASP.NET 2.0 a modifié l’élément form> de< la page en votre nom en ajoutant l’attribut enctype approprié. Vous remarquerez également que le contrôle FileUpload a été converti en élément HTML <input type="file ».>
Lorsque la page de la liste 1 est exécutée, vous pouvez sélectionner un fichier et le charger sur le serveur en cliquant sur le bouton Charger un fichier sur la page. Il existe quelques éléments importants que nous devrions examiner pour cet exemple afin que vous compreniez tous les éléments nécessaires pour que ce travail fonctionne. Pour que l’exemple de la liste 1 fonctionne, vous devez rendre le dossier de destination sur le serveur accessible en écriture pour le compte utilisé par ASP.NET afin que le fichier puisse être enregistré dans le dossier spécifié.
Si vous pensez que votre compte ASP.NET n’est pas autorisé à écrire dans le dossier souhaité, ouvrez simplement Microsoft Windows Explorer et accédez au dossier auquel vous souhaitez ajouter cette autorisation. Cliquez avec le bouton droit sur le dossier (dans ce cas, le dossier Uploads), puis sélectionnez Propriétés. Dans la boîte de dialogue Propriétés , cliquez sur l’onglet Sécurité et assurez-vous que le compte d’ordinateur ASP.NET est inclus dans la liste et dispose des autorisations appropriées pour écrire sur le disque (voir figure 1).
Figure 1. Affichage de l’onglet Sécurité du dossier Chargements
Si vous ne voyez pas le compte d’ordinateur ASP.NET sous l’onglet Sécurité, vous pouvez l’ajouter en cliquant sur le bouton Ajouter et en entrant ASPNET (sans le point) dans la zone de texte, comme illustré dans la figure 2.
Figure 2 : Ajout du compte d’ordinateur ASP.NET à la définition de sécurité du dossier
Cliquez sur OK pour ajouter le compte d’ordinateur ASP.NET à la liste. À partir de là, assurez-vous que vous accordez les autorisations appropriées à ce compte, puis cliquez sur OK, et vous êtes prêt à partir.
Le bouton Envoyer sur la page provoque l’événement Button1_Click se produit. Cet événement charge le fichier, puis affiche un message vous indiquant si le chargement a réussi en publiant des informations sur le fichier chargé. En cas d’échec, la page affiche un message d’erreur décrivant la raison de l’échec du chargement.
En utilisant le contrôle FileUpload qui se convertit lui-même en balise <input type="file »> , le navigateur place automatiquement un bouton Parcourir en regard du champ de texte sur la page ASP.NET. Vous n’avez pas besoin de programmer autre chose pour que cela se produise. Lorsque l’utilisateur final clique sur le bouton Parcourir, il peut parcourir le système de fichiers local pour trouver le fichier à charger sur le serveur. Cela est illustré dans la figure 3. Cliquez sur Ouvrir pour placer ce nom de fichier et le chemin d’accès du fichier dans le champ de texte.
Figure 3. Choix d’un fichier
Contourner les limitations de taille de fichier
Vous ne le réalisez peut-être pas, mais il existe une limite à la taille d’un fichier qui peut être chargé à l’aide de cette technique. Par défaut, la taille maximale d’un fichier à charger sur le serveur à l’aide du contrôle FileUpload est d’environ 4 Mo. Vous ne pouvez pas charger quoi que ce soit qui dépasse cette limite.
L’une des grandes choses de .NET, cependant, est qu’il fournit généralement un moyen de contourner les limitations. Vous pouvez généralement modifier les paramètres par défaut qui sont en place. Pour modifier cette limite de taille, vous apportez des modifications dans le web.config.comments (qui se trouve dans le dossier de configuration ASP.NET 2.0 à l’adresse C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\CONFIG) ou dans le fichier web.config de votre application.
Dans le fichier web.config.comments, recherchez un nœud appelé <httpRuntime> qui ressemble à ce qui suit :
<httpRuntime executionTimeout="110" maxRequestLength="4096" requestLengthDiskThreshold="80" useFullyQualifiedRedirectUrl="false" minFreeThreads="8" minLocalRequestFreeThreads="4" appRequestQueueLimit="5000" enableKernelOutputCache="true" enableVersionHeader="true" requireRootedSaveAsPath="true" enable="true" shutdownTimeout="90" delayNotificationTimeout="5" waitChangeNotification="0" maxWaitChangeNotification="0" enableHeaderChecking="true" sendCacheControlHeader="true" apartmentThreading="false" />
Beaucoup se passe dans ce nœud unique, mais le paramètre qui prend en charge la taille des fichiers à charger est l’attribut maxRequestLength . Par défaut, cette valeur est définie sur 4 096 kilo-octets (Ko). Modifiez simplement cette valeur pour augmenter la taille des fichiers que vous pouvez charger sur le serveur. Si vous souhaitez autoriser le chargement de fichiers de 10 mégaoctets (Mo) sur le serveur, définissez la valeur maxRequestLength sur 11264, ce qui signifie que l’application autorise le chargement des fichiers jusqu’à 11 000 Ko sur le serveur.
Cette modification dans le fichier web.config.comments applique ce paramètre à toutes les applications qui se trouvent sur le serveur. Si vous souhaitez l’appliquer uniquement à l’application avec laquelle vous travaillez, appliquez ce nœud au fichier web.config de votre application, en remplaçant tout paramètre qui se trouve dans le fichier web.config.comments. Vérifiez que ce nœud réside entre les <nœuds system.web> dans le fichier de configuration.
Un autre paramètre impliqué dans la limitation de taille des fichiers à charger est la valeur donnée à l’attribut executionTimeout dans le <nœud httpRuntime> .
La valeur donnée à l’attribut executionTimeout est le nombre de secondes pendant lesquelles le chargement est autorisé à se produire avant d’être arrêté par ASP.NET. Si vous envisagez d’autoriser le chargement de fichiers volumineux sur le serveur, vous devez également augmenter cette valeur, ainsi que la valeur maxRequestLength .
Un inconvénient avec l’augmentation de la taille d’un fichier qui peut être chargé est qu’il ya des pirates informatiques là-bas qui attaquent les serveurs en leur lançant un grand nombre de demandes. Pour vous en prémunir, vous pouvez réduire la taille des fichiers autorisés à être chargés . sinon, vous pouvez rencontrer des centaines, voire des milliers de demandes de 10 Mo, sur votre serveur.
Client-Side validation des types de fichiers autorisés à charger
Vous pouvez utiliser plusieurs méthodes pour contrôler les types de fichiers chargés sur le serveur. Malheureusement, il n’existe aucune méthode à puces pour vous protéger contre le chargement de fichiers qui seraient considérés comme malveillants. Toutefois, vous pouvez prendre quelques mesures pour rendre ce processus permettant aux utilisateurs finaux de charger des fichiers un peu plus facile à gérer.
Une méthode intéressante que vous pouvez utiliser consiste à utiliser les contrôles de validation ASP.NET fournis gratuitement avec ASP.NET. Ces contrôles vous permettent d’effectuer une case activée d’expression régulière sur le fichier en cours de chargement pour voir si l’extension du fichier est celle que vous autorisez à charger.
Cela est idéal pour les navigateurs qui autorisent l’utilisation côté client des contrôles de validation, car cela force la vérification à être effectuée sur le client ; le fichier n’est pas chargé sur le serveur si la signature n’est pas celle que vous autorisez. La liste 3 vous montre un exemple d’utilisation de contrôles de validation pour accomplir cette tâche.
Note L’utilisation des contrôles de validation n’est pas expliquée ici. Consultez Validation des contrôles ASP.NET serveur pour obtenir une explication complète des contrôles de validation et comment les utiliser dans vos pages de ASP.NET.
Listing 3. Utilisation de contrôles de validation pour restreindre les types de fichiers chargés sur le serveur
<asp:FileUpload ID="FileUpload1" runat="server" /><br /> <br /> <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Upload File" /> <br /> <br /> <asp:Label ID="Label1" runat="server"></asp:Label> <asp:RegularExpressionValidator id="RegularExpressionValidator1" runat="server" ErrorMessage="Only mp3, m3u or mpeg files are allowed!" ValidationExpression="^(([a-zA-Z]:)|(\\{2}\w+)\$?)(\\(\w[\w].*)) +(.mp3|.MP3|.mpeg|.MPEG|.m3u|.M3U)$" ControlToValidate="FileUpload1"></asp:RegularExpressionValidator> <br /> <asp:RequiredFieldValidator id="RequiredFieldValidator1" runat="server" ErrorMessage="This is a required field!" ControlToValidate="FileUpload1"></asp:RequiredFieldValidator>
Cette page de ASP.NET simple utilise des contrôles de validation afin que l’utilisateur final puisse uniquement charger des fichiers .mp3, .mpeg ou .m3u sur le serveur. Si le type de fichier n’est pas l’un de ces trois choix, un contrôle Validation lève une exception à l’écran. Cela est illustré dans la figure 4.
Figure 4. Validation du type de fichier à l’aide de contrôles de validation
L’utilisation de contrôles de validation n’est pas un moyen infaillible de contrôler les fichiers chargés sur le serveur. Il ne serait pas trop difficile pour quelqu’un de modifier l’extension de fichier d’un fichier afin qu’il soit accepté et chargé sur le serveur, contournant ainsi ce modèle de sécurité simple.
Ajout de Server-Side validation de type de fichier
Vous venez de voir un moyen simple d’ajouter des contrôles serveur de validation ASP.NET à votre page de ASP.NET pour effectuer une validation côté client de l’extension de fichier (de manière textuelle). Voyons maintenant comment effectuer une opération similaire côté serveur. Ceci est présenté dans la liste 4.
Liste 4. Vérification du type de fichier sur le serveur
Visual Basic
Protected Sub Button1_Click(ByVal sender As Object, _ ByVal e As System.EventArgs) If FileUpload1.HasFile Then Dim fileExt As String fileExt = System.IO.Path.GetExtension(FileUpload1.FileName) If (fileExt = ".mp3") Then Try FileUpload1.SaveAs("C:\Uploads\" & _ FileUpload1.FileName) Label1.Text = "File name: " & _ FileUpload1.PostedFile.FileName & "<br>" & _ "File Size: " & _ FileUpload1.PostedFile.ContentLength & " kb<br>" & _ "Content type: " & _ FileUpload1.PostedFile.ContentType Catch ex As Exception Label1.Text = "ERROR: " & ex.Message.ToString() End Try Else Label1.Text = "Only .mp3 files allowed!" End If Else Label1.Text = "You have not specified a file." End If End Sub
C#
protected void Button1_Click(object sender, EventArgs e) { if (FileUpload1.HasFile) { string fileExt = System.IO.Path.GetExtension(FileUpload1.FileName); if (fileExt == ".mp3") { try { FileUpload1.SaveAs("C:\\Uploads\\" + FileUpload1.FileName); Label1.Text = "File name: " + FileUpload1.PostedFile.FileName + "<br>" + FileUpload1.PostedFile.ContentLength + " kb<br>" + "Content type: " + FileUpload1.PostedFile.ContentType; } catch (Exception ex) { Label1.Text = "ERROR: " + ex.Message.ToString(); } } else { Label1.Text = "Only .mp3 files allowed!"; } } else { Label1.Text = "You have not specified a file."; } }
À présent, en utilisant la méthode GetExtension de l’espace de noms System.IO.Path , vous pouvez effectuer essentiellement la même opération. Il est important de noter que cela ne permet pas à un utilisateur final de changer simplement l’extension de fichier en quelque chose qui fonctionne et de charger ce fichier modifié sur le serveur d’hébergement.
Chargement de plusieurs fichiers en même temps
Jusqu’à présent, vous avez vu de bons exemples de chargement d’un fichier sur le serveur sans trop de tracas. Voyons maintenant comment charger plusieurs fichiers sur le serveur à partir d’une seule page.
Aucune fonctionnalité intégrée dans Microsoft .NET Framework ne vous permet de charger plusieurs fichiers à partir d’une seule page ASP.NET. Toutefois, avec un peu de travail, vous pouvez facilement accomplir cette tâche comme vous l’avez fait par le passé à l’aide de .NET 1. x.
L’astuce consiste à importer la classe System.IO dans votre page ASP.NET, puis à utiliser la classe HttpFileCollection pour capturer tous les fichiers envoyés avec l’objet Request . Cette approche vous permet de charger autant de fichiers que vous le souhaitez à partir d’une seule page.
Si vous le souhaitez, vous pouvez simplement gérer chaque contrôle FileUpload sur la page individuellement, comme indiqué dans la liste 5.
Liste 5. Gestion individuelle de chaque contrôle FileUpload
Visual Basic
If FileUpload1.HasFile Then ' Handle file End If If FileUpload2.HasFile Then ' Handle file End If
C#
if (FileUpload1.HasFile) { // Handle file } if (FileUpload2.HasFile) { // Handle file }
Cette approche fonctionne, mais il peut arriver que vous souhaitiez gérer les fichiers à l’aide de la classe HttpFileCollection à la place, en particulier si vous utilisez une liste de contrôles serveur générée dynamiquement.
Pour obtenir un exemple de ceci, vous pouvez créer une page ASP.NET qui comporte trois contrôles FileUpload et un bouton Envoyer (à l’aide du contrôle Bouton). Une fois que l’utilisateur clique sur le bouton Envoyer et que les fichiers sont publiés sur le serveur, le code derrière prend les fichiers et les enregistre dans un emplacement spécifique sur le serveur. Une fois les fichiers enregistrés, les informations de fichier qui ont été publiées s’affichent dans la page ASP.NET (voir Référencement 6).
Listing 6. Chargement de plusieurs fichiers sur le serveur
Visual Basic
Protected Sub Button1_Click(ByVal sender As Object, _ ByVal e As System.EventArgs) Dim filepath As String = "C:\Uploads" Dim uploadedFiles As HttpFileCollection = Request.Files Dim i As Integer = 0 Do Until i = uploadedFiles.Count Dim userPostedFile As HttpPostedFile = uploadedFiles(i) Try If (userPostedFile.ContentLength > 0) Then Label1.Text += "<u>File #" & (i + 1) & "</u><br>" Label1.Text += "File Content Type: " & _ userPostedFile.ContentType & "<br>" Label1.Text += "File Size: " & _ userPostedFile.ContentLength & "kb<br>" Label1.Text += "File Name: " & _ userPostedFile.FileName & "<br>" userPostedFile.SaveAs(filepath & "\" & _ System.IO.Path.GetFileName(userPostedFile.FileName)) Label1.Text += "Location where saved: " & _ filepath & "\" & _ System.IO.Path.GetFileName(userPostedFile.FileName) & _ "<p>" End If Catch ex As Exception Label1.Text += "Error:<br>" & ex.Message End Try i += 1 Loop End Sub
C#
protected void Button1_Click(object sender, EventArgs e) { string filepath = "C:\\Uploads"; HttpFileCollection uploadedFiles = Request.Files; for (int i = 0; i < uploadedFiles.Count; i++) { HttpPostedFile userPostedFile = uploadedFiles[i]; try { if (userPostedFile.ContentLength > 0 ) { Label1.Text += "<u>File #" + (i+1) + "</u><br>"; Label1.Text += "File Content Type: " + userPostedFile.ContentType + "<br>"; Label1.Text += "File Size: " + userPostedFile.ContentLength + "kb<br>"; Label1.Text += "File Name: " + userPostedFile.FileName + "<br>"; userPostedFile.SaveAs(filepath + "\\" + System.IO.Path.GetFileName(userPostedFile.FileName)); Label1.Text += "Location where saved: " + filepath + "\\" + System.IO.Path.GetFileName(userPostedFile.FileName) + "<p>"; } } catch (Exception Ex) { Label1.Text += "Error: <br>" + Ex.Message; } } }
L’utilisateur final peut sélectionner jusqu’à quatre fichiers et cliquer sur le bouton Charger des fichiers, qui initialise l’événement Button1_Click . L’utilisation de la classe HttpFileCollection avec la propriété Request.Files vous permet de contrôler tous les fichiers chargés à partir de la page. Lorsque les fichiers sont dans cet état, vous pouvez faire ce que vous voulez avec eux. Dans ce cas, les propriétés des fichiers sont examinées et écrites à l’écran. À la fin, les fichiers sont enregistrés dans le dossier Uploads dans le répertoire racine du serveur. Le résultat de cette action est illustré dans la figure 5.
Figure 5. Chargement de quatre fichiers à la fois sur le serveur à partir d’une seule page ASP.NET
Comme vous l’avez peut-être remarqué, l’un des points intéressants de cet exemple est que les états des zones de texte d’entrée de fichier ne sont pas enregistrés avec la publication. Vous pouvez le voir dans la figure 5. Dans ASP.NET, l’état des zones de texte d’entrée de fichier ne peut pas être enregistré, car cela peut poser un risque pour la sécurité.
Conclusion
Le contrôle serveur FileUpload fourni par ASP.NET est un contrôle puissant qui était assez difficile à réaliser à l’époque d’Active Server Pages 3.0. Cette nouvelle fonctionnalité permet à vos utilisateurs finaux de charger un ou plusieurs fichiers sur votre serveur. N’oubliez pas que vous pouvez contrôler la taille des fichiers chargés en utilisant les paramètres du fichier web.config.comments ou web.config fichier.
À propos de l’auteur
Bill Evjen est un partisan actif des technologies .NET et des initiatives d’apprentissage communautaire pour .NET. Il est directeur technique pour Reuters, la société internationale de nouvelles et de services financiers basée à St. Louis, Missouri. Bill est le fondateur et le directeur exécutif de l’International .NET Association (INETA), qui représente plus de 100 000 membres dans le monde entier. Bill est également auteur et conférencier et a écrit des livres tels que ASP.NET Professional Secrets, XML Web Services for ASP.NET, Web Services Enhancements, et visual Basic .NET Bible (tous de Wiley).