Delen via


Bestanden Uploaden (VB)

door Scott Mitchell

PDF downloaden

Informatie over het uploaden van binaire bestanden (zoals Word- of PDF-documenten) naar uw website waar ze kunnen worden opgeslagen in het bestandssysteem van de server of in de database.

Introductie

Alle tutorials die we tot nu toe hebben onderzocht, hebben uitsluitend met tekstgegevens gewerkt. Veel toepassingen hebben echter gegevensmodellen waarmee zowel tekst als binaire gegevens worden vastgelegd. Een online datingsite kan gebruikers toestaan een afbeelding te uploaden die aan hun profiel kan worden gekoppeld. Met een wervingswebsite kunnen gebruikers hun cv uploaden als een Microsoft Word- of PDF-document.

Het werken met binaire gegevens voegt een nieuwe set uitdagingen toe. We moeten bepalen hoe de binaire gegevens worden opgeslagen in de toepassing. De interface die wordt gebruikt voor het invoegen van nieuwe records, moet worden bijgewerkt, zodat de gebruiker een bestand vanaf zijn computer kan uploaden en er extra stappen moeten worden uitgevoerd om het downloaden van gekoppelde binaire gegevens van een record weer te geven of te bieden. In deze tutorial en de volgende drie verkennen we hoe we deze uitdagingen kunnen aanpakken en overwinnen. Aan het einde van deze zelfstudies hebben we een volledig functionele toepassing gebouwd die een afbeeldings- en PDF-brochure aan elke categorie koppelt. In deze specifieke zelfstudie bekijken we verschillende technieken voor het opslaan van binaire gegevens en verkennen we hoe u gebruikers in staat stelt een bestand vanaf hun computer te uploaden en op te slaan op het bestandssysteem van de webserver.

Opmerking

Binaire gegevens die deel uitmaken van een gegevensmodel van een toepassing worden soms een BLOB genoemd, een acroniem voor Binary Large OBject. In deze handleidingen heb ik ervoor gekozen om de term binaire gegevens te gebruiken, hoewel de term BLOB synoniem is.

Stap 1: Het werken met binaire gegevenswebpagina's maken

Voordat we beginnen met het verkennen van de uitdagingen met betrekking tot het toevoegen van ondersteuning voor binaire gegevens, nemen we eerst een ogenblik de tijd om de ASP.NET pagina's in ons websiteproject te maken die we nodig hebben voor deze zelfstudie en de volgende drie. Begin met het toevoegen van een nieuwe map met de naam BinaryData. Voeg vervolgens de volgende ASP.NET pagina's toe aan die map en zorg ervoor dat u elke pagina koppelt aan de Site.master basispagina:

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

Toevoegen van de ASP.NET pagina's voor de binaire Data-Related-handleidingen

Afbeelding 1: Voeg de ASP.NET Pagina's voor de binaire Data-Related handleidingen toe

Net als in de andere mappen, zal Default.aspx in de map BinaryData de zelfstudies in zijn sectie weergeven. Zoals u weet, biedt het SectionLevelTutorialListing.ascx gebruikersbeheer deze functionaliteit. Voeg daarom deze gebruikerscontrole toe aan Default.aspx door het vanuit de Solution Explorer naar de ontwerpweergave van de pagina te slepen.

Voeg de SectionLevelTutorialListing.ascx User Control toe aan Default.aspx

Afbeelding 2: Het gebruikersbesturingselement toevoegen SectionLevelTutorialListing.ascx aan Default.aspx (klik om de afbeelding op volledige grootte weer te geven)

Voeg tot slot deze pagina's toe als vermeldingen aan het Web.sitemap bestand. Voeg met name de volgende markeringen toe na het verbeteren van de GridView <siteMapNode>:

<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>

Neem na het bijwerken Web.sitemap even de moeite om de tutorialswebsite via een browser te bekijken. Het menu aan de linkerkant bevat nu items voor de zelfstudies Werken met binaire gegevens.

De sitemap bevat nu vermeldingen voor de zelfstudies over binaire gegevens

Afbeelding 3: De sitemap bevat nu vermeldingen voor zelfstudies over het werken met binaire gegevens

Stap 2: bepalen waar de binaire gegevens moeten worden opgeslagen

Binaire gegevens die aan het gegevensmodel van de toepassing zijn gekoppeld, kunnen op een van de twee plaatsen worden opgeslagen: op het bestandssysteem van de webserver met een verwijzing naar het bestand dat in de database is opgeslagen; of rechtstreeks in de database zelf (zie afbeelding 4). Elke aanpak heeft een eigen set voor- en nadelen en verdient een gedetailleerdere discussie.

Binaire gegevens kunnen worden opgeslagen in het bestandssysteem of rechtstreeks in de database

Afbeelding 4: Binaire gegevens kunnen worden opgeslagen in het bestandssysteem of rechtstreeks in de database (klik om de volledige afbeelding weer te geven)

Stel dat we de Northwind-database willen uitbreiden om een afbeelding aan elk product te koppelen. Een optie is om deze afbeeldingsbestanden op te slaan op het bestandssysteem van de webserver en het pad in de Products tabel vast te leggen. Met deze methode voegen we misschien een ImagePath kolom toe aan de tabel van het Products type varchar(200). Wanneer een gebruiker een afbeelding voor Chai heeft geüpload, kan die afbeelding worden opgeslagen in het bestandssysteem van de webserver op ~/Images/Tea.jpg, waarbij ~ het fysieke pad van de toepassing wordt aangegeven. Dat wil gezegd dat als de website is geroot op het fysieke pad C:\Websites\Northwind\, ~/Images/Tea.jpg gelijk is aan C:\Websites\Northwind\Images\Tea.jpg. Na het uploaden van het afbeeldingsbestand werken we de Chai-record in de Products tabel bij zodat ImagePath de kolom verwijst naar het pad van de nieuwe afbeelding. We zouden kunnen gebruiken ~/Images/Tea.jpg of alleen Tea.jpg als we besloten hebben dat alle productafbeeldingen in de map van Images de toepassing zouden worden geplaatst.

De belangrijkste voordelen van het opslaan van de binaire gegevens op het bestandssysteem zijn:

  • Gemak van implementatie, zoals we binnenkort zullen zien, vereist het opslaan en ophalen van binaire gegevens die rechtstreeks in de database zijn opgeslagen iets meer code dan wanneer met gegevens via het bestandssysteem wordt gewerkt. Bovendien moet een gebruiker een URL naar die gegevens krijgen om binaire gegevens weer te geven of te downloaden. Als de gegevens zich in het bestandssysteem van de webserver bevinden, is de URL eenvoudig. Als de gegevens echter worden opgeslagen in de database, moet er een webpagina worden gemaakt die de gegevens uit de database ophaalt en retourneert.
  • Bredere toegang tot de binaire gegevens omdat de binaire gegevens mogelijk toegankelijk moeten zijn voor andere services of toepassingen die de gegevens niet uit de database kunnen halen. De afbeeldingen die aan elk product zijn gekoppeld, moeten bijvoorbeeld ook beschikbaar zijn voor gebruikers via FTP. In dat geval willen we de binaire gegevens opslaan in het bestandssysteem.
  • Prestaties als de binaire gegevens worden opgeslagen in het bestandssysteem, zijn de vraag en netwerkcongestie tussen de databaseserver en webserver kleiner dan als de binaire gegevens rechtstreeks in de database worden opgeslagen.

Het belangrijkste nadeel van het opslaan van binaire gegevens in het bestandssysteem is dat de gegevens uit de database worden losgekoppeld. Als een record uit de Products tabel wordt verwijderd, wordt het bijbehorende bestand op het bestandssysteem van de webserver niet automatisch verwijderd. We moeten extra code schrijven om het bestand te verwijderen of het bestandssysteem wordt rommelig met ongebruikte, zwevende bestanden. Bovendien moeten we bij het maken van een back-up van de database ook back-ups maken van de bijbehorende binaire gegevens in het bestandssysteem. Het verplaatsen van de database naar een andere site of server brengt vergelijkbare uitdagingen met zich mee.

U kunt binaire gegevens ook rechtstreeks opslaan in een Microsoft SQL Server 2005-database door een kolom van het type varbinaryte maken. Net als bij andere gegevenstypen voor variabele lengte kunt u een maximale lengte opgeven van de binaire gegevens die in deze kolom kunnen worden opgeslagen. Als u bijvoorbeeld maximaal 5.000 bytes wilt reserveren varbinary(5000); varbinary(MAX) maakt de maximale opslaggrootte mogelijk, ongeveer 2 GB.

Het belangrijkste voordeel van het rechtstreeks opslaan van binaire gegevens in de database is de nauwe koppeling tussen de binaire gegevens en de databaserecord. Dit vereenvoudigt het beheer van databases aanzienlijk, zoals back-ups of het verplaatsen van de database naar een andere site of server. Als u een record verwijdert, worden ook automatisch de bijbehorende binaire gegevens verwijderd. Er zijn ook subtielere voordelen van het opslaan van de binaire gegevens in de database.

Opmerking

In Microsoft SQL Server 2000 en eerdere versies had het varbinary gegevenstype een maximumlimiet van 8000 bytes. Als u maximaal 2 GB aan binaire gegevens wilt opslaan, moet het image gegevenstype worden gebruikt. Met de toevoeging van MAX SQL Server 2005 is het image gegevenstype echter afgeschaft. Het wordt nog steeds ondersteund voor achterwaartse compatibiliteit, maar Microsoft heeft aangekondigd dat het image gegevenstype wordt verwijderd in een toekomstige versie van SQL Server.

Als u met een ouder gegevensmodel werkt, ziet u mogelijk het image gegevenstype. De tabel Northwind-database Categories bevat een Picture kolom die kan worden gebruikt om de binaire gegevens van een afbeeldingsbestand voor de categorie op te slaan. Aangezien de Northwind-database zijn wortels heeft in Microsoft Access en eerdere versies van SQL Server, is deze kolom van het type image.

Voor deze zelfstudie en de volgende drie gebruiken we beide benaderingen. De Categories tabel bevat al een Picture kolom voor het opslaan van de binaire inhoud van een afbeelding voor de categorie. We voegen een extra kolom BrochurePathtoe om een pad naar een PDF op te slaan op het bestandssysteem van de webserver dat kan worden gebruikt om een professioneel overzicht van de categorie te bieden.

Stap 3: DeBrochurePathkolom toevoegen aan deCategoriestabel

Momenteel heeft de tabel Categorieën slechts vier kolommen: CategoryID, CategoryName, Descriptionen Picture. Naast deze velden moeten we een nieuwe toevoegen die verwijst naar de brochure van de categorie (indien aanwezig). Als u deze kolom wilt toevoegen, gaat u naar Server Explorer, zoomt u in op de tabellen, klikt u met de rechtermuisknop op de Categories tabel en kiest u Tabeldefinitie openen (zie afbeelding 5). Als u Server Explorer niet ziet, opent u deze door de optie ServerVerkenner te selecteren in het menu Beeld of op Ctrl+Alt+S te drukken.

Voeg een nieuwe varchar(200) kolom toe aan de Categories tabel genaamd BrochurePath die NULLs toestaat en klik op het Opslaan-pictogram (of druk op Ctrl+S).

Een BrochurePath-kolom toevoegen aan de tabel Categorieën

Afbeelding 5: Een BrochurePath kolom toevoegen aan de Categories tabel (klik om de afbeelding op volledige grootte weer te geven)

Stap 4: de architectuur bijwerken om dePictureenBrochurePathkolommen te gebruiken

De CategoriesDataTable in de Data Access Layer (DAL) heeft momenteel vier DataColumn s gedefinieerd: CategoryID, CategoryName, Description, en NumberOfProducts. Toen we deze gegevenstabel oorspronkelijk hebben ontworpen in de zelfstudie Een Gegevenstoegangslaag maken, had het alleen de eerste drie kolommen; de CategoriesDataTable kolom is toegevoegd in de andere zelfstudie NumberOfProducts.

Zoals besproken in Het maken van een Gegevenstoegangslaag vormen de DataTables in de getypte gegevensset de zakelijke objecten. De TableAdapters zijn verantwoordelijk voor de communicatie met de database en het vullen van de bedrijfsobjecten met de queryresultaten. De CategoriesDataTable gegevens worden ingevuld door de CategoriesTableAdapter, met drie methoden voor het ophalen van gegevens:

  • GetCategories() voert de hoofdquery van TableAdapter uit en retourneert de CategoryID, CategoryNameen Description velden van alle records in de Categories tabel. De hoofdvraag is welke methoden worden gebruikt door de automatisch gegenereerde Insert en Update.
  • GetCategoryByCategoryID(categoryID) retourneert de velden CategoryID, CategoryName, en Description van de categorie waarvan CategoryID gelijk is aan categoryID.
  • GetCategoriesAndNumberOfProducts() - retourneert de CategoryID, CategoryNameen Description velden voor alle records in de Categories tabel. Gebruikt ook een subquery om het aantal producten te retourneren dat aan elke categorie is gekoppeld.

U ziet dat geen van deze query's de Categories tabel s Picture of BrochurePath kolommen teruggeeft, noch geeft de CategoriesDataTableDataColumn s voor deze velden. Als u met de afbeelding en BrochurePath eigenschappen wilt werken, moeten we ze eerst toevoegen aan de CategoriesDataTable en vervolgens de CategoriesTableAdapter klasse bijwerken om deze kolommen te retourneren.

Het toevoegen van de Pictureen de BrochurePath``DataColumn s

Voeg eerst deze twee kolommen toe aan het CategoriesDataTable. Klik met de rechtermuisknop op de CategoriesDataTable koptekst, selecteer Toevoegen in het contextmenu en kies vervolgens de optie Kolom. Hiermee maakt u een nieuwe DataColumn in de gegevenstabel met de naam Column1. Wijzig de naam van deze kolom in Picture. Stel in het venster Eigenschappen de eigenschap DataColumnDataType in op System.Byte[] (dit is geen optie in de vervolgkeuzelijst; u moet deze zelf invoeren).

Maak een DataColumn-afbeelding met de naam System.Byte[]

Afbeelding 6: Maak een DataColumn genaamd Picture waarvan DataType is System.Byte[] (Klik om de volledige afbeelding weer te geven)

Voeg nog een DataColumn toe aan de gegevenstabel, waarbij u deze een naam BrochurePath geeft met behulp van de standaardwaarde DataType (System.String).

PictureDe enBrochurePathwaarden van de TableAdapter retourneren

Nu deze twee DataColumn aan de CategoriesDataTable zijn toegevoegd, zijn we klaar om de CategoriesTableAdapter bij te werken. We zouden beide kolomwaarden kunnen retourneren in de hoofdquery TableAdapter, maar dit zou de binaire gegevens telkens terugbrengen wanneer de GetCategories() methode werd aangeroepen. In plaats daarvan gaan we de hoofdquery TableAdapter bijwerken om terug BrochurePath te brengen en een extra methode voor het ophalen van gegevens te maken die een bepaalde kolom van Picture een categorie retourneert.

Als u de hoofdquery TableAdapter wilt bijwerken, klikt u met de rechtermuisknop op de CategoriesTableAdapter koptekst en kiest u de optie Configureren in het contextmenu. Hiermee wordt de wizard Tabeladapter-configuratie weergegeven, die we in eerdere tutorials hebben gezien. Werk de query bij om de BrochurePath query terug te brengen en klik op Voltooien.

Werk de kolomlijst in de SELECT-instructie bij om ook BrochurePath te retourneren

Afbeelding 7: Werk de kolomlijst in de SELECT instructie bij zodat deze ook wordt geretourneerd BrochurePath (klik om de afbeelding op volledige grootte weer te geven)

Wanneer u ad-hoc SQL-instructies voor de TableAdapter gebruikt, zorgt het bijwerken van de kolomlijst in de hoofdquery ervoor dat de kolomlijst voor alle querymethoden in de TableAdapter wordt bijgewerkt. Dit betekent dat de GetCategoryByCategoryID(categoryID) methode is bijgewerkt om de BrochurePath kolom te retourneren. Dit kan zijn wat we hebben bedoeld. De kolomlijst in de GetCategoriesAndNumberOfProducts() methode is echter ook bijgewerkt, waardoor de subquery wordt verwijderd waarmee het aantal producten voor elke categorie wordt geretourneerd. Daarom moeten we de query van SELECT deze methode bijwerken. Klik met de rechtermuisknop op de GetCategoriesAndNumberOfProducts() methode, kies Configureren en zet de query terug naar de SELECT oorspronkelijke waarde:

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

Maak vervolgens een nieuwe TableAdapter-methode die de kolomwaarde van Picture een bepaalde categorie retourneert. Klik met de rechtermuisknop op de CategoriesTableAdapter header en kies de optie 'Query toevoegen' om de configuratiewizard voor TableAdapter-query's te openen. De eerste stap van deze wizard vraagt ons of we een query willen uitvoeren op gegevens met behulp van een ad-hoc SQL-instructie, een nieuwe opgeslagen procedure of een bestaande. Selecteer SQL-instructies gebruiken en klik op Volgende. Omdat we een rij retourneren, kiest u in de tweede stap de optie SELECT die rijen retourneert.

Selecteer de optie SQL-instructies gebruiken

Afbeelding 8: Selecteer de optie SQL-instructies gebruiken (klik hier om de volledige afbeelding weer te geven)

Omdat de query een record retourneert uit de tabel Categorieën, kiest u SELECT die rijen retourneert

Afbeelding 9: Omdat de query een record retourneert uit de tabel Categorieën, kiest u SELECT die rijen retourneert (klik om de afbeelding op volledige grootte weer te geven)

Voer in de derde stap de volgende SQL-query in en klik op Volgende:

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

De laatste stap is het kiezen van de naam voor de nieuwe methode. Gebruik FillCategoryWithBinaryDataByCategoryID en GetCategoryWithBinaryDataByCategoryID respectievelijk voor de patronen Vul een Gegevenstabel en Retourneer een Gegevenstabel. Klik op Voltooien om de wizard te voltooien.

Kies de namen voor de TableAdapter-methoden

Afbeelding 10: Kies de namen voor de TableAdapter-methoden (klik hier om de volledige afbeelding weer te geven)

Opmerking

Nadat u de wizard Queryconfiguratie tabeladapter hebt voltooid, ziet u mogelijk een dialoogvenster met de mededeling dat de nieuwe opdrachttekst gegevens retourneert met een ander schema dan het schema van de hoofdquery. Kortom, de wizard geeft aan dat de hoofdquery GetCategories() van TableAdapter een ander schema retourneert dan het schema dat we zojuist hebben gemaakt. Maar dit is wat we willen, dus u kunt dit bericht negeren.

Houd er ook rekening mee dat als u ad-hoc SQL-instructies gebruikt en de wizard gebruikt om de hoofdquery van TableAdapter op een later tijdstip te wijzigen, de kolomlijst van de GetCategoryWithBinaryDataByCategoryID methode-instructie SELECT wordt gewijzigd om alleen die kolommen uit de hoofdquery op te nemen (dat wil zeggen dat de kolom uit de Picture query wordt verwijderd). U moet de kolomlijst handmatig bijwerken om de Picture kolom te retourneren, vergelijkbaar met wat we eerder in deze stap hebben gedaan met de GetCategoriesAndNumberOfProducts() methode.

Nadat u de twee DataColumn s aan de CategoriesDataTable en de GetCategoryWithBinaryDataByCategoryID methode aan CategoriesTableAdapter hebt toegevoegd, moeten deze klassen in de Typed DataSet-ontwerper eruitzien als de schermafbeelding in afbeelding 11.

De datasetontwerper bevat de nieuwe kolommen en methode

Afbeelding 11: De datasetontwerper bevat de nieuwe kolommen en methode

De business logic layer (BLL) bijwerken

Nu de DAL is bijgewerkt, hoeft u alleen maar de BLL (Business Logic Layer) te verbeteren om een methode voor de nieuwe CategoriesTableAdapter methode op te nemen. Voeg de volgende methode toe aan de klasse CategoriesBLL:

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

Stap 5: een bestand uploaden van de client naar de webserver

Bij het verzamelen van binaire gegevens worden deze gegevens vaak verstrekt door een eindgebruiker. Om deze informatie vast te leggen, moet de gebruiker een bestand van zijn computer naar de webserver kunnen uploaden. De geüploade gegevens moeten vervolgens worden geïntegreerd met het gegevensmodel, wat kan betekenen dat het bestand wordt opgeslagen in het bestandssysteem van de webserver en een pad naar het bestand in de database toevoegt, of dat de binaire inhoud rechtstreeks in de database wordt geschreven. In deze stap bekijken we hoe een gebruiker bestanden van zijn computer naar de server kan uploaden. In de volgende zelfstudie richten we onze aandacht op het integreren van het geüploade bestand met het gegevensmodel.

ASP.NET 2.0 s nieuwe FileUpload-webbesturing biedt gebruikers een mechanisme voor het verzenden van een bestand van hun computer naar de webserver. Het FileUpload-besturingselement wordt weergegeven als een <input> element, waarbij het type kenmerk is ingesteld op bestandstype. Browsers geven dit weer als een tekstvak met een knop Bladeren. Als u op de knop Bladeren klikt, wordt een dialoogvenster geopend waaruit de gebruiker een bestand kan selecteren. Wanneer het formulier wordt teruggestuurd, wordt de inhoud van het geselecteerde bestand samen met de postback verzonden. Aan de serverzijde is informatie over het geüploade bestand toegankelijk via de eigenschappen van het FileUpload-besturingselement.

Als u het uploaden van bestanden wilt demonstreren, opent u de FileUpload.aspx pagina in de BinaryData map, sleept u een FileUpload-besturingselement van de Werkset naar de ontwerpfunctie en stelt u de eigenschap ID van het besturingselement in op UploadTest. Voeg vervolgens een webknopbesturingselement toe en stel de ID en Text eigenschappen in op UploadButton en Geselecteerd bestand uploaden, respectievelijk. Plaats ten slotte een labelwebbesturingselement onder de knop, wis de Text eigenschap en stel de ID eigenschap in op UploadDetails.

Een FileUpload-besturingselement toevoegen aan de pagina ASP.NET

Afbeelding 12: Voeg een FileUpload-besturingselement toe aan de ASP.NET pagina (klik om de volledige afbeelding weer te geven)

In afbeelding 13 ziet u deze pagina wanneer deze wordt bekeken via een browser. Als u op de knop Bladeren klikt, wordt een dialoogvenster voor het selecteren van bestanden weergegeven, zodat de gebruiker een bestand van zijn computer kan kiezen. Zodra een bestand is geselecteerd, zorgt het klikken op de knop Geselecteerd bestand uploaden ervoor dat een postback de binaire inhoud van het geselecteerde bestand naar de webserver verzendt.

De gebruiker kan een bestand selecteren dat van zijn computer naar de server moet worden geüpload

Afbeelding 13: De gebruiker kan een bestand selecteren dat u wilt uploaden van de computer naar de server (klik om de volledige afbeelding weer te geven)

Bij het terugschrijven kan het geüploade bestand worden opgeslagen in het bestandssysteem of kunnen de binaire gegevens rechtstreeks via een Stream worden gebruikt. In dit voorbeeld gaan we een ~/Brochures map maken en het geüploade bestand daar opslaan. Voeg eerst de Brochures map toe aan de site als submap van de hoofdmap. Maak vervolgens een event handler voor het UploadButton s Click evenement en voeg de volgende code toe:

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

Het besturingselement FileUpload biedt verschillende eigenschappen voor het werken met de geüploade gegevens. De eigenschap geeft bijvoorbeeld HasFile aan of een bestand is geüpload door de gebruiker, terwijl de FileBytes eigenschap toegang biedt tot de geüploade binaire gegevens als een matrix van bytes. De Click gebeurtenis-handler begint door ervoor te zorgen dat een bestand is geüpload. Als een bestand is geüpload, toont het label de naam van het geüploade bestand, de grootte in bytes en het inhoudstype.

Opmerking

Om ervoor te zorgen dat de gebruiker een bestand uploadt, kunt u de HasFile eigenschap controleren en een waarschuwing weergeven als dit het is False, of u kunt in plaats daarvan het besturingselement RequiredFieldValidator gebruiken.

Met FileUpload wordt SaveAs(filePath) het geüploade bestand opgeslagen in het opgegeven filePath. filePath moet een fysiek pad (C:\Websites\Brochures\SomeFile.pdf) zijn in plaats van een virtueelpad (/Brochures/SomeFile.pdf). De Server.MapPath(virtPath) methode gebruikt een virtueel pad en retourneert het bijbehorende fysieke pad. Hier is ~/Brochures/fileNamehet virtuele pad, waarbij fileName de naam is van het geüploade bestand. Zie Server.MapPath Methos voor meer informatie over virtuele en fysieke paden en het gebruik van Server.MapPath.

Nadat u de Click gebeurtenis-handler hebt voltooid, neemt u even de tijd om de pagina in een browser te testen. Klik op de knop Bladeren en selecteer een bestand op de harde schijf en klik vervolgens op de knop Geselecteerd bestand uploaden. De postback verzendt de inhoud van het geselecteerde bestand naar de webserver, die vervolgens informatie over het bestand weergeeft voordat u het opslaat in de ~/Brochures map. Nadat u het bestand hebt geüpload, gaat u terug naar Visual Studio en klikt u op de knop Vernieuwen in Solution Explorer. U ziet nu het bestand dat u zojuist hebt geüpload in de map ~/Brochures!

Het bestand EvolutionValley.jpg is geüpload naar de webserver

Afbeelding 14: Het bestand EvolutionValley.jpg is geüpload naar de webserver (klik hier om de volledige afbeelding weer te geven)

EvolutionValley.jpg is opgeslagen in de map ~/Brochures

Afbeelding 15: EvolutionValley.jpg is opgeslagen in de ~/Brochures map

Subtiliteiten met het opslaan van geüploade bestanden naar het bestandssysteem

Er zijn verschillende subtiliteiten die moeten worden aangepakt bij het opslaan van uploadbestanden naar het bestandssysteem van de webserver. Ten eerste is er het probleem van beveiliging. Als u een bestand wilt opslaan in het bestandssysteem, moet de beveiligingscontext waaronder de ASP.NET pagina wordt uitgevoerd schrijfmachtigingen hebben. De ASP.NET Development Web Server wordt uitgevoerd in de context van uw huidige gebruikersaccount. Als u Microsoft Internet Information Services (IIS) als webserver gebruikt, is de beveiligingscontext afhankelijk van de versie van IIS en de configuratie ervan.

Een andere uitdaging voor het opslaan van bestanden in het bestandssysteem draait om het benoemen van de bestanden. Op dit moment worden alle geüploade bestanden opgeslagen in de ~/Brochures map met dezelfde naam als het bestand op de clientcomputer. Als Gebruiker A een brochure met de naam Brochure.pdfuploadt, wordt het bestand opgeslagen als ~/Brochure/Brochure.pdf. Maar wat gebeurt er als gebruiker B later een ander brochurebestand uploadt dat dezelfde bestandsnaam heeft (Brochure.pdf)? Met de code die we nu hebben, wordt het bestand van gebruiker A overschreven met de upload van gebruiker B.

Er zijn een aantal technieken voor het oplossen van bestandsnaamconflicten. Een optie is om het uploaden van een bestand te verbieden als er al een bestand met dezelfde naam bestaat. Wanneer gebruiker B probeert een bestand met de naam Brochure.pdfte uploaden, slaat het systeem het bestand niet op en wordt in plaats daarvan een bericht weergegeven waarin gebruiker B wordt geïnformeerd om de naam van het bestand te wijzigen en het opnieuw te proberen. Een andere methode is om het bestand op te slaan met behulp van een unieke bestandsnaam, wat een GUID (Globally Unique Identifier) kan zijn of de waarde uit de bijbehorende primaire-sleutelkolom(s) van de databaserecord (ervan uitgaande dat het uploaden is gekoppeld aan een bepaalde rij in het gegevensmodel). In de volgende zelfstudie verkennen we deze opties in meer detail.

Problemen met zeer grote hoeveelheden binaire gegevens

In deze handleidingen wordt ervan uitgegaan dat de vastgelegde binaire gegevens bescheiden zijn qua grootte. Het werken met zeer grote hoeveelheden binaire gegevensbestanden die meerdere megabytes of groter zijn, introduceert nieuwe uitdagingen die buiten het bereik van deze zelfstudies vallen. Standaard weigert ASP.NET bijvoorbeeld uploads van meer dan 4 MB, hoewel dit kan worden geconfigureerd via het <httpRuntime> element in Web.config. IIS legt ook een eigen beperkingen op voor het uploaden van bestanden. Bovendien kan de tijd die nodig is om grote bestanden te uploaden de standaardwaarde van 110 seconden overschrijden ASP.NET wacht op een aanvraag. Er zijn ook geheugen- en prestatieproblemen die optreden bij het werken met grote bestanden.

Het controle-element FileUpload is niet praktisch voor grote bestandsuploads. Wanneer de inhoud van het bestand op de server wordt geplaatst, moet de eindgebruiker geduldig wachten zonder enige bevestiging dat het uploaden vordert. Dit is niet zozeer een probleem bij het verwerken van kleinere bestanden die in een paar seconden kunnen worden geüpload, maar kan een probleem zijn bij het verwerken van grotere bestanden die mogelijk minuten duren om te uploaden. Er zijn verschillende besturingselementen voor het uploaden van bestanden van derden die beter geschikt zijn voor het verwerken van grote uploads en veel van deze leveranciers bieden voortgangsindicatoren en ActiveX-uploadbeheerders die een veel professionelere gebruikerservaring bieden.

Als uw toepassing grote bestanden moet verwerken, moet u de uitdagingen zorgvuldig onderzoeken en geschikte oplossingen vinden voor uw specifieke behoeften.

Samenvatting

Het bouwen van een toepassing die binaire gegevens moet vastleggen, brengt een aantal uitdagingen met zich mee. In deze zelfstudie hebben we de eerste twee verkend: bepalen waar de binaire gegevens moeten worden opgeslagen en waarmee een gebruiker binaire inhoud kan uploaden via een webpagina. In de volgende drie zelfstudies ziet u hoe u de geüploade gegevens koppelt aan een record in de database en hoe u de binaire gegevens naast de tekstgegevensvelden kunt weergeven.

Veel plezier met programmeren!

Meer lezen

Raadpleeg de volgende bronnen voor meer informatie over de onderwerpen die in deze zelfstudie worden besproken:

Over de auteur

Scott Mitchell, auteur van zeven ASP/ASP.NET-boeken en oprichter van 4GuysFromRolla.com, werkt sinds 1998 met Microsoft-webtechnologieën. Scott werkt als onafhankelijk consultant, trainer en schrijver. Zijn laatste boek is Sams Teach Yourself ASP.NET 2.0 in 24 uur. Hij kan worden bereikt op mitchell@4GuysFromRolla.com.

Speciale dank aan

Deze tutorialreeks is beoordeeld door veel behulpzame beoordelers. Hoofdrecensenten voor deze tutorial waren Teresa Murphy en Bernadette Leigh. Bent u geïnteresseerd in het bekijken van mijn aanstaande MSDN-artikelen? Zo ja, laat iets van je horen via mitchell@4GuysFromRolla.com.