Nahrávání souborů (C#)
Zjistěte, jak uživatelům povolit nahrávání binárních souborů (například dokumentů Word nebo PDF) na web, kde mohou být uloženy v systému souborů serveru nebo v databázi.
Úvod
Všechny kurzy, které jsme zatím prozkoumali, pracovaly výhradně s textovými daty. Mnoho aplikací ale má datové modely, které zachytává textová i binární data. Web online seznamky může uživatelům umožnit nahrání obrázku, který přidruží k jejich profilu. Náborový web může uživatelům umožnit nahrání životopisu jako dokumentu Microsoft Word nebo PDF.
Práce s binárními daty přináší novou sadu výzev. Musíme rozhodnout, jak budou binární data uložena v aplikaci. Rozhraní používané pro vkládání nových záznamů musí být aktualizováno, aby uživatel mohl nahrát soubor ze svého počítače, a je nutné provést další kroky k zobrazení nebo poskytnutí prostředků pro stažení záznamu s přidruženými binárními daty. V tomto kurzu a dalších třech se podíváme, jak tyto výzvy vyřešit. Na konci těchto kurzů jsme vytvořili plně funkční aplikaci, která přidruží obrázky a PDF brožuru k jednotlivým kategoriím. V tomto konkrétním kurzu se podíváme na různé techniky ukládání binárních dat a prozkoumáme, jak uživatelům umožnit nahrát soubor ze svého počítače a uložit ho do systému souborů webového serveru.
Poznámka
Binární data, která jsou součástí datového modelu aplikace, se někdy označují jako objekt BLOB, zkratka pro Binary Large OBject. V těchto kurzech jsem se rozhodl(a) použít terminologii binární data, i když je výraz BLOB synonymní.
Krok 1: Vytvoření webové stránky pro práci s binárními daty
Než začneme zkoumat výzvy spojené s přidáním podpory binárních dat, udělejme si nejdřív chvilku a vytvořte ASP.NET stránky v našem webovém projektu, které budeme potřebovat pro tento kurz a další tři. Začněte přidáním nové složky s názvem BinaryData
. Dále do této složky přidejte následující ASP.NET stránky a nezapomeňte každou stránku přidružit ke Site.master
stránce předlohy:
Default.aspx
FileUpload.aspx
DisplayOrDownloadData.aspx
UploadInDetailsView.aspx
UpdatingAndDeleting.aspx
Obrázek 1: Přidání stránek ASP.NET pro kurzy binární Data-Related
Stejně jako v ostatních složkách Default.aspx
bude ve BinaryData
složce seznam výukových kurzů ve své části. Vzpomeňte si SectionLevelTutorialListing.ascx
, že tuto funkci poskytuje uživatelský ovládací prvek. Proto přidejte tento uživatelský ovládací prvek do Default.aspx
přetažením z Průzkumník řešení do zobrazení Návrh stránky.
Obrázek 2: Přidání SectionLevelTutorialListing.ascx
uživatelského ovládacího prvku do Default.aspx
(kliknutím zobrazíte obrázek v plné velikosti)
Nakonec přidejte tyto stránky jako položky do Web.sitemap
souboru. Konkrétně přidejte následující kód za Vylepšení 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>
Po aktualizaci Web.sitemap
se chvíli podívejte na web kurzů prostřednictvím prohlížeče. Nabídka na levé straně teď obsahuje položky pro kurzy Práce s binárními daty.
Obrázek 3: Mapa webu teď obsahuje položky pro kurzy Práce s binárními daty
Krok 2: Rozhodnutí o tom, kam uložit binární data
Binární data, která jsou přidružena k datovému modelu aplikace, mohou být uloženy na jednom ze dvou míst: v systému souborů webového serveru s odkazem na soubor uložený v databázi; nebo přímo v samotné databázi (viz Obrázek 4). Každý přístup má vlastní sadu kladů a záporů a zaslouží si podrobnější diskuzi.
Obrázek 4: Binární data mohou být uložena v systému souborů nebo přímo v databázi (kliknutím zobrazíte obrázek v plné velikosti)
Představte si, že jsme chtěli rozšířit databázi Northwind tak, aby ke každému produktu přidružila obrázek. Jednou z možností je uložit tyto soubory obrázků do systému souborů webového serveru a zaznamenat cestu do Products
tabulky. Při tomto přístupu bychom do Products
tabulky přidali ImagePath
sloupec typu varchar(200)
, třeba . Když uživatel nahrál obrázek pro Chai, může být tento obrázek uložený v systému souborů webového serveru na adrese ~/Images/Tea.jpg
, kde ~
představuje fyzickou cestu aplikace. To znamená, že pokud je web rootován na fyzické cestě C:\Websites\Northwind\
, ~/Images/Tea.jpg
bude ekvivalentní k C:\Websites\Northwind\Images\Tea.jpg
. Po nahrání souboru obrázku aktualizujeme záznam Chai v Products
tabulce tak, aby jeho ImagePath
sloupec odkazoval na cestu k novému obrázku. Mohli bychom použít ~/Images/Tea.jpg
nebo jen Tea.jpg
v případě, že bychom se rozhodli, že všechny obrázky produktů budou umístěny do složky s Images
aplikace.
Hlavní výhody ukládání binárních dat v systému souborů:
- Jednoduchá implementace , jak uvidíme za chvíli, ukládání a načítání binárních dat uložených přímo v databázi zahrnuje o něco více kódu než při práci s daty prostřednictvím systému souborů. Aby uživatel mohl zobrazit nebo stáhnout binární data, musí mít navíc adresu URL pro tato data. Pokud se data nacházejí v systému souborů webového serveru, je adresa URL jednoduchá. Pokud jsou ale data uložená v databázi, je potřeba vytvořit webovou stránku, která načte a vrátí data z databáze.
- Širší přístup k binárním datům , která mohou být potřeba, aby byla přístupná jiným službám nebo aplikacím, které nemohou získat data z databáze. Například obrázky přidružené k jednotlivým produktům mohou být také potřeba, aby byly uživatelům dostupné prostřednictvím protokolu FTP. V takovém případě chceme binární data uložit do systému souborů.
- Pokud jsou binární data uložená v systému souborů, bude poptávka a zahlcení sítě mezi databázovým serverem a webovým serverem menší, než když jsou binární data uložená přímo v databázi.
Hlavní nevýhodou ukládání binárních dat v systému souborů je oddělení dat od databáze. Pokud je záznam odstraněn z Products
tabulky, přidružený soubor v systému souborů webového serveru se automaticky neodstraní. Musíme napsat dodatečný kód pro odstranění souboru, jinak se systém souborů zahltí nepoužívanými, osamocenými soubory. Kromě toho musíme při zálohování databáze zálohovat také přidružená binární data v systému souborů. Přesunutí databáze do jiné lokality nebo serveru představuje podobné problémy.
Alternativně mohou být binární data uložena přímo v databázi Microsoft SQL Server 2005 vytvořením sloupce typu varbinary
. Stejně jako u jiných datových typů s proměnlivou délkou můžete zadat maximální délku binárních dat, která mohou být uložena v tomto sloupci. Pokud chcete například rezervovat maximálně 5 000 bajtů, použijte varbinary(5000)
varbinary(MAX)
; umožňuje maximální velikost úložiště, asi 2 GB.
Hlavní výhodou ukládání binárních dat přímo do databáze je úzká vazba mezi binárními daty a záznamem databáze. To výrazně zjednodušuje úlohy správy databáze, jako je zálohování nebo přesun databáze na jinou lokalitu nebo server. Odstranění záznamu také automaticky odstraní odpovídající binární data. Ukládání binárních dat do databáze má také drobné výhody. Podrobnější informace najdete v tématu Ukládání binárních souborů přímo do databáze pomocí ASP.NET 2.0 .
Poznámka
V microsoft SQL Server 2000 a starších verzích varbinary
měl datový typ maximální limit 8 000 bajtů. K uložení až 2 GB binárních dat image
je potřeba místo toho použít datový typ. S přidáním MAX
v SQL Server 2005 je ale image
tento datový typ zastaralý. Je stále podporována pro zpětnou kompatibilitu, ale Společnost Microsoft oznámila, že image
datový typ bude v budoucí verzi SQL Server odebrán.
Pokud pracujete se starším datovým modelem, může se zobrazit image
datový typ . Tabulka databáze Categories
Northwind obsahuje Picture
sloupec, který lze použít k uložení binárních dat souboru obrázku pro danou kategorii. Vzhledem k tomu, že databáze Northwind má své kořeny v Aplikaci Microsoft Access a starších verzích SQL Server, je tento sloupec typu image
.
V tomto kurzu a dalších třech použijeme oba přístupy. Tabulka Categories
již obsahuje Picture
sloupec pro ukládání binárního obsahu obrázku pro kategorii. Přidáme další sloupec , BrochurePath
který uloží cestu k SOUBORU PDF v systému souborů webového serveru, který lze použít k poskytování přehledu kategorie v kvalitě tisku.
Krok 3: PřidáníBrochurePath
sloupce doCategories
tabulky
Tabulka Categories v současné době obsahuje pouze čtyři sloupce: CategoryID
, CategoryName
, Description
a Picture
. Kromě těchto polí musíme přidat nové pole, které bude odkazovat na brožuru kategorie (pokud existuje). Pokud chcete přidat tento sloupec, přejděte do Průzkumníka serveru, přejděte k podrobnostem tabulky, klikněte pravým tlačítkem na Categories
tabulku a zvolte Otevřít definici tabulky (viz Obrázek 5). Pokud se Průzkumník serveru nezobrazuje, otevřete ho výběrem možnosti Průzkumník serveru v nabídce Zobrazení nebo stiskněte Kombinaci kláves Ctrl+Alt+S.
Přidejte do tabulky nový varchar(200)
sloupec, který má název BrochurePath
a povolí NULL
s, a klikněte na ikonu Uložit (nebo stiskněte Ctrl+Categories
S).
Obrázek 5: Přidání BrochurePath
sloupce do Categories
tabulky (kliknutím zobrazíte obrázek v plné velikosti)
Krok 4: Aktualizace architektury tak, aby používalaPicture
sloupce aBrochurePath
Objekt CategoriesDataTable
ve vrstvě dal (Data Access Layer) má aktuálně definované čtyři DataColumn
objekty: CategoryID
, CategoryName
, Description
a NumberOfProducts
. Když jsme původně navrhli tuto tabulku DataTable v kurzu Vytvoření vrstvy přístupu k datům , CategoriesDataTable
obsahovala pouze první tři sloupce. NumberOfProducts
Sloupec byl přidán do kurzu Master/Detail Using a Bulleted List of Master Of Master Records with a Details DataList .
Jak je popsáno v tématu Vytvoření vrstvy přístupu k datům, datové tabulky v typed dataset tvoří obchodní objekty. Objekty TableAdapter zodpovídají za komunikaci s databází a naplnění obchodních objektů výsledky dotazu. Objekt CategoriesDataTable
je naplněný objektem CategoriesTableAdapter
, který má tři metody načítání dat:
GetCategories()
spustí hlavní dotaz objektu TableAdapter a vrátíCategoryID
pole ,CategoryName
aDescription
všech záznamů v tabulceCategories
. Hlavním dotazem je to, co se používá automaticky generovanýmiInsert
metodami aUpdate
.GetCategoryByCategoryID(categoryID)
CategoryID
vrátí pole ,CategoryName
aDescription
kategorie, jejížCategoryID
hodnota se rovná categoryID.GetCategoriesAndNumberOfProducts()
– vrátíCategoryID
pole ,CategoryName
aDescription
pro všechny záznamy v tabulceCategories
. Používá také poddotaz k vrácení počtu produktů přidružených k jednotlivým kategoriím.
Všimněte si, že žádný z těchto dotazů nevrací Categories
tabulky s Picture
nebo BrochurePath
sloupce; ani neposkytuje CategoriesDataTable
DataColumn
pro tato pole s. Aby bylo možné pracovat s obrázky a BrochurePath
vlastnostmi, musíme je nejprve přidat do CategoriesDataTable
třídy a pak aktualizovat CategoriesTableAdapter
třídu tak, aby vrátila tyto sloupce.
Přidání aPicture
BrochurePath``DataColumn
s
Začněte přidáním těchto dvou sloupců do CategoriesDataTable
. Klikněte pravým tlačítkem na CategoriesDataTable
záhlaví s, v místní nabídce vyberte Přidat a pak zvolte možnost Sloupec. Tím se v tabulce DataTable vytvoří nová DataColumn
tabulka s názvem Column1
. Přejmenujte tento sloupec na Picture
. V okno Vlastnosti nastavte DataColumn
vlastnost s DataType
na System.Byte[]
(není to možnost v rozevíracím seznamu, musíte ji zadat).
Obrázek 6: Vytvoření pojmenovaného DataColumn
Picture
, jehož DataType
název je System.Byte[]
(kliknutím zobrazíte obrázek v plné velikosti)
Přidejte do tabulky DataTable další DataColumn
a pojměte ji BrochurePath
pomocí výchozí DataType
hodnoty (System.String
).
VráceníPicture
hodnot aBrochurePath
z vlastnosti TableAdapter
Po přidání těchto dvou DataColumn
do , jsme připraveni aktualizovat CategoriesTableAdapter
.CategoriesDataTable
V hlavním dotazu TableAdapter bychom mohli vrátit obě tyto hodnoty sloupců, ale při každém GetCategories()
vyvolání metody by se vrátila binární data. Místo toho pojďme aktualizovat hlavní dotaz TableAdapter tak, aby se vrátil zpět BrochurePath
a vytvořil další metodu načítání dat, která vrátí konkrétní sloupec kategorie s Picture
.
Chcete-li aktualizovat hlavní dotaz TableAdapter, klikněte pravým tlačítkem myši na CategoriesTableAdapter
záhlaví s a v místní nabídce zvolte možnost Konfigurovat. Zobrazí se Průvodce konfigurací adaptéru tabulky, kterého jsme viděli v řadě minulých kurzů. Aktualizujte dotaz tak, aby vrátil zpět BrochurePath
, a klikněte na Dokončit.
Obrázek 7: Aktualizace seznamu sloupců v SELECT
příkazu tak, aby se také vrátil BrochurePath
(kliknutím zobrazíte obrázek v plné velikosti)
Při použití ad hoc příkazů SQL pro Objekt TableAdapter aktualizace seznamu sloupců v hlavním dotazu aktualizuje seznam sloupců pro všechny SELECT
metody dotazu v objektu TableAdapter. To znamená, že metoda GetCategoryByCategoryID(categoryID)
byla aktualizována tak, aby vrátila BrochurePath
sloupec, což by mohlo být to, co jsme zamýšleli. Aktualizovala ale také seznam sloupců v GetCategoriesAndNumberOfProducts()
metodě a odebrala poddotaz, který vrací počet produktů pro každou kategorii. Proto musíme tento dotaz metody SELECT
aktualizovat. Klikněte pravým tlačítkem na metodu GetCategoriesAndNumberOfProducts()
, zvolte Konfigurovat a vraťte SELECT
dotaz zpět na původní hodnotu:
SELECT CategoryID, CategoryName, Description,
(SELECT COUNT(*)
FROM Products p
WHERE p.CategoryID = c.CategoryID)
as NumberOfProducts
FROM Categories c
Dále vytvořte novou metodu TableAdapter, která vrátí hodnotu sloupce konkrétní kategorie Picture
. Klikněte pravým tlačítkem na CategoriesTableAdapter
záhlaví s a výběrem možnosti Přidat dotaz spusťte Průvodce konfigurací dotazu TableAdapter. První krok tohoto průvodce se nás zeptá, jestli chceme dotazovat data pomocí ad hoc příkazu SQL, nové uložené procedury nebo existující procedury. Vyberte Použít příkazy SQL a klikněte na Další. Vzhledem k tomu, že budeme vracet řádek, zvolte ve druhém kroku možnost SELECT which return rows (VYBRAT, která vrací řádky).
Obrázek 8: Výběr možnosti Použít příkazy SQL (kliknutím zobrazíte obrázek v plné velikosti)
Obrázek 9: Vzhledem k tomu, že dotaz vrátí záznam z tabulky Categories, zvolte SELECT, která vrátí řádky (kliknutím zobrazíte obrázek v plné velikosti).
Ve třetím kroku zadejte následující dotaz SQL a klikněte na Další:
SELECT CategoryID, CategoryName, Description, BrochurePath, Picture
FROM Categories
WHERE CategoryID = @CategoryID
Posledním krokem je výběr názvu nové metody. Pro vzory Fill a DataTable a Return a DataTable použijte FillCategoryWithBinaryDataByCategoryID
a GetCategoryWithBinaryDataByCategoryID
. Dokončete průvodce kliknutím na Dokončit.
Obrázek 10: Volba názvů pro metody TableAdapter (kliknutím zobrazíte obrázek v plné velikosti)
Poznámka
Po dokončení Průvodce konfigurací dotazu adaptéru tabulky se může zobrazit dialogové okno s informací, že nový text příkazu vrátí data se schématem odlišným od schématu hlavního dotazu. Stručně řečeno, průvodce si povšimá, že hlavní dotaz GetCategories()
objektu TableAdapter vrací jiné schéma než to, které jsme právě vytvořili. Ale to je to, co chceme, takže můžete tuto zprávu ignorovat.
Mějte také na paměti, že pokud používáte ad hoc příkazy SQL a později použijete průvodce ke změně hlavního dotazu objektu TableAdapter, upraví GetCategoryWithBinaryDataByCategoryID
se seznam sloupců příkazů metody SELECT
tak, aby zahrnoval pouze tyto sloupce z hlavního dotazu (to znamená, Picture
že odebere sloupec z dotazu). Seznam sloupců budete muset ručně aktualizovat, aby se sloupec vrátil Picture
, podobně jako jsme to udělali s metodou GetCategoriesAndNumberOfProducts()
dříve v tomto kroku.
Po přidání dvou DataColumn
s do CategoriesDataTable
a GetCategoryWithBinaryDataByCategoryID
metody do CategoriesTableAdapter
třídy by tyto třídy v Designer Typed DataSet měly vypadat jako na snímku obrazovky na obrázku 11.
Obrázek 11: Designer DataSet zahrnuje nové sloupce a metodu
Aktualizace vrstvy obchodní logiky (BLL)
Po aktualizaci DAL zbývá jen rozšířit vrstvu obchodní logiky (BLL) tak, aby zahrnovala metodu pro novou CategoriesTableAdapter
metodu. Do třídy CategoriesBLL
přidejte následující metodu:
[System.ComponentModel.DataObjectMethodAttribute
(System.ComponentModel.DataObjectMethodType.Select, false)]
public Northwind.CategoriesDataTable
GetCategoryWithBinaryDataByCategoryID(int categoryID)
{
return Adapter.GetCategoryWithBinaryDataByCategoryID(categoryID);
}
Krok 5: Nahrání souboru z klienta na webový server
Při shromažďování binárních dat jsou tato data často poskytována koncovým uživatelem. Aby uživatel mohl tyto informace zachytit, musí mít možnost nahrát soubor ze svého počítače na webový server. Nahraná data pak musí být integrovaná s datovým modelem, což může znamenat uložení souboru do systému souborů webového serveru a přidání cesty k souboru v databázi nebo zápis binárního obsahu přímo do databáze. V tomto kroku se podíváme na to, jak uživateli povolit nahrávání souborů ze svého počítače na server. V dalším kurzu obrátíme pozornost k integraci nahraného souboru s datovým modelem.
ASP.NET 2.0 s nový ovládací prvek FileUpload Web poskytuje uživatelům mechanismus pro odesílání souborů ze svého počítače na webový server. Ovládací prvek FileUpload se vykreslí jako <input>
prvek, jehož type
atribut je nastaven na soubor, který prohlížeče zobrazí jako textové pole s tlačítkem Procházet. Kliknutím na tlačítko Procházet se zobrazí dialogové okno, ze kterého může uživatel vybrat soubor. Když se formulář odešle zpět, odešle se spolu se zpětným odesláním obsah vybraného souboru. Na straně serveru jsou informace o nahraném souboru přístupné prostřednictvím vlastností ovládacího prvku FileUpload.
Pokud si chcete předvést nahrávání souborů, otevřete FileUpload.aspx
stránku ve BinaryData
složce, přetáhněte ovládací prvek FileUpload z panelu nástrojů do Designer a nastavte vlastnost ovládacího prvku s ID
na UploadTest
. Dále přidejte webový ovládací prvek Tlačítko, který nastaví jeho ID
vlastnosti a Text
na UploadButton
a Nahrát vybraný soubor v uvedeném pořadí. Nakonec umístěte ovládací prvek Label Web pod tlačítko, vymažte jeho Text
vlastnost a nastavte jeho ID
vlastnost na UploadDetails
.
Obrázek 12: Přidání ovládacího prvku FileUpload na stránku ASP.NET (kliknutím zobrazíte obrázek v plné velikosti)
Na obrázku 13 je tato stránka zobrazená v prohlížeči. Všimněte si, že kliknutím na tlačítko Procházet se zobrazí dialogové okno pro výběr souboru, které uživateli umožní vybrat soubor ze svého počítače. Po výběru souboru kliknutím na tlačítko Nahrát vybraný soubor dojde k zpětnému odeslání, které odešle vybraný binární obsah souboru na webový server.
Obrázek 13: Uživatel může vybrat soubor k nahrání ze svého počítače na server (kliknutím zobrazíte obrázek v plné velikosti).
Při zpětném odeslání lze nahraný soubor uložit do systému souborů nebo s jeho binárními daty pracovat přímo prostřednictvím Stream. V tomto příkladu ~/Brochures
vytvoříme složku a uložíme do ní nahraný soubor. Začněte přidáním Brochures
složky do webu jako podsložky kořenového adresáře. Dále vytvořte obslužnou rutinu UploadButton
události pro událost s Click
a přidejte následující kód:
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);
}
}
Ovládací prvek FileUpload poskytuje různé vlastnosti pro práci s nahranými daty. Vlastnost například označuje, HasFile
jestli uživatel nahrál soubor, zatímco FileBytes
vlastnost poskytuje přístup k nahraným binárním datům jako pole bajtů. Obslužná rutina Click
události začíná tím, že zajistí, že byl nahrán soubor. Pokud byl soubor nahraný, popisek zobrazí název nahraného souboru, jeho velikost v bajtech a jeho typ obsahu.
Poznámka
Pokud chcete zajistit, aby uživatel nahrál soubor, můžete zkontrolovat HasFile
vlastnost a zobrazit upozornění, pokud je false
, nebo můžete místo toho použít ovládací prvek RequiredFieldValidator .
FileUpload s SaveAs(filePath)
uloží nahraný soubor do zadaného filePath. filePath musí být fyzická cesta (C:\Websites\Brochures\SomeFile.pdf
), nikoli virtuálnícesta (/Brochures/SomeFile.pdf
). MetodaServer.MapPath(virtPath)
vezme virtuální cestu a vrátí odpovídající fyzickou cestu. Virtuální cesta je ~/Brochures/fileName
, kde fileName je název nahraného souboru. Další informace o virtuálních a fyzických cestách a použití Server.MapPath
najdete v tématu Metoda Server.MapPath.
Po dokončení obslužné Click
rutiny události chvíli otestujte stránku v prohlížeči. Klikněte na tlačítko Procházet, vyberte soubor z pevného disku a potom klikněte na tlačítko Nahrát vybraný soubor. Postback odešle obsah vybraného souboru na webový server, který pak před uložením souboru do ~/Brochures
složky zobrazí informace o souboru. Po nahrání souboru se vraťte do sady Visual Studio a klikněte na tlačítko Aktualizovat v Průzkumník řešení. Soubor, který jste právě nahráli, by se měl zobrazit ve složce ~/Brožury.
Obrázek 14: Soubor EvolutionValley.jpg
byl odeslán na webový server (kliknutím zobrazíte obrázek v plné velikosti)
Obrázek 15: EvolutionValley.jpg
Byl uložen do ~/Brochures
složky
Jemnosti s ukládáním nahraných souborů do systému souborů
Při ukládání souborů do systému souborů webového serveru je potřeba vyřešit několik drobných odlišností. Za prvé je tu otázka zabezpečení. Pokud chcete soubor uložit do systému souborů, kontext zabezpečení, ve kterém se spouští stránka ASP.NET, musí mít oprávnění k zápisu. Webový server ASP.NET Development Web Server běží v kontextu vašeho aktuálního uživatelského účtu. Pokud jako webový server používáte Internetovou informační službu (IIS) společnosti Microsoft, závisí kontext zabezpečení na verzi služby IIS a její konfiguraci.
Dalším problémem při ukládání souborů do systému souborů je pojmenování souborů. V současné době naše stránka ukládá všechny nahrané soubory do ~/Brochures
adresáře pod stejným názvem jako soubor na klientském počítači. Pokud uživatel A nahraje brožuru s názvem Brochure.pdf
, soubor se uloží jako ~/Brochure/Brochure.pdf
. Ale co když někdy později uživatel B nahraje jiný soubor brožury, který má stejný název souboru (Brochure.pdf
)? S kódem, který teď máme, se soubor A s uživatelem přepíše nahráním uživatele B.
Existuje několik technik pro řešení konfliktů názvů souborů. Jednou z možností je zakázat nahrání souboru, pokud už existuje soubor se stejným názvem. Při tomto přístupu se při pokusu uživatele B o nahrání souboru s názvem Brochure.pdf
systém soubor neuloží a místo toho zobrazí zprávu informující uživatele B, aby soubor přejmenoval a zkusil to znovu. Dalším přístupem je uložení souboru pomocí jedinečného názvu souboru, kterým může být globálně jedinečný identifikátor (GUID) nebo hodnota z odpovídajících sloupců primárního klíče záznamu databáze (za předpokladu, že je nahrávání přidružené k určitému řádku datového modelu). V dalším kurzu tyto možnosti prozkoumáme podrobněji.
Problémy související s velmi velkými objemy binárních dat
Tyto kurzy předpokládají, že zachycená binární data mají skromnou velikost. Práce s velmi velkými objemy binárních datových souborů, které jsou několik megabajtů nebo větší, přináší nové výzvy, které jsou nad rámec těchto kurzů. Například ve výchozím nastavení ASP.NET odmítne nahrání větší než 4 MB, i když to můžete nakonfigurovat pomocí elementu<httpRuntime>
v Web.config
souboru . Služba IIS má také vlastní omezení velikosti nahrávání souborů. Kromě toho může doba potřebná k nahrání velkých souborů překročit výchozích 110 sekund, ASP.NET počká na žádost. Při práci s velkými soubory také dochází k problémům s pamětí a výkonem.
Ovládací prvek FileUpload je pro nahrávání velkých souborů nepraktický. Vzhledem k tomu, že se obsah souboru odesílá na server, musí koncový uživatel trpělivě čekat, aniž by bylo potvrzeno, že nahrávání probíhá. Nejedná se ani tak o problém při práci s menšími soubory, které je možné nahrát během několika sekund, ale může to být problém při práci s většími soubory, které mohou trvat několik minut. Existuje řada ovládacích prvků pro nahrávání souborů třetích stran, které jsou vhodnější pro zpracování velkých nahrávání, a mnoho z těchto dodavatelů poskytuje indikátory průběhu a správce nahrávání ActiveX, které nabízejí mnohem dokonalejší uživatelské prostředí.
Pokud vaše aplikace potřebuje zpracovávat velké soubory, budete muset pečlivě prozkoumat výzvy a najít vhodná řešení pro vaše konkrétní potřeby.
Souhrn
Vytvoření aplikace, která potřebuje zachytávat binární data, přináší řadu problémů. V tomto kurzu jsme se seznámili s prvními dvěma způsoby: rozhodování o tom, kam se mají binární data ukládat, a umožnění uživateli nahrát binární obsah prostřednictvím webové stránky. V dalších třech kurzech se dozvíte, jak přidružit nahraná data k záznamu v databázi a jak zobrazit binární data vedle textových datových polí.
Všechno nejlepší na programování!
Další čtení
Další informace o tématech probíraných v tomto kurzu najdete v následujících zdrojích informací:
- Použití datových typů Large-Value
- Rychlé zprovoznění ovládacího prvku FileUpload
- Ovládací prvek serveru ASP.NET 2.0 FileUpload
- Tmavá stránka nahrávání souborů
O autorovi
Scott Mitchell, autor sedmi knih o ASP/ASP.NET a zakladatel 4GuysFromRolla.com, pracuje s webovými technologiemi Microsoftu od roku 1998. Scott pracuje jako nezávislý konzultant, školitel a spisovatel. Jeho nejnovější kniha je Sams Teach Yourself ASP.NET 2.0 in 24 Hours. Můžete ho zastihnout na mitchell@4GuysFromRolla.comadrese . nebo prostřednictvím jeho blogu, který najdete na adrese http://ScottOnWriting.NET.
Zvláštní poděkování
Tato série kurzů byla zkontrolována mnoha užitečnými recenzenty. Hlavními recenzenty pro tento kurz byly Teresa Murphy a Bernadette Leigh. Chtěli byste si projít své nadcházející články na webu MSDN? Pokud ano, dejte mi řádek na mitchell@4GuysFromRolla.com.
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu:Odeslat a zobrazit názory pro