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ů 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

Přidání stránek ASP.NET pro kurzy binárního Data-Related

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.

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

Mapa webu 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.

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

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

Přidání sloupce BrochurePath do tabulky Categories

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žívalaPicturesloupce aBrochurePath

Objekt CategoriesDataTable ve vrstvě dal (Data Access Layer) má aktuálně definované čtyři DataColumn objekty: CategoryID, CategoryName, Descriptiona 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í CategoryIDpole , CategoryNamea Description všech záznamů v tabulce Categories . Hlavním dotazem je to, co se používá automaticky generovanými Insert metodami a Update .
  • GetCategoryByCategoryID(categoryID)CategoryIDvrátí pole , CategoryNamea Description kategorie, jejíž CategoryID hodnota se rovná categoryID.
  • GetCategoriesAndNumberOfProducts() – vrátí CategoryIDpole , CategoryNamea Description pro všechny záznamy v tabulce Categories . 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 CategoriesDataTableDataColumn 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í aPictureBrochurePath``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).

Vytvořte objekt DataColumn Pojmenovaný obrázek, jehož datový typ je System.Byte[]

Obrázek 6: Vytvoření pojmenovaného DataColumnPicture , 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íPicturehodnot aBrochurePathz 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.

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

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

Vyberte možnost Použít příkazy SQL.

Obrázek 8: Výběr možnosti Použít příkazy SQL (kliknutím zobrazíte obrázek v plné velikosti)

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

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.

Zvolte názvy pro metody TableAdapter s

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 CategoriesTableAdaptertřídy by tyto třídy v Designer Typed DataSet měly vypadat jako na snímku obrazovky na obrázku 11.

Designer DataSet zahrnuje nové sloupce a metodu.

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.

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)

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.

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

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 v plné velikosti)

EvolutionValley.jpg byl uložen do složky ~/Brožury.

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.pdfsysté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.configsouboru . 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í:

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.