Bestanden uploaden naar de webserver met ASP.NET
Door Michiel van Otegem
26 november 2008
Bestanden uploaden naar de webserver is met ASP.NET kinderlijk eenvoudig.
Je gebruikt hiervoor de FileUpload-control die standaard meegeleverd wordt.
Plaats deze control op de pagina en geef deze een duidelijke naam, in Listing 1
heet deze Upload. Verder heb je een knop nodig, zodat een Postback gedaan wordt en het
door de gebruiker geselecteerde bestand naar de server gestuurd wordt. In listing 1 staat
hiervoor een LinkButton met de naam UploadButton. In Listing 1 zie je ook een Repeater-control voor het weergeven van bestanden en het bieden
van een link naar die bestanden.
1: <form id="form1" runat="server">
2: <div>
3: <asp:FileUpload runat="server" ID="Upload" />
4: <asp:LinkButton runat="server" ID="UploadButton" Text="Upload"
5: onclick="UploadButton_Click" />
6: <hr />
7: <asp:Repeater runat="server" ID="FileList">
8: <ItemTemplate>
9: <a href='/files/<%# Container.DataItem %>'
><%# Container.DataItem %></a><br />
10: </ItemTemplate>
11: </asp:Repeater>
12: </div>
13: </form>
Listing 1, File upload pagina
Met de HTML op z'n plaats kunnen we aan de code beginnen. Uploaden doen we naar de /Files map
op de server. Houd er rekening mee dat het account waaronder ASP.NET werkt of de gebruiker
die de website benadert rechten moeten hebben om in de map te kunnen schrijven. Het account
waaronder ASP.NET werkt is in IIS 5.0 het ASPNET account. Vanaf IIS 6.0 is dit het NETWORK SERVICE account.
Wanneer de gebruiker op de UploadButton klikt, moet het bestand op de server opgeslagen worden.
Hiervoor moet je dus code koppelen aan de UploadButton, wat je in Visual Web Developer eenvoudig
doet door in Design-view te dubbelklikken op de knop. In de code-behind regel 1-8 van listing 2 invoegen werkt ook.
Deze code kijkt eerst of er een bestand is door te kijken naar de HasFile-eigenschap van de PostedFile
die gekoppeld is aan de FileUpload-control waar je naar kijkt. Om de bestandsnaam zonder pad
op te vragen, haal je de gehele bestandsnaam door de FileInfo class. Vervolgens kun je het bestand
opslaan. Het volledige pad van de map waarin je wilt opslaan vraag je op met Server.MapPath.
1: protected void UploadButton_Click(object sender, EventArgs e)
2: {
3: if (Upload.HasFile == true)
4: {
5: FileInfo info = new FileInfo(Upload.PostedFile.FileName);
6: Upload.PostedFile.SaveAs(Server.MapPath("/Files/" + info.Name));
7: }
8: }
9:
10: protected void Page_PreRender(object sender, EventArgs e)
11: {
12: string[] files = Directory.GetFiles(Server.MapPath("/Files/"));
13: for (int i = 0; i < files.Length; i++)
14: {
15: files[i] = new FileInfo(files[i]).Name;
16: }
17: FileList.DataSource = files;
18: FileList.DataBind();
19: }
Listing 2, File upload code-behind
Opgeslagen bestanden downloaden
Om de bestanden die in de Files-map staan te downloaden moet je de bestanden in die map opvragen.
Dit doe je met System.File.Directory.GetFiles(). Je krijgt dan een array met de bestandsnamen met
hun volledige pad (dus bijvoorbeeld c:/inetpub/wwwroot/mijnsite/files/bestand.txt). Aangezien
je alleen de naam wilt tonen, moet je eerst weer even de FileInfo class gebruiken om het pad
eruit te filteren. De resulterende lijst kun je aan de Repeater-control koppelen.
Andere opties
Je kunt uiteraard ook de naam van het bestand in een database zetten en op basis daarvan de link
opbouwen. Ook is het mogelijk om het bestand als geheel in de database op te slaan, maar dat is over het
algemeen niet echt handig en valt buiten het bestek van dit artikel.
|