Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
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
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.
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.
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.
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. Mer ingående diskussion finns i Lagra binära filer direkt i databasen med hjälp av ASP.NET 2.0 .
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 tillBrochurePath
kolumnen i tabellenCategories
För närvarande har tabellen Kategorier bara fyra kolumner: CategoryID
, CategoryName
, Description
och 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).
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 kolumnernaPicture
ochBrochurePath
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ältenCategoryID
,CategoryName
, ochDescription
för alla poster iCategories
-tabellen. Huvudfrågan är vad som används av de automatiskt genereradeInsert
metoderna ochUpdate
metoderna. -
GetCategoryByCategoryID(categoryID)
returnerar fältenCategoryID
,CategoryName
ochDescription
i kategorin varsCategoryID
kategori-ID är lika med. -
GetCategoriesAndNumberOfProducts()
- returnerar fältenCategoryID
,CategoryName
ochDescription
för alla poster iCategories
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 CategoriesDataTable
DataColumn
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 tillPicture
ochBrochurePath``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).
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 BrochurePath
vä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.
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.
Bild 8: Välj alternativet Använd SQL-uttryck (Klicka om du vill visa en bild i full storlek)
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.
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.
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 Northwind.CategoriesDataTable
GetCategoryWithBinaryDataByCategoryID(int categoryID)
{
return Adapter.GetCategoryWithBinaryDataByCategoryID(categoryID);
}
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
.
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.
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 void UploadButton_Click(object sender, EventArgs e)
{
if (UploadTest.HasFile == false)
{
// 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
string filePath =
Server.MapPath("~/Brochures/" + UploadTest.FileName);
UploadTest.SaveAs(filePath);
}
}
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/fileName
den 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!
Bild 14: Filen EvolutionValley.jpg
har laddats upp till webbservern (klicka om du vill visa en bild i full storlek)
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.pdf
sparas 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:
- Använda Large-Value datatyper
- Snabbstarter för FileUpload-kontroll
- ASP.NET 2.0 Serverkontroll för filöverföring
- Den mörka sidan av filuppladdningar
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.