Nahrávání souborů (C#)
Scott Mitchell
Zjistěte, jak uživatelům povolit nahrávání binárních souborů (například dokumentů Wordu 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 obsahuje datové modely, které zaznamenávají textová i binární data. Web online seznamky může uživatelům umožnit nahrát obrázek, který se přidruží ke svému profilu. Web náboru může uživatelům umožnit nahrát svůj životopis jako dokument Microsoft Wordu nebo PDF.
Práce s binárními daty přidává novou sadu problémů. Musíme se rozhodnout, jak se binární data ukládají v aplikaci. Rozhraní použité 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í binárních dat přidružených k záznamu. V tomto kurzu a v dalších třech se podíváme, jak tyto výzvy přesunout. Na konci těchto kurzů jsme vytvořili plně funkční aplikaci, která přidruží k jednotlivým kategoriím obrázek a brožuru PDF. 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 umožnit uživatelům 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ěchtokurzch
Krok 1: Vytvoření práce s binárními datovými webovými stránkami
Než začneme zkoumat výzvy spojené s přidáváním podpory binárních dat, začněme chvilku vytvořením ASP.NET stránek v našem projektu webu, 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 přidružit každou stránku ke stránce předlohy Site.master
:
Default.aspx
FileUpload.aspx
DisplayOrDownloadData.aspx
UploadInDetailsView.aspx
UpdatingAndDeleting.aspx
Obrázek 1: Přidání ASP.NET stránek pro kurzy související s binárními daty
Stejně jako v ostatních složkách Default.aspx
se ve BinaryData
složce zobrazí seznam kurzů v jeho části. Vzpomeňte si, že SectionLevelTutorialListing.ascx
uživatelské řízení tuto funkci poskytuje. Proto tento uživatelský ovládací prvek přidáte Default.aspx
přetažením z Průzkumník řešení do návrhového zobrazení 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
si chvíli prohlédněte web kurzů prostřednictvím prohlížeče. Nabídka vlevo teď obsahuje položky pro kurzy Práce s binary Data.
Obrázek 3: Mapa webu teď obsahuje položky pro kurzy práce s binárními daty
Krok 2: Rozhodnutí o tom, kam se mají binární data ukládat
Binární data přidružená k datovému modelu aplikace mohou být uložena na jednom ze dvou míst: na 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 výhod a nevýhod 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 chceme rozšířit databázi Northwind tak, aby přidružila obrázek k jednotlivým produktům. Jednou z možností je uložit tyto soubory obrázků do systému souborů webového serveru a zaznamenat cestu v Products
tabulce. S tímto přístupem bychom ImagePath
přidali sloupec do Products
tabulky typu varchar(200)
, možná. 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 ~/Images/Tea.jpg
adrese , kde ~
představuje fyzickou cestu aplikace. To znamená, že pokud je web kořenový na fyzické cestě C:\Websites\Northwind\
, ~/Images/Tea.jpg
by byl ekvivalentní C:\Websites\Northwind\Images\Tea.jpg
. Po nahrání souboru obrázku bychom aktualizovali 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
tehdy, když jsme se rozhodli, že všechny obrázky produktů budou umístěny do složky aplikace Images
.
Hlavní výhody ukládání binárních dat v systému souborů jsou:
- Snadné implementace , protože brzy uvidíme, že ukládání a načítání binárních dat uložených přímo v databázi zahrnuje trochu 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í být navíc uvedena adresa URL pro tato data. Pokud se data nacházejí v systému souborů webového serveru, je adresa URL jednoduchá. Pokud jsou data uložená v databázi, je však 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 může být potřeba zpřístupnit jiným službám nebo aplikacím, které nemohou načíst data z databáze. Například obrázky přidružené k jednotlivým produktům mohou být také potřeba k dispozici uživatelům prostřednictvím ftp, v takovém případě bychom chtěli uložit binární data do systému souborů.
- Výkon , pokud jsou binární data uložená v systému souborů, poptávka a zahlcení sítě mezi databázovým serverem a webovým serverem bude menší než v případě, že jsou binární data uložená přímo v databázi.
Hlavní nevýhodou ukládání binárních dat do systému souborů je, že odděluje data od databáze. Pokud se záznam odstraní z Products
tabulky, přidružený soubor v systému souborů webového serveru se automaticky neodstraní. Musíme napsat další kód pro odstranění souboru nebo systém souborů se stane nepotřebným nepoužívaným, osamoceným souborům. Při zálohování databáze musíme také zajistit zálohování přidružených binárních dat v systému souborů. Přesun databáze na jinou lokalitu nebo server představuje podobné výzvy.
Binární data mohou být 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á lze v tomto sloupci uchovávat. Pokud si například chcete rezervovat maximálně 5 000 bajtů varbinary(5000)
; varbinary(MAX)
umožňuje maximální velikost úložiště přibližně 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 jsou zálohy nebo přesunutí databáze na jinou lokalitu nebo server. Odstranění záznamu také automaticky odstraní odpovídající binární data. Existují také drobné výhody ukládání binárních dat do databáze. 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 systému Microsoft SQL Server 2000 a starších verzích varbinary
měl datový typ maximální limit 8 000 bajtů. Pokud chcete uložit až 2 GB binárních dat, image
musí se místo toho použít datový typ . S přidáním MAX
v SYSTÉMU SQL Server 2005 je image
však datový typ zastaralý. Stále je podporována kvůli zpětné kompatibilitě, ale Společnost Microsoft oznámila, že image
datový typ bude odebrán v budoucí verzi SQL Serveru.
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 kategorii. Vzhledem k tomu, že databáze Northwind má své kořeny v Aplikaci Microsoft Access a dřívějších verzích SQL Serveru, je tento sloupec typu image
.
Pro účely tohoto kurzu a další tři 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 na systému souborů webového serveru, který lze použít k poskytnutí kvalitního tisku a přehledu kategorie.
Krok 3: PřidáníBrochurePath
sloupce doCategories
tabulky
V současné době tabulka Kategorie obsahuje pouze čtyři sloupce: CategoryID
, CategoryName
, Description
a Picture
. Kromě těchto polí musíme přidat nový, který bude odkazovat na brožuru kategorií (pokud existuje). Pokud chcete přidat tento sloupec, přejděte do Průzkumníka serveru, přejděte k podrobnostem tabulek, klikněte pravým tlačítkem myši na Categories
tabulku a zvolte Otevřít definici tabulky (viz obrázek 5). Pokud Průzkumníka serveru nevidíte, otevřete ho tak, že v nabídce Zobrazení vyberete možnost Průzkumník serveru nebo stisknete Ctrl+Alt+S.
Přidejte do tabulky nový varchar(200)
sloupec, který je pojmenovanýBrochurePath
, a klikněte NULL
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
BrochurePath
sloupce
V CategoriesDataTable
současné době má DataColumn
vrstva přístupu k datům (DAL) čtyři definice: CategoryID
, CategoryName
, Description
a NumberOfProducts
. Když jsme tuto datovou tabulku původně navrhli v kurzu Vytvoření vrstvy přístupu k datům, CategoriesDataTable
měly pouze první tři sloupce. NumberOfProducts
Tento sloupec byl přidán do hlavního seznamu/podrobností pomocí seznamu hlavních záznamů s odrážkami s kurzem 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. Naplní se CategoriesDataTable
třemi CategoriesTableAdapter
metodami načítání dat:
GetCategories()
spustí hlavní dotaz TableAdapter a vrátíCategoryID
CategoryName
, aDescription
pole všech záznamů vCategories
tabulce. Hlavní dotaz se používá automaticky generovanýmiInsert
metodami aUpdate
metodami.GetCategoryByCategoryID(categoryID)
CategoryID
vrátí pole ,CategoryName
aDescription
pole kategorie, jejichžCategoryID
se rovná ID kategorie.GetCategoriesAndNumberOfProducts()
- vrátíCategoryID
hodnotu ,CategoryName
aDescription
pole pro všechny záznamy vCategories
tabulce. Použije 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
tabulku Picture
nebo BrochurePath
sloupce, ani neposkytuje DataColumn
CategoriesDataTable
pro tato pole. Abychom mohli pracovat s obrázkem a BrochurePath
vlastnostmi, musíme je nejprve přidat do CategoriesDataTable
třídy a pak aktualizovat CategoriesTableAdapter
třídu tak, aby tyto sloupce vrátila.
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 myši na CategoriesDataTable
záhlaví, 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
. Z okno Vlastnosti nastavte DataColumn
vlastnost System.Byte[]
na DataType
(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 s plnou velikostí)
Přidejte do tabulky DataTable další DataColumn
a pojmete ji BrochurePath
pomocí výchozí DataType
hodnoty (System.String
).
VráceníPicture
hodnotBrochurePath
z objektu TableAdapter
S těmito dvěma DataColumn
přidány do CategoriesDataTable
, jsme připraveni aktualizovat CategoriesTableAdapter
. V hlavním dotazu TableAdapter jsme 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 BrochurePath
zpět a vytvořil další metodu načítání dat, která vrací konkrétní sloupec kategorií Picture
.
Chcete-li aktualizovat hlavní dotaz TableAdapter, klikněte pravým tlačítkem myši na CategoriesTableAdapter
záhlaví a zvolte možnost Konfigurovat z místní nabídky. Tím se zobrazí Průvodce konfigurací adaptéru tabulky, který jsme viděli v řadě minulých kurzů. Aktualizujte dotaz tak, aby se vrátil BrochurePath
zpět a klikněte na Dokončit.
Obrázek 7: Aktualizace seznamu sloupců v SELECT
příkazu tak, aby se vrátil BrochurePath
také (kliknutím zobrazíte obrázek s plnou velikostí)
Při použití ad hoc příkazů SQL pro TableAdapter, aktualizace seznamu sloupců v hlavním dotazu aktualizuje seznam sloupců pro všechny SELECT
metody dotazu v TableAdapter. To znamená GetCategoryByCategoryID(categoryID)
, že metoda byla aktualizována tak, aby vrátila BrochurePath
sloupec, což může být to, co jsme chtěli. Aktualizovala ale také seznam sloupců v GetCategoriesAndNumberOfProducts()
metodě, čímž se odebral poddotaz, který vrací počet produktů pro každou kategorii! Proto potřebujeme aktualizovat dotaz této metody SELECT
. Klikněte pravým tlačítkem myši 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í konkrétní hodnotu sloupce kategorie Picture
. Klikněte pravým tlačítkem myši na CategoriesTableAdapter
záhlaví a zvolte možnost Přidat dotaz a spusťte Průvodce konfigurací dotazu TableAdapter. První krok tohoto průvodce se nás zeptá, jestli chceme dotazovat data pomocí příkazu AD hoc SQL, nové uložené procedury nebo existující procedury. Vyberte Použít příkazy SQL a klikněte na Další. Vzhledem k tomu, že vrátíme řádek, zvolte select, který vrací řádky z druhého kroku.
Obrázek 8: Výběr možnosti Použít příkazy SQL (kliknutím zobrazíte obrázek s plnou velikostí)
Obrázek 9: Vzhledem k tomu, že dotaz vrátí záznam z tabulky Kategorie, zvolte SELECT, který vrací řádky (kliknutím zobrazíte obrázek s plnou velikostí).
V 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 volba názvu nové metody. Použijte FillCategoryWithBinaryDataByCategoryID
a GetCategoryWithBinaryDataByCategoryID
pro vyplnění datové tabulky a vrácení vzorů datových tabulek( v uvedeném pořadí). Dokončete průvodce kliknutím na Dokončit.
Obrázek 10: Volba názvů metod TableAdapter s (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 vrací data s jiným schématem než schéma hlavního dotazu. Stručně řečeno, průvodce uvádí, že hlavní dotaz GetCategories()
TableAdapter vrací jiné schéma než ten, který jsme právě vytvořili. Ale tohle je to, co chceme, abyste mohli tuto zprávu ignorovat.
Mějte také na paměti, že pokud používáte ad hoc příkazy SQL a použijete průvodce ke změně hlavního dotazu TableAdapter v určitém pozdějším bodě v čase, upraví GetCategoryWithBinaryDataByCategoryID
seznam sloupců příkazů metody SELECT
tak, aby zahrnoval pouze tyto sloupce z hlavního dotazu (to znamená, že odebere Picture
sloupec z dotazu). Pokud chcete sloupec vrátit Picture
, budete muset ručně aktualizovat seznam sloupců, 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
, tyto třídy v Typed DataSet Designer by měly vypadat jako snímek obrazovky na obrázku 11.
Obrázek 11: Návrhář datové sady obsahuje nové sloupce a metodu
Aktualizace vrstvy obchodní logiky (BLL)
Po aktualizaci DAL je vše, co zbývá, 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 často zadává tato data koncový uživatel. Aby mohl uživatel tyto informace zachytit, musí mít možnost nahrát soubor ze svého počítače na webový server. Nahraná data se pak musí integrovat 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 se podíváme na integraci nahraného souboru s datovým modelem.
ASP.NET 2.0 s nový ovládací prvek FileUpload Web poskytuje uživatelům mechanismus, jak odeslat 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 zobrazíte dialogové okno, ze kterého může uživatel vybrat soubor. Po odeslání formuláře zpět se odešle obsah vybraného souboru spolu s postbackem. Na straně serveru jsou informace o nahraném souboru přístupné prostřednictvím vlastností ovládacího prvku FileUpload.
Chcete-li 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 Návrháře a nastavte vlastnost ovládacího prvku ID
na UploadTest
. Dále přidejte ovládací prvek Web tlačítka, který nastaví jeho ID
a Text
vlastnosti na UploadButton
a nahraje 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)
Obrázek 13 znázorňuje tuto stránku při prohlížení v prohlížeči. Všimněte si, že po kliknutí 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. Jakmile je vybraný soubor, kliknutím na tlačítko Nahrát vybraný soubor způsobí zpětné odeslání binárního obsahu vybraného souboru na webový server.
Obrázek 13: Uživatel může vybrat soubor, který chcete nahrát ze svého počítače na server (kliknutím zobrazíte obrázek s plnou velikostí).
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 streamu. V tomto příkladu ~/Brochures
vytvoříme složku a uložíme nahraný soubor tam. Začněte tím, že do webu přidáte Brochures
složku jako podsložku 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 řadu vlastností pro práci s nahranými daty. Například vlastnost označuje, HasFile
zda byl soubor odeslán uživatelem, 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 se soubor nahraje. Pokud byl soubor nahraný, zobrazí popisek název nahraného souboru, jeho velikost v bajtech a jeho typ obsahu.
Poznámka:
Chcete-li 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é cesty filePath. FilePath musí být fyzická cesta (C:\Websites\Brochures\SomeFile.pdf
) místo virtuální cesty (/Brochures/SomeFile.pdf
). Metoda Server.MapPath(virtPath)
vezme virtuální cestu a vrátí odpovídající fyzickou cestu. Zde je ~/Brochures/fileName
virtuální cesta , kde fileName je název nahraného souboru. Další informace o virtuálních a fyzických cestách a použití Server.MapPath
naleznete 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 a 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 ~/Brochures
do 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 s plnou velikostí)
Obrázek 15: EvolutionValley.jpg
Bylo uloženo do ~/Brochures
složky
Drobné detaily při ukládání 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 úprav. Nejprve došlo k problému zabezpečení. Pokud chcete uložit soubor do systému souborů, musí mít kontext zabezpečení, pod kterým se spouští stránka ASP.NET, oprávnění k zápisu. Webový server pro vývoj ASP.NET běží v kontextu vašeho aktuálního uživatelského účtu. Pokud jako webový server používáte microsoft Internetová informační služba (IIS), kontext zabezpečení závisí na verzi služby IIS a jeho 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 se 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ž uživatel B později nahraje jiný soubor brožury, který bude mít stejný název souboru (Brochure.pdf
)? S kódem, který máme teď, se soubor User A přepíše na nahrání uživatele B.
Existuje řada technik pro řešení konfliktů názvů souborů. Jednou z možností je zakázat nahrávání souboru, pokud už existuje jeden se stejným názvem. Při tomto přístupu se uživatel B pokusí nahrát soubor s názvem Brochure.pdf
, systém neuloží jeho soubor a místo toho zobrazí zprávu informující uživatele B, aby soubor přejmenoval a zkuste to znovu. Dalším přístupem je uložení souboru pomocí jedinečného názvu souboru, což může být globálně jedinečný identifikátor (GUID) nebo hodnota z odpovídajících sloupců primárních klíčů záznamu databáze (za předpokladu, že nahrávání je přidružené k určitému řádku datového modelu). V dalším kurzu podrobněji prozkoumáme tyto možnosti.
Problémy spojené s velmi velkými objemy binárních dat
V těchto kurzech se předpokládá, že zachycená binární data jsou skromná. Práce s velmi velkými objemy binárních datových souborů, které jsou několik megabajtů nebo větších, 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ávání větší než 4 MB, i když to lze nakonfigurovat prostřednictvím elementu <httpRuntime>
v .Web.config
Služba IIS také omezuje vlastní velikost nahrávání souborů. Kromě toho může doba potřebná k nahrání velkých souborů překročit výchozí 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 velké nahrávání souborů nepraktický. Vzhledem k tomu, že se obsah souboru publikuje na server, musí koncový uživatel trpělivě počkat bez potvrzení, že jejich nahrávání probíhá. Nejedná se o tak velký problém při práci s menšími soubory, které se dají nahrát během několika sekund, ale může se jednat o problém při práci s většími soubory, které můžou trvat několik minut, než se nahrají. Existují různé ovládací prvky pro nahrávání souborů třetích stran, které jsou vhodnější pro zpracování velkých nahrávek a mnoho z těchto dodavatelů poskytuje indikátory průběhu a správce nahrávání ActiveX, které představují mnohem leštěnější 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.
Shrnutí
Vytvoření aplikace, která potřebuje zachytit binární data, přináší řadu problémů. V tomto kurzu jsme se seznámili s prvními dvěma způsoby: rozhodováním o tom, kam se mají binární data ukládat a umožnit 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 společně s textovými datovými poli.
Šťastné 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ů s velkými hodnotami
- Rychlé zprovoznění ovládacího prvku FileUpload
- Ovládací prvek serveru ASP.NET 2.0 FileUpload
- Tmavá strana nahrávání souborů
O autorovi
Scott Mitchell, autor sedmi knih ASP/ASP.NET a zakladatel 4GuysFromRolla.com, pracuje s webovými technologiemi Microsoftu od roku 1998. Scott pracuje jako nezávislý konzultant, trenér a spisovatel. Jeho nejnovější kniha je Sams Teach Yourself ASP.NET 2.0 za 24 hodin. Je dostupný na mitchell@4GuysFromRolla.comadrese . nebo prostřednictvím svého blogu, který lze najít na http://ScottOnWriting.NET.
Zvláštní díky
Tato série kurzů byla zkontrolována mnoha užitečnými recenzenty. Vedoucí hodnotící tohoto kurzu byli Teresa Murphy a Bernadette Leigh. Chcete si projít nadcházející články MSDN? Pokud ano, zahoďte mi řádek na mitchell@4GuysFromRolla.com.