Dela via


Ladda upp filer (VB)

av Scott Mitchell

Ladda ned PDF

Lär dig hur du tillåter användare att ladda upp binära filer (till exempel Word- eller PDF-dokument) till din webbplats där de kan lagras i antingen serverns filsystem eller databasen.

Inledning

Alla handledningar som vi har granskat hittills har uteslutande arbetat med textdata. Många program har dock datamodeller som samlar in både text och binära data. En onlinedejtingwebbplats kan göra det möjligt för användare att ladda upp en bild att associera med sin profil. En rekryteringswebbplats kan göra det möjligt för användare att ladda upp sitt CV som ett Microsoft Word- eller PDF-dokument.

Att arbeta med binära data lägger till en ny uppsättning utmaningar. Vi måste bestämma hur binära data lagras i programmet. Gränssnittet som används för att infoga nya poster måste uppdateras så att användaren kan ladda upp en fil från datorn och extra åtgärder måste vidtas för att visa eller tillhandahålla ett sätt att ladda ned en posts associerade binära data. I den här självstudien och de kommande tre utforskar vi hur du kan övervinna dessa utmaningar. I slutet av de här självstudierna har vi skapat ett fullt fungerande program som associerar en bild- och PDF-broschyr med varje kategori. I den här självstudien ska vi titta på olika tekniker för att lagra binära data och utforska hur du gör det möjligt för användare att ladda upp en fil från sin dator och få den sparad på webbserverns filsystem.

Anmärkning

Binära data som ingår i ett programs datamodell kallas ibland för en BLOB, en förkortning för Binary Large OBject. I dessa handledningar har jag valt att använda terminologin binära data, även om termen BLOB är synonym.

Steg 1: Skapa webbsidorna för att arbeta med binärdata

Innan vi börjar utforska utmaningarna med att lägga till stöd för binära data ska vi först ta en stund att skapa de ASP.NET sidor i vårt webbplatsprojekt som vi behöver för den här självstudien och de tre kommande. Börja med att lägga till en ny mapp med namnet BinaryData. Lägg sedan till följande ASP.NET sidor i mappen och se till att associera varje sida med Site.master huvudsidan:

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

Lägg till ASP.NET-sidorna för självstudierna för binära Data-Related

Bild 1: Lägg till ASP.NET-sidor för binära Data-Related-handledningar

Precis som i de andra mapparna kommer Default.aspx i BinaryData-mappen att lista självstudierna i dess avsnitt. Kom ihåg att SectionLevelTutorialListing.ascx användarkontrollen innehåller den här funktionen. Lägg därför till den här användarkontrollen genom att Default.aspx dra den från Solution Explorer till sidans designvy.

Lägg till sectionLevelTutorialListing.ascx-användarkontrollen i Default.aspx

Bild 2: Lägg till SectionLevelTutorialListing.ascx användarkontrollen Default.aspx i (Klicka om du vill visa en bild i full storlek)

Slutligen lägger du till dessa sidor som posteringar i Web.sitemap-filen. Mer specifikt lägger du till följande markering efter Förbättra 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>

Efter att du har uppdaterat Web.sitemap, ta en stund att besöka självstudiewebbplatsen via en webbläsare. Menyn till vänster innehåller nu objekt för självstudierna Arbeta med binära data.

Webbplatskartan innehåller nu poster för självstudieguiden 'Arbeta med binära data'

Bild 3: Webbplatskartan innehåller nu poster för självstudierna Arbeta med binära data

Steg 2: Bestämma var binärdata ska lagras

Binära data som är associerade med programmets datamodell kan lagras på någon av två platser: på webbserverns filsystem med en referens till filen som lagras i databasen. eller direkt i själva databasen (se bild 4). Varje metod har sin egen uppsättning för- och nackdelar och förtjänar en mer detaljerad diskussion.

Binära data kan lagras i filsystemet eller direkt i databasen

Bild 4: Binära data kan lagras i filsystemet eller direkt i databasen (klicka om du vill visa en bild i full storlek)

Anta att vi ville utöka Northwind-databasen för att associera en bild med varje produkt. Ett alternativ skulle vara att lagra avbildningsfilerna på webbserverns filsystem och registrera sökvägen i Products tabellen. Med den här metoden lägger vi till en ImagePath kolumn i Products tabellen av typen varchar(200), kanske. När en användare laddade upp en bild för Chai kan den bilden lagras på webbserverns filsystem på ~/Images/Tea.jpg, där ~ representerar programmets fysiska sökväg. Om webbplatsen är rotad på den fysiska sökvägen C:\Websites\Northwind\, så skulle ~/Images/Tea.jpg motsvara C:\Websites\Northwind\Images\Tea.jpg. När avbildningsfilen har laddats upp uppdaterar vi Chai-posten i Products tabellen så att dess ImagePath kolumn refererar till sökvägen till den nya avbildningen. Vi skulle kunna använda ~/Images/Tea.jpg eller bara Tea.jpg om vi bestämde att alla produktbilder skulle placeras i programmets Images mapp.

De största fördelarna med att lagra binära data i filsystemet är:

  • Enkel implementering som vi snart ser innebär lagring och hämtning av binära data som lagras direkt i databasen lite mer kod än när du arbetar med data via filsystemet. För att en användare ska kunna visa eller ladda ned binära data måste de dessutom visas med en URL till dessa data. Om data finns i webbserverns filsystem är URL:en enkel. Om data lagras i databasen måste dock en webbsida skapas som hämtar och returnerar data från databasen.
  • Utökad åtkomst till den binära datan Eftersom den binära datan kan behöva vara tillgänglig för andra tjänster eller applikationer som inte kan hämta den från databasen. Till exempel kan de avbildningar som är associerade med varje produkt också behöva vara tillgängliga för användare via FTP, i vilket fall vi vill lagra binära data i filsystemet.
  • Prestanda om binära data lagras i filsystemet, är efterfrågan och nätverksbelastningen mellan databasservern och webbservern mindre än om binära data lagras direkt i databasen.

Den största nackdelen med att lagra binära data i filsystemet är att de frikopplar data från databasen. Om en post tas bort från Products tabellen tas inte den associerade filen på webbserverns filsystem bort automatiskt. Vi måste skriva extra kod för att ta bort filen, annars blir filsystemet belamrat med oanvända, överblivna filer. När vi säkerhetskopierar databasen måste vi dessutom se till att göra säkerhetskopior av de associerade binära data i filsystemet. Att flytta databasen till en annan plats eller server innebär liknande utmaningar.

Alternativt kan binära data lagras direkt i en Microsoft SQL Server 2005-databas genom att skapa en kolumn av typen varbinary. Precis som med andra datatyper med variabel längd kan du ange en maximal längd på de binära data som kan lagras i den här kolumnen. Om du till exempel vill reservera högst 5 000 byte använder varbinary(5000)du ; varbinary(MAX) tillåter maximal lagringsstorlek, cirka 2 GB.

Den största fördelen med att lagra binära data direkt i databasen är den snäva kopplingen mellan binära data och databasposten. Detta förenklar databasadministrationsuppgifterna avsevärt, till exempel säkerhetskopieringar eller flytt av databasen till en annan plats eller server. Om du tar bort en post tas motsvarande binära data bort automatiskt. Det finns också mer subtila fördelar med att lagra binära data i databasen.

Anmärkning

I Microsoft SQL Server 2000 och tidigare versioner varbinary hade datatypen en maximal gräns på 8 000 byte. För att lagra upp till 2 GB binära data image måste datatypen användas i stället. Med tillägget av MAX i SQL Server 2005 har dock image datatypen föråldrats. Det stöds fortfarande för bakåtkompatibilitet, men Microsoft har meddelat att image datatypen kommer att tas bort i en framtida version av SQL Server.

Om du arbetar med en äldre datamodell kan datatypen visas image . Northwind-databasens Categories tabell har en Picture kolumn som kan användas för att lagra binära data för en bildfil för kategorin. Eftersom Northwind-databasen har sina rötter i Microsoft Access och tidigare versioner av SQL Server är den här kolumnen av typen image.

I den här självstudien och de kommande tre använder vi båda metoderna. Tabellen Categories har redan en Picture kolumn för lagring av binärt innehåll i en bild för kategorin. Vi lägger till ytterligare en kolumn, BrochurePath, för att lagra en sökväg till en PDF på webbserverns filsystem som kan användas för att ge en utskriftskvalitetsöversikt över kategorin.

Steg 3: Lägga tillBrochurePathkolumnen i tabellenCategories

För närvarande har tabellen Kategorier bara fyra kolumner: CategoryID, CategoryName, Descriptionoch Picture. Förutom dessa fält måste vi lägga till en ny som pekar på kategoribroschyren (om det finns någon). Om du vill lägga till den här kolumnen går du till Serverutforskaren, ökar detaljnivån i Tabeller, högerklickar på Categories tabellen och väljer Öppna tabelldefinition (se bild 5). Om du inte ser ServerUtforskaren tar du upp den genom att välja alternativet Serverutforskaren på menyn Visa eller trycka på Ctrl+Alt+S.

Lägg till en ny varchar(200) kolumn i tabellen Categories med namnet BrochurePath och tillåter NULL s och klicka på ikonen Spara (eller tryck på Ctrl+S).

Lägga till en BrochurePath-kolumn i kategoritabellen

Bild 5: Lägg till en BrochurePath kolumn i Categories tabellen (Klicka om du vill visa en bild i full storlek)

Steg 4: Uppdatera arkitekturen för att använda kolumnernaPictureochBrochurePath

I CategoriesDataTable i dataåtkomstlagret (DAL) finns för närvarande fyra DataColumn definierade: CategoryID, CategoryName, Description, och NumberOfProducts. När vi ursprungligen utformade datatabellen i självstudien Skapa ett dataåtkomstlager, hade den bara de tre första kolumnerna; CategoriesDataTable-kolumnen lades till i självstudiekursen NumberOfProducts.

Som beskrivs i Skapa ett dataåtkomstlager utgör DataTables i den typade datauppsättningen affärsobjekten. TableAdapters ansvarar för att kommunicera med databasen och fylla affärsobjekten med frågeresultatet. CategoriesDataTable fylls i med CategoriesTableAdapter, som har tre metoder för datahämtning:

  • GetCategories() kör huvudfrågan för TableAdapter och returnerar fälten CategoryID, CategoryName, och Description för alla poster i Categories-tabellen. Huvudfrågan är vad som används av de automatiskt genererade Insert metoderna och Update metoderna.
  • GetCategoryByCategoryID(categoryID) returnerar fälten CategoryID, CategoryNameoch Description i kategorin vars CategoryIDkategori-ID är lika med.
  • GetCategoriesAndNumberOfProducts() - returnerar fälten CategoryID, CategoryNameoch Description för alla poster i Categories tabellen. Använder också en underfråga för att returnera antalet produkter som är associerade med varje kategori.

Observera att ingen av dessa frågor returnerar Categories tabellerna Picture eller BrochurePath kolumnerna; inte heller tillhandahåller CategoriesDataTableDataColumn för dessa fält. För att kunna arbeta med Bild och BrochurePath-egenskaperna måste vi först lägga till dem i CategoriesDataTable och sedan uppdatera CategoriesTableAdapter-klassen så att dessa kolumner returneras.

Att lägga tillPictureochBrochurePath``DataColumn s

Börja med att lägga till dessa två kolumner i CategoriesDataTable. Högerklicka på CategoriesDataTable s-huvudet, välj Lägg till på snabbmenyn och välj sedan alternativet Kolumn. Detta skapar en ny DataColumn i DataTable med namnet Column1. Byt namn på den här kolumnen till Picture. Från fönstret Egenskaper anger du egenskapen DataColumn s DataType till System.Byte[] (det här är inte ett alternativ i listrutan; du måste skriva in det).

Skapa en DataColumn-namngiven bild vars DataType är System.Byte[]

Bild 6: Skapa en DataColumn namngiven Picture vars DataType är System.Byte[] (Klicka om du vill visa en bild i full storlek)

Lägg till en till DataColumn i DataTable och namnge den BrochurePath med standardvärdet DataType (System.String).

ReturneraPicture och BrochurePathvärden från TableAdapter

När dessa två DataColumn har lagts till i CategoriesDataTableär vi redo att uppdatera CategoriesTableAdapter. Vi kan ha båda dessa kolumnvärden returnerade i den huvudsakliga TableAdapter-frågan, men detta skulle föra tillbaka binära data varje gång GetCategories() metoden anropades. I stället ska vi uppdatera den huvudsakliga TableAdapter-frågan för att ta tillbaka BrochurePath och skapa ytterligare en datahämtningsmetod som returnerar en viss kategoris Picture kolumn.

Om du vill uppdatera huvudfrågan för TableAdapter högerklickar du på CategoriesTableAdapter s-huvudet och väljer alternativet Konfigurera på snabbmenyn. Detta visar tabelladapterkonfigurationsguiden, som vi har sett i ett antal tidigare handledningar. Uppdatera frågan för att ta tillbaka BrochurePath och klicka på Slutför.

Uppdatera kolumnlistan i SELECT-instruktionen för att även returnera BrochurePath

Bild 7: Uppdatera kolumnlistan i instruktionen så att den också returnerar SELECT (BrochurePath)

När du använder ad hoc SQL-instruktioner för TableAdapter, innebär uppdatering av kolumnlistan i huvudfrågan att kolumnlistan för alla SELECT frågemetoder i TableAdapter också uppdateras. Det innebär att GetCategoryByCategoryID(categoryID) metoden har uppdaterats för att returnera BrochurePath kolumnen, vilket kan vara vad vi avsåg. Men den uppdaterade också kolumnlistan i GetCategoriesAndNumberOfProducts() metoden och tar bort den underfråga som returnerar antalet produkter för varje kategori! Därför måste vi uppdatera den här metodens SELECT fråga. Högerklicka på GetCategoriesAndNumberOfProducts() metoden, välj Konfigurera och återställ SELECT frågan till dess ursprungliga värde:

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

Skapa sedan en ny TableAdapter-metod som returnerar en viss kategoris Picture kolumnvärde. Högerklicka på CategoriesTableAdapter s-huvudet och välj alternativet Lägg till fråga för att starta konfigurationsguiden för TableAdapter-frågor. Det första steget i den här guiden frågar oss om vi vill fråga efter data med hjälp av en ad hoc SQL-instruktion, en ny lagrad procedur eller en befintlig. Välj Använd SQL-instruktioner och klicka på Nästa. Eftersom vi kommer att returnera en rad väljer du alternativet SELECT som returnerar rader från det andra steget.

Välj alternativet Använd SQL-uttryck

Bild 8: Välj alternativet Använd SQL-uttryck (Klicka om du vill visa en bild i full storlek)

Eftersom frågan returnerar en post från kategoritabellen väljer du SELECT som returnerar rader

Bild 9: Eftersom frågan returnerar en post från tabellen Kategorier väljer du VÄLJ som returnerar rader (Klicka om du vill visa en bild i full storlek)

I det tredje steget anger du följande SQL-fråga och klickar på Nästa:

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

Det sista steget är att välja namnet på den nya metoden. Använd FillCategoryWithBinaryDataByCategoryID och GetCategoryWithBinaryDataByCategoryID för mönstren Fyll i en datatabell och returnera en datatabell. Klicka på Slutför för att slutföra guiden.

Välj namn för TableAdapter s-metoderna

Bild 10: Välj namnen för TableAdapter-metoderna (Klicka om du vill visa en bild i full storlek)

Anmärkning

När du har slutfört frågekonfigurationsguiden för tabelladapter kan du se en dialogruta som informerar dig om att den nya kommandotexten returnerar data med ett annat schema än schemat för huvudfrågan. Kort sagt, guiden noterar att TableAdapter-huvudfrågan GetCategories() returnerar ett annat schema än det vi just skapade. Men det här är vad vi vill ha, så du kan bortse från det här meddelandet.

Tänk också på att om du använder ad hoc SQL-instruktioner och använder guiden för att ändra TableAdapter-huvudfrågan vid en senare tidpunkt, kommer den att ändra GetCategoryWithBinaryDataByCategoryID metodens instruktions SELECT kolumnlista så att den bara innehåller dessa kolumner från huvudfrågan (det vill sa att den Picture tar bort kolumnen från frågan). Du måste uppdatera kolumnlistan manuellt för att returnera Picture kolumnen, ungefär som vi gjorde med GetCategoriesAndNumberOfProducts() metoden tidigare i det här steget.

När du har lagt till de två DataColumn-komponenterna i CategoriesDataTable och GetCategoryWithBinaryDataByCategoryID-metoden till CategoriesTableAdapter, borde dessa klasser i Typed DataSet Designer se ut som skärmbilden i bild 11.

DataSet Designer innehåller de nya kolumnerna och metoden

Bild 11: DataSet Designer innehåller de nya kolumnerna och metoden

Uppdatera affärslogiklagret (BLL)

När DAL har uppdaterats är allt som återstår att utöka BLL (Business Logic Layer) till att inkludera en metod för den nya CategoriesTableAdapter metoden. Lägg till följande metod i klassen CategoriesBLL:

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

Steg 5: Ladda upp en fil från klienten till webbservern

När du samlar in binära data tillhandahålls ofta dessa data av en slutanvändare. För att samla in den här informationen måste användaren kunna ladda upp en fil från sin dator till webbservern. De uppladdade data måste sedan integreras med datamodellen, vilket kan innebära att filen sparas i webbserverns filsystem och att en sökväg läggs till i filen i databasen, eller att det binära innehållet skrivs direkt till databasen. I det här steget ska vi titta på hur du tillåter att en användare laddar upp filer från datorn till servern. I nästa självstudie fokuserar vi på att integrera den uppladdade filen med datamodellen.

ASP.NET 2.0 s nya FileUpload-webbkontroll ger en mekanism för användare att skicka en fil från sin dator till webbservern. FileUpload-kontrollen återges som ett <input> element vars type attribut är inställt på fil, som webbläsare visar som en textruta med knappen Bläddra. Om du klickar på knappen Bläddra visas en dialogruta där användaren kan välja en fil. När formuläret skickas tillbaka skickas den valda filens innehåll tillsammans med postback. På serversidan är information om den uppladdade filen tillgänglig via egenskaperna för FileUpload-kontrollen.

Om du vill demonstrera uppladdning av filer öppnar FileUpload.aspx du sidan i BinaryData mappen, drar en FileUpload-kontroll från verktygslådan till designern och anger kontrollens ID egenskap till UploadTest. Lägg sedan till en knapp Web-kontroll och ange dess egenskaper ID och Text till UploadButton, respektive Ladda upp vald fil. Placera slutligen en etikettwebbkontroll under knappen, rensa dess Text egenskap och ange dess ID egenskap till UploadDetails.

Lägg till en FileUpload-kontroll på sidan ASP.NET

Bild 12: Lägg till en FileUpload-kontroll på sidan ASP.NET (Klicka om du vill visa en bild i full storlek)

Bild 13 visar den här sidan när den visas via en webbläsare. Observera att om du klickar på knappen Bläddra visas en dialogruta för filval så att användaren kan välja en fil från sin dator. När en fil har valts och du klickar på knappen Ladda upp vald fil, sker en postback som skickar den valda filens binära innehåll till webbservern.

Användaren kan välja en fil som ska laddas upp från datorn till servern

Bild 13: Användaren kan välja en fil som ska laddas upp från datorn till servern (Klicka om du vill visa en bild i full storlek)

Vid efteråterställningen kan den uppladdade filen sparas i filsystemet eller så kan dess binära data bearbetas direkt via en Stream. I det här exemplet ska vi skapa en ~/Brochures mapp och spara den uppladdade filen där. Börja med att lägga till Brochures mappen på webbplatsen som en undermapp i rotkatalogen. Skapa sedan en händelsehanterare för UploadButton s-händelsen Click och lägg till följande kod:

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

Kontrollen FileUpload innehåller en mängd olika egenskaper för att arbeta med uppladdade data. Egenskapen anger till exempel HasFile om en fil laddades upp av användaren, medan FileBytes egenskapen ger åtkomst till de uppladdade binära data som en matris med byte. Händelsehanteraren Click startar genom att se till att en fil har laddats upp. Om en fil har laddats upp visar etiketten namnet på den uppladdade filen, dess storlek i byte och dess innehållstyp.

Anmärkning

För att säkerställa att användaren laddar upp en fil kan du kontrollera HasFile egenskapen och visa en varning om den är False, eller så kan du använda kontrollen RequiredFieldValidator i stället.

FileUpload s sparar den uppladdade filen till den angivna SaveAs(filePath) FileUpload s saves the uploaded file to the specified filePath. filePath måste vara en fysisk sökväg (C:\Websites\Brochures\SomeFile.pdf) i stället för en virtuellsökväg (/Brochures/SomeFile.pdf). MetodenServer.MapPath(virtPath) tar en virtuell sökväg och returnerar motsvarande fysiska sökväg. Här är ~/Brochures/fileNameden virtuella sökvägen , där fileName är namnet på den uppladdade filen. Mer information om virtuella och fysiska sökvägar och hur du använder finns i Server.MapPath.

När du har slutfört Click händelsehanteraren kan du testa sidan i en webbläsare. Klicka på knappen Bläddra och välj en fil från hårddisken och klicka sedan på knappen Ladda upp vald fil. Postback skickar innehållet i den valda filen till webbservern, som sedan visar information om filen innan den sparas i ~/Brochures mappen. När du har laddat upp filen går du tillbaka till Visual Studio och klickar på knappen Uppdatera i Solution Explorer. Du bör se filen som du just laddade upp i mappen ~/Broschyrer!

Filen EvolutionValley.jpg har laddats upp till webbservern

Bild 14: Filen EvolutionValley.jpg har laddats upp till webbservern (klicka om du vill visa en bild i full storlek)

EvolutionValley.jpg sparades i mappen ~/Broschyrer

Bild 15: EvolutionValley.jpg Sparades i mappen ~/Brochures

Subtiliteter med att spara uppladdade filer i filsystemet

Det finns flera subtiliteter som måste åtgärdas när du sparar uppladdning av filer till webbserverns filsystem. Först har vi säkerhetsfrågan. För att spara en fil i filsystemet måste säkerhetskontexten som ASP.NET-sidan körs under ha skrivbehörighet. Webbservern ASP.NET Development körs i kontexten för ditt aktuella användarkonto. Om du använder Microsofts Internet Information Services (IIS) som webbserver beror säkerhetskontexten på versionen av IIS och dess konfiguration.

En annan utmaning med att spara filer i filsystemet handlar om att namnge filerna. För närvarande sparar vår sida alla uppladdade filer i ~/Brochures katalogen med samma namn som filen på klientens dator. Om användare A laddar upp en broschyr med namnet Brochure.pdfsparas filen som ~/Brochure/Brochure.pdf. Men vad händer om användare B någon gång senare laddar upp en annan broschyrfil som råkar ha samma filnamn (Brochure.pdf)? Med den kod vi har nu skrivs användar A:s fil över med användar B:s uppladdning.

Det finns ett antal metoder för att lösa filnamnskonflikter. Ett alternativ är att förbjuda uppladdning av en fil om det redan finns en med samma namn. Med den här metoden, när användare B försöker ladda upp en fil med namnet Brochure.pdf, skulle systemet inte spara filen och i stället visa ett meddelande som informerar användare B om att byta namn på filen och försöka igen. En annan metod är att spara filen med ett unikt filnamn, som kan vara en globalt unik identifierare (GUID) eller värdet från motsvarande databasposts primära nyckelkolumner (förutsatt att uppladdningen är associerad med en viss rad i datamodellen). I nästa handledning kommer vi att utforska de här alternativen mer detaljerat.

Utmaningar med mycket stora mängder binära data

Dessa handledningar förutsätter att de binära data som samlas in är blygsamma i storlek. Att arbeta med mycket stora mängder binära datafiler som är flera megabyte eller större medför nya utmaningar som ligger utanför omfånget för dessa självstudier. Som standard avvisar ASP.NET till exempel uppladdningar på mer än 4 MB, även om detta kan konfigureras via elementet<httpRuntime> i Web.config. IIS tillämpar också sina egna storleksbegränsningar för filuppladdning. Dessutom kan den tid det tar att ladda upp stora filer överskrida standardvärdet 110 sekunder ASP.NET väntar på en begäran. Det finns också minnes- och prestandaproblem som uppstår när du arbetar med stora filer.

FileUpload-kontrollen är opraktisk för stora filuppladdningar. När filens innehåll publiceras på servern måste slutanvändaren tålmodigt vänta utan någon bekräftelse på att uppladdningen pågår. Detta är inte så mycket ett problem när du hanterar mindre filer som kan laddas upp på några sekunder, men kan vara ett problem när du hanterar större filer som kan ta minuter att ladda upp. Det finns en mängd olika kontroller för filuppladdning från tredje part som passar bättre för hantering av stora uppladdningar och många av dessa leverantörer tillhandahåller förloppsindikatorer och ActiveX-uppladdningshanterare som ger en mycket mer polerad användarupplevelse.

Om ditt program behöver hantera stora filer måste du noggrant undersöka utmaningarna och hitta lämpliga lösningar för dina specifika behov.

Sammanfattning

Att skapa ett program som behöver samla in binära data medför ett antal utmaningar. I den här självstudien utforskade vi de två första: att bestämma var binärdata ska lagras och låta en användare ladda upp binärt innehåll via en webbsida. Under de kommande tre självstudierna får vi se hur du associerar uppladdade data med en post i databasen samt hur du visar binära data tillsammans med dess textdatafält.

Lycka till med programmerandet!

Ytterligare läsning

Mer information om de ämnen som beskrivs i den här självstudien finns i följande resurser:

Om författaren

Scott Mitchell, författare till sju ASP/ASP.NET-böcker och grundare av 4GuysFromRolla.com, har arbetat med Microsofts webbtekniker sedan 1998. Scott arbetar som oberoende konsult, tränare och författare. Hans senaste bok är Sams Teach Yourself ASP.NET 2.0 på 24 timmar. Han kan nås på mitchell@4GuysFromRolla.com.

Särskilt tack till

Den här självstudieserien granskades av många användbara granskare. Huvudgranskare för den här självstudien var Teresa Murphy och Bernadette Leigh. Vill du granska mina kommande MSDN-artiklar? Om så är fallet, hör av dig på mitchell@4GuysFromRolla.com.