Sdílet prostřednictvím


Nahrávání souborů (C#)

Scott Mitchell

Stáhnout PDF

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

Přidání ASP.NET stránek pro kurzy související s binárními daty

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.

Přidání uživatelského ovládacího prvku SectionLevelTutorialListing.ascx do Default.aspx

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

Mapa webu teď obsahuje položky pro kurz 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 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.

Binární data mohou být uložena v systému souborů nebo přímo v databázi.

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.jpgadrese , 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, BrochurePathkterý 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íBrochurePathsloupce doCategoriestabulky

V současné době tabulka Kategorie obsahuje pouze čtyři sloupce: CategoryID, CategoryName, Descriptiona 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+CategoriesS).

Přidání sloupce BrožuraPath do tabulky Kategorie

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žívalaPictureBrochurePathsloupce

V CategoriesDataTable současné době má DataColumn vrstva přístupu k datům (DAL) čtyři definice: CategoryID, CategoryName, Descriptiona 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 CategoriesTableAdaptermetodami načítání dat:

  • GetCategories()spustí hlavní dotaz TableAdapter a vrátí CategoryIDCategoryName, a Description pole všech záznamů v Categories tabulce. Hlavní dotaz se používá automaticky generovanými Insert metodami a Update metodami.
  • GetCategoryByCategoryID(categoryID)CategoryIDvrátí pole , CategoryNamea Description pole kategorie, jejichž CategoryID se rovná ID kategorie.
  • GetCategoriesAndNumberOfProducts() - vrátí CategoryIDhodnotu , CategoryNamea Description pole pro všechny záznamy v Categories 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í aPictureBrochurePath``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).

Vytvoření pojmenovaného obrázku DataColumn, jehož datový typ je System.Byte[]

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íPicturehodnotBrochurePathz 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.

Aktualizace seznamu sloupců v příkazu SELECT tak, aby vrátila také cestu k brožurě

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.

Výběr možnosti Použít příkazy SQL

Obrázek 8: Výběr možnosti Použít příkazy SQL (kliknutím zobrazíte obrázek s plnou velikostí)

Vzhledem k tomu, že dotaz vrátí záznam z tabulky Kategorie, zvolte SELECT, který vrací řádky.

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.

Zvolte názvy metod TableAdapter s.

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.

Návrhář datové sady obsahuje nové sloupce a metodu.

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.

Přidání ovládacího prvku FileUpload na stránku ASP.NET

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.

Uživatel může vybrat soubor, který chcete nahrát ze svého počítače na 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/fileNamevirtuá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.MapPathnaleznete 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.

Soubor EvolutionValley.jpg byl odeslán na webový server.

Obrázek 14: Soubor EvolutionValley.jpg byl odeslán na webový server (kliknutím zobrazíte obrázek s plnou velikostí)

EvolutionValley.jpg byla uložena do složky ~/Brožury.

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

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.