Megosztás a következőn keresztül:


Fájlok feltöltése (VB)

által Scott Mitchell

PDF letöltése

Megtudhatja, hogyan engedélyezheti a felhasználók számára, hogy bináris fájlokat (például Word- vagy PDF-dokumentumokat) töltsenek fel a webhelyre, ahol azok a kiszolgáló fájlrendszerében vagy az adatbázisban tárolhatók.

Bevezetés

Az eddig megvizsgált oktatóanyagok mindegyike kizárólag szöveges adatokkal dolgozott. Számos alkalmazás azonban olyan adatmodellekkel rendelkezik, amelyek szöveges és bináris adatokat is rögzítenek. Egy online társkereső webhely lehetővé teheti, hogy a felhasználók feltölthessenek egy képet, amely társítva van a profiljukkal. Egy toborzó webhely lehetővé teheti, hogy a felhasználók Microsoft Word- vagy PDF-dokumentumként töltsék fel az önéletrajzukat.

A bináris adatok használata új kihívásokat jelent. El kell döntenünk, hogy a bináris adatok hogyan legyenek tárolva az alkalmazásban. Az új rekordok beszúrásához használt felületet frissíteni kell, hogy a felhasználó feltölthesse a fájlt a számítógépéről, és további lépéseket kell tenni a rekordok társított bináris adatainak megjelenítéséhez vagy letöltéséhez. Ebben az oktatóanyagban és a következő háromban bemutatjuk, hogyan lehet ezeket a kihívásokat leküzdeni. Az oktatóanyagok végén egy teljesen működőképes alkalmazást hoztunk létre, amely egy kép- és PDF-brosúrát társít az egyes kategóriákhoz. Ebben a konkrét oktatóanyagban áttekintjük a bináris adatok tárolásának különböző módszereit, és bemutatjuk, hogyan engedélyezheti a felhasználók számára, hogy feltöltsék a fájlt a számítógépükről, és menthessék őket a webkiszolgáló fájlrendszerére.

Megjegyzés:

Az alkalmazás adatmodelljének részét képező bináris adatokat néha BLOB-nak is nevezik, amely a bináris nagyméretű OBject rövidítése. Ezekben az oktatóanyagokban úgy döntöttem, hogy a bináris adat kifejezést használom, noha a BLOB kifejezés szinonimája.

1. lépés: Bináris adatokkal foglalkozó weboldalak létrehozása

Mielőtt elkezdenénk megismerni a bináris adatok támogatásával kapcsolatos kihívásokat, először szánjunk egy kis időt arra, hogy létrehozzuk a ASP.NET lapokat a webhelyprojektben, amelyekre szükségünk lesz ehhez az oktatóanyaghoz és a következő háromhoz. Első lépésként adjon hozzá egy új mappát.BinaryData Ezután adja hozzá a következő ASP.NET lapokat a mappához, és mindenképpen társítsa az egyes lapokat a Site.master mesterlaphoz:

  • Default.aspx
  • FileUpload.aspx
  • DisplayOrDownloadData.aspx
  • UploadInDetailsView.aspx
  • UpdatingAndDeleting.aspx

A bináris Data-Related oktatóanyagok ASP.NET lapjainak hozzáadása

1. ábra: A bináris Data-Related oktatóanyagok ASP.NET lapjainak hozzáadása

A többi mappához Default.aspx hasonlóan a BinaryData mappában is a szakasz oktatóanyagai jelennek meg. Ne feledje, hogy a SectionLevelTutorialListing.ascx Felhasználói vezérlő biztosítja ezt a funkciót. Ezért húzza ezt a felhasználói vezérlőt a Megoldáskezelőből a lap tervezési nézetébe.

Adja hozzá a SectionLevelTutorialListing.ascx felhasználói vezérlőt a Default.aspx

2. ábra: Adja hozzá a SectionLevelTutorialListing.ascx felhasználói vezérlőt Default.aspx (kattintson ide a teljes méretű kép megtekintéséhez)

Végül adja hozzá ezeket a lapokat bejegyzésként a Web.sitemap fájlhoz. Pontosabban, adja hozzá a következő megjelölést a GridView továbbfejlesztése során <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>

A frissítés Web.sitemapután szánjon egy kis időt az oktatóanyagok webhelyének megtekintésére egy böngészőben. A bal oldali menü mostantól tartalmazza a Bináris adatokkal való munka oktatóanyagok elemeit.

A webhelytérkép mostantól bejegyzéseket tartalmaz a Bináris adatokkal való munka oktatóanyagokhoz

3. ábra: A webhelytérkép most már tartalmaz bejegyzéseket a bináris adatokkal kapcsolatos oktatóanyagok használatához

2. lépés: A bináris adatok tárolási helyének meghatározása

Az alkalmazás adatmodelljével társított bináris adatok két helyen tárolhatók: a webkiszolgáló fájlrendszerén az adatbázisban tárolt fájlra mutató hivatkozással; vagy közvetlenül az adatbázison belül (lásd a 4. ábrát). Minden megközelítésnek megvannak a maga előnyei és hátrányai, és részletesebb vitát érdemel.

Bináris adatok tárolhatók a fájlrendszerben vagy közvetlenül az adatbázisban

4. ábra: Bináris adatok tárolhatók a fájlrendszerben vagy közvetlenül az adatbázisban (ide kattintva megtekintheti a teljes méretű képet)

Tegyük fel, hogy ki szeretnénk terjeszteni a Northwind-adatbázist, hogy minden termékhez társítsunk egy képet. Az egyik lehetőség az lenne, ha ezeket a képfájlokat a webkiszolgáló fájlrendszerében tárolná, és rögzítené az elérési utat a Products táblában. Ezzel a módszerrel talán egy oszlopot ImagePath adnánk hozzá a Products típustáblához varchar(200). Amikor egy felhasználó feltöltött egy képet Chai számára, előfordulhat, hogy a kép a webkiszolgáló fájlrendszerében ~/Images/Tea.jpglesz tárolva, ahol ~ az alkalmazás fizikai elérési útja látható. Vagyis ha a webhely a fizikai útvonalon C:\Websites\Northwind\gyökerezik, ~/Images/Tea.jpg az egyenértékű lenne a következőval C:\Websites\Northwind\Images\Tea.jpg: . A képfájl feltöltése után frissítjük a chai rekordot a Products táblában, hogy az oszlop hivatkozzon ImagePath az új kép elérési útjára. Használhatnánk ~/Images/Tea.jpg vagy csak Tea.jpg, ha úgy döntenénk, hogy az összes termékkép az alkalmazás Images mappájába kerül.

A bináris adatok fájlrendszeren való tárolásának fő előnyei a következők:

  • A rövidesen látható egyszerű megvalósításhoz a közvetlenül az adatbázisban tárolt bináris adatok tárolása és beolvasása egy kicsit több kódot igényel, mint amikor a fájlrendszeren keresztül dolgozik az adatokkal. Emellett ahhoz, hogy a felhasználó megtekinthesse vagy letölthesse a bináris adatokat, meg kell jelenítenie az adatok URL-címét. Ha az adatok a webkiszolgáló fájlrendszerén találhatók, az URL-cím egyszerű. Ha azonban az adatokat az adatbázisban tárolják, létre kell hozni egy weblapot, amely lekéri és visszaadja az adatokat az adatbázisból.
  • A bináris adatokhoz való szélesebb körű hozzáféréshez előfordulhat, hogy a bináris adatoknak más szolgáltatások vagy alkalmazások számára is elérhetőnek kell lenniük, amelyek nem tudják lekérni az adatokat az adatbázisból. Előfordulhat például, hogy az egyes termékekhez társított képeknek FTP-n keresztül is elérhetővé kell lenniük a felhasználóknak, ebben az esetben a bináris adatokat a fájlrendszerben szeretnénk tárolni.
  • Ha a bináris adatokat a fájlrendszer tárolja, az adatbázis-kiszolgáló és a webkiszolgáló közötti kereslet és hálózati torlódás kisebb lesz, mint ha a bináris adatokat közvetlenül az adatbázisban tárolják.

A bináris adatok fájlrendszeren való tárolásának fő hátránya, hogy leválasztja az adatokat az adatbázisról. Ha a rendszer töröl egy rekordot a Products táblából, a webkiszolgáló fájlrendszerében lévő társított fájl nem törlődik automatikusan. További kódot kell írnunk a fájl törléséhez, vagy a fájlrendszer nem használt, árva fájlokkal lesz zsúfolt. Ezenkívül az adatbázis biztonsági mentésekor gondoskodni kell arról, hogy a társított bináris adatokról is készítsen biztonsági másolatot a fájlrendszeren. Az adatbázis másik helyre vagy kiszolgálóra való áthelyezése hasonló kihívásokkal jár.

A bináris adatok közvetlenül a Microsoft SQL Server 2005-adatbázisban is tárolhatók egy típusoszlop varbinarylétrehozásával. Más változóhosszúságú adattípusokhoz hasonlóan megadhatja az oszlopban tárolható bináris adatok maximális hosszát. Például, ha legfeljebb 5000 bájtot szeretne lefoglalni, használja a varbinary(5000)-t; a varbinary(MAX) lehetővé teszi a maximális tárolási méretet, amely körülbelül 2 GB.

A bináris adatok közvetlenül az adatbázisban való tárolásának fő előnye a bináris adatok és az adatbázisrekord szoros összekapcsolása. Ez jelentősen leegyszerűsíti az adatbázis-adminisztrációs feladatokat, például biztonsági mentéseket vagy az adatbázis másik helyre vagy kiszolgálóra való áthelyezését. Emellett a rekordok törlése automatikusan törli a megfelelő bináris adatokat. A bináris adatok adatbázisban való tárolásának is vannak finomabb előnyei.

Megjegyzés:

A Microsoft SQL Server 2000-es és korábbi verzióiban az varbinary adattípus maximális mérete 8000 bájt volt. Legfeljebb 2 GB bináris adat tárolásához inkább az image adattípust kell használni. Az SQL Server 2005-ben történt MAX hozzáadásával azonban az image adattípus elavulttá vált. A visszamenőleges kompatibilitás továbbra is támogatott, de a Microsoft bejelentette, hogy az image adattípus az SQL Server egy későbbi verziójában törlődik.

Ha régebbi adatmodellel dolgozik, láthatja az adattípust image . A Northwind-adatbázis táblája Categories egy Picture oszlopot tartalmaz, amely a kategória képfájljainak bináris adatainak tárolására használható. Mivel a Northwind-adatbázis a Microsoft Accessben és az SQL Server korábbi verzióiban gyökerezik, ez az oszlop típus.image

Ebben az oktatóanyagban és a következő háromban mindkét módszert használjuk. A Categories táblázat már rendelkezik egy Picture oszlopmal a kategória képének bináris tartalmának tárolására. Hozzáadunk egy további oszlopot, BrochurePathamely egy PDF-fájl elérési útját tárolja a webkiszolgáló fájlrendszerén, amely a kategória nyomtatási minőségű, letisztult áttekintéséhez használható.

3. lépés: AzBrochurePathoszlop hozzáadása aCategoriestáblához

A Kategóriák tábla jelenleg csak négy oszlopból áll: CategoryID, CategoryName, Descriptionés Picture. Ezen mezők mellett egy újat kell hozzáadnunk, amely a kategória brosúrára mutat (ha van ilyen). Az oszlop hozzáadásához nyissa meg a Kiszolgálókezelőt, részletezse le a táblákat, kattintson a jobb gombbal a táblára, és válassza a Categories Tábladefiníció megnyitása parancsot (lásd az 5. ábrát). Ha nem látja a Kiszolgálókezelőt, a Nézet menüBen válassza a Kiszolgálókezelő lehetőséget, vagy nyomja le a Ctrl+Alt+S billentyűkombinációt.

Adjon hozzá egy új varchar(200) oszlopot a Categories táblához, amely el van nevezve BrochurePath, és engedélyezi NULL elemeket, majd a Mentés ikonra kattintva mentse el (vagy nyomja meg a Ctrl+S billentyűket).

BrosúraPath oszlop hozzáadása a Kategóriák táblához

5. ábra: Oszlop hozzáadása BrochurePath a Categories táblázathoz (ide kattintva megtekintheti a teljes méretű képet)

4. lépés: Az architektúra frissítése a Picture és BrochurePath oszlopok használatára

Az CategoriesDataTable adatelérési rétegben (DAL) jelenleg négy DataColumn van definiálva: CategoryID, CategoryName, Description, és NumberOfProducts. Amikor eredetileg ezt a DataTable-t az Adatelérési réteg létrehozása oktatóanyagban terveztük meg, csak az első három oszlop szerepelt benne; a CategoriesDataTable oszlop hozzáadásra került a NumberOfProducts.

Az adatelérési réteg létrehozása során ismertetett módon a Gépelt adathalmaz adattáblái alkotják az üzleti objektumokat. A TableAdapters feladata az adatbázissal való kommunikáció és az üzleti objektumok lekérdezési eredményekkel való feltöltése. Az CategoriesDataTable adatokat a CategoriesTableAdapterhárom adatlekérési metódus tölti ki:

  • GetCategories() végrehajtja a TableAdapter fő lekérdezését, és visszaadja a CategoryIDtábla összes rekordjának , CategoryNameés Description mezőit Categories . A fő lekérdezés az automatikusan létrehozott Insert és Update metódusok által használt lekérdezés.
  • GetCategoryByCategoryID(categoryID) annak a kategóriának a CategoryID, CategoryNameés Description mezőit adja vissza, amelynek CategoryID a kategóriaazonosítója egyenlő.
  • GetCategoriesAndNumberOfProducts() - visszaadja a CategoryID táblában az összes rekord CategoryName, Description és Categories mezőjét. Emellett egy al lekérdezéssel adja vissza az egyes kategóriákhoz társított termékek számát.

Figyelje meg, hogy ezek közül a lekérdezések közül egyik sem adja vissza az Categories tábla Picture s BrochurePath oszlopait, és a CategoriesDataTable sem biztosítja a DataColumn-t ezekhez a mezőkhöz. A kép és BrochurePath tulajdonságainak használatához először hozzá kell adnunk őket a CategoriesDataTable-hoz, majd frissíteni kell a CategoriesTableAdapter osztályt, hogy visszatérjenek ezek az oszlopok.

PictureAz és s hozzáadásaBrochurePath``DataColumn

Először vegye fel ezt a két oszlopot a CategoriesDataTable. Kattintson a jobb gombbal az CategoriesDataTable s fejlécre, válassza a Helyi menü Hozzáadás elemét, majd válassza az Oszlop lehetőséget. Ez létrehoz egy új DataColumn a DataTable-ben, amelyet Column1-nek neveznek. Nevezze át ezt az oszlopot a névre Picture A Tulajdonságok ablakban állítsa be az DataColumn s DataType tulajdonságot System.Byte[] (ez nem szerepel a legördülő listában, be kell gépelnie).

DataColumn nevű kép létrehozása, amelynek DataType értéke System.Byte[]

6. ábra: Hozzon létre egy DataColumn nevű Picture, amelynek DataTypeSystem.Byte[] (kattintson ide a teljes méretű kép megtekintéséhez)

Adjon hozzá egy újabb DataColumn elemet a DataTable-hoz, és nevezze el BrochurePath az alapértelmezett DataType (System.String) értéket használva.

A Picture és BrochurePath értékek visszaadása a TableAdapterből

Ezzel a két DataColumn elemet hozzáadtuk a CategoriesDataTablefájlhoz, készen állunk a frissítésre CategoriesTableAdapter. Mindkét oszlopérték visszaadható a TableAdapter fő lekérdezésében, de ez minden alkalommal visszahozza a bináris adatokat, amikor a GetCategories() metódust meghívták. Ehelyett frissítse a fő TableAdapter-lekérdezést, hogy visszahozza BrochurePath , és hozzon létre egy további adatlekérési módszert, amely egy adott kategória s Picture oszlopát adja vissza.

A TableAdapter fő lekérdezésének frissítéséhez kattintson a jobb gombbal az CategoriesTableAdapter s fejlécre, és válassza a Konfigurálás lehetőséget a helyi menüből. Ekkor megjelenik a Táblaadapter konfigurációs varázslója, amelyet számos korábbi oktatóanyagban láthattunk. Frissítse a lekérdezést, hogy visszahozza a BrochurePath, és kattintson a Befejezés gombra.

Frissítse a SELECT utasítás oszloplistáját, hogy a BrochurePath is szerepeljen benne

7. ábra: Az utasítás SELECT oszloplistájának frissítése és az BrochurePath visszaadása (ide kattintva megtekintheti a teljes méretű képet)

Ha alkalmi SQL-utasításokat használ a TableAdapterhez, a fő lekérdezés oszloplistájának frissítése frissíti az oszloplistát a SELECT TableAdapter összes lekérdezési metódusához. Ez azt jelenti, hogy a GetCategoryByCategoryID(categoryID) metódus frissült, hogy visszaadja az BrochurePath oszlopot, ami lehet, hogy az, amit terveztünk. Azonban a metódus oszloplistáját GetCategoriesAndNumberOfProducts() is frissítette, így eltávolította a részlekérdezést, amely az egyes kategóriákhoz tartozó termékek számát adja vissza! Ezért frissíteni kell ezt a metódus lekérdezését SELECT . Kattintson a jobb gombbal a metódusra, válassza a GetCategoriesAndNumberOfProducts() Konfigurálás lehetőséget, és állítsa vissza a lekérdezést az SELECT eredeti értékére:

SELECT CategoryID, CategoryName, Description, 
       (SELECT COUNT(*) 
            FROM Products p 
            WHERE p.CategoryID = c.CategoryID) 
       as NumberOfProducts
FROM Categories c

Ezután hozzon létre egy új TableAdapter metódust, amely egy adott kategória oszlopértékét Picture adja vissza. Kattintson a jobb gombbal az CategoriesTableAdapter s fejlécre, és válassza a Lekérdezés hozzáadása lehetőséget a TableAdapter Lekérdezéskonfiguráció varázsló elindításához. A varázsló első lépése megkérdezi, hogy egy alkalmi SQL-utasítással, egy új tárolt eljárással vagy egy meglévővel szeretnénk-e adatokat lekérdezni. Válassza az SQL-utasítások használata lehetőséget, és kattintson a Tovább gombra. Mivel egy sort adunk vissza, válassza a SELECT lehetőséget, amely a második lépésben adja vissza a sorokat.

Válassza az SQL-utasítások használata lehetőséget

8. ábra: Válassza az SQL-utasítások használata lehetőséget (kattintson ide a teljes méretű kép megtekintéséhez)

Mivel a lekérdezés egy rekordot ad vissza a Kategóriák táblából, válassza a SELECT lehetőséget, amely sorokat ad vissza

9. ábra: Mivel a lekérdezés egy rekordot ad vissza a Kategóriák táblából, válassza a SELECT lehetőséget, amely sorokat ad vissza (kattintson ide a teljes méretű kép megtekintéséhez)

A harmadik lépésben adja meg a következő SQL-lekérdezést, és kattintson a Tovább gombra:

SELECT     CategoryID, CategoryName, Description, BrochurePath, Picture
FROM       Categories
WHERE      CategoryID = @CategoryID

Az utolsó lépés az új metódus nevének kiválasztása. Használja a FillCategoryWithBinaryDataByCategoryID a DataTable kitöltési mintájához, és a GetCategoryWithBinaryDataByCategoryID a DataTable visszaadási mintájához. A varázsló befejezéséhez kattintson a Befejezés gombra.

A TableAdapter metódusok neveinek kiválasztása

10. ábra: Válassza ki a TableAdapter metódusok nevét (kattintson ide a teljes méretű kép megtekintéséhez)

Megjegyzés:

A Táblaadapter lekérdezéskonfiguráció varázslójának befejezése után megjelenhet egy párbeszédpanel, amely tájékoztatja, hogy az új parancsszöveg a fő lekérdezés sémájától eltérő sémával rendelkező adatokat ad vissza. Röviden: a varázsló megjegyzi, hogy a TableAdapter fő lekérdezése GetCategories() egy másik sémát ad vissza, mint amit most hoztunk létre. De ezt akarjuk, ezért figyelmen kívül hagyhatja ezt az üzenetet.

Ne feledje azt is, hogy ha alkalmi SQL-utasításokat használ, és a varázslóval egy későbbi időpontban módosítja a TableAdapter fő lekérdezését, a metódus s GetCategoryWithBinaryDataByCategoryID utasítás oszloplistáját úgy módosítjaSELECT, hogy csak azokat az oszlopokat tartalmazza a fő lekérdezésből (vagyis eltávolítja az Picture oszlopot a lekérdezésből). Manuálisan frissítenie kell az oszloplistát, hogy visszaadja az Picture oszlopot, hasonlóan ahhoz, amit a lépés korábbi szakaszában a GetCategoriesAndNumberOfProducts() metódussal tettünk.

Miután a két DataColumn-t hozzáadta a CategoriesDataTable-hez és a GetCategoryWithBinaryDataByCategoryID metódust a CategoriesTableAdapter-hoz, a Typed DataSet Designerben ezeknek az osztályoknak úgy kell kinézniük, mint a 11. ábrán szereplő képernyőkép.

Az Adatkészlet-tervező tartalmazza az új oszlopokat és metódusokat

11. ábra: Az adathalmaz-tervező tartalmazza az új oszlopokat és metódusokat

Az üzleti logikai réteg (BLL) frissítése

A DAL frissítése után már csak az marad hátra, hogy bővítse az üzleti logikai réteget (BLL), hogy egy metódust is tartalmazzon az új CategoriesTableAdapter metódushoz. Adja hozzá a következő metódust a CategoriesBLL osztályhoz:

<System.ComponentModel.DataObjectMethodAttribute _
    (System.ComponentModel.DataObjectMethodType.Select, False)> _
Public Function GetCategoryWithBinaryDataByCategoryID(categoryID As Integer) _
    As Northwind.CategoriesDataTable
    
    Return Adapter.GetCategoryWithBinaryDataByCategoryID(categoryID)
End Function

5. lépés: Fájl feltöltése az ügyfélről a webkiszolgálóra

Bináris adatok gyűjtésekor gyakran a végfelhasználók adják meg ezeket az adatokat. Az információk rögzítéséhez a felhasználónak képesnek kell lennie fájl feltöltésére a számítógépről a webkiszolgálóra. A feltöltött adatokat ezután integrálnia kell az adatmodellel, ami azt jelentheti, hogy menti a fájlt a webkiszolgáló fájlrendszerébe, és hozzáad egy elérési utat a fájlhoz az adatbázisban, vagy közvetlenül az adatbázisba írja a bináris tartalmat. Ebben a lépésben azt vizsgáljuk meg, hogyan engedélyezheti a felhasználónak, hogy fájlokat töltsön fel a számítógépéről a kiszolgálóra. A következő oktatóanyagban arra fordítjuk a figyelmünket, hogy integráljuk a feltöltött fájlt az adatmodellel.

ASP.NET 2.0-s új FileUpload webvezérlő lehetővé teszi, hogy a felhasználók fájlokat küldjenek a számítógépükről a webkiszolgálóra. A FileUpload vezérlő olyan <input> elemként jelenik meg, amelynek type attribútuma fájlra van állítva, amely a böngészők szövegmezőként jelenik meg a Tallózás gombbal. A Tallózás gombra kattintva megjelenik egy párbeszédpanel, amelyből a felhasználó kiválaszthat egy fájlt. Az űrlap visszaküldése után a rendszer elküldi a kijelölt fájl tartalmát a postbacktel együtt. A kiszolgálóoldalon a feltöltött fájl adatai a FileUpload vezérlő tulajdonságain keresztül érhetők el.

A fájlok feltöltésének bemutatásához nyissa meg a FileUpload.aspx lapot a BinaryData mappában, húzzon egy FileUpload vezérlőt az Eszközkészletből a Tervezőbe, és állítsa a vezérlő tulajdonságát ID a következőre UploadTest: . Ezután adjon hozzá egy gomb webvezérlőt, és állítsa be annak ID és Text tulajdonságait a UploadButton és a "Kijelölt fájl feltöltése" értékre. Végül helyezzen el egy Címke webes vezérlőelemet a gomb alá, törölje a Text tulajdonságát és állítsa be a ID tulajdonságot UploadDetails értékre.

FileUpload vezérlőelem hozzáadása a ASP.NET laphoz

12. ábra: Fájlbetöltési vezérlő hozzáadása a ASP.NET laphoz (ide kattintva megtekintheti a teljes méretű képet)

A 13. ábrán ez a lap jelenik meg, ha egy böngészőben tekinti meg. Vegye figyelembe, hogy a Tallózás gombra kattintva megjelenik egy fájlkijelölési párbeszédpanel, amellyel a felhasználó kiválaszthat egy fájlt a számítógépéről. Miután kiválasztott egy fájlt, a Kijelölt fájl feltöltése gombra kattintva visszakerül a kijelölt fájl bináris tartalma a webkiszolgálóra.

A felhasználó kiválaszthatja a számítógépről a kiszolgálóra feltölteni kívánt fájlt

13. ábra: A felhasználó kiválaszthatja a számítógépről a kiszolgálóra feltöltendő fájlt (ide kattintva megtekintheti a teljes méretű képet)

Postback esetén a feltöltött fájl menthető a fájlrendszerbe, vagy bináris adatai közvetlenül a Streamen keresztül is használhatók. Ebben a példában hozzunk létre egy ~/Brochures mappát, és mentsük oda a feltöltött fájlt. Kezdje azzal, hogy a Brochures mappát a webhely gyökérkönyvtárának almappájaként felveszi. Ezután hozzon létre egy eseménykezelőt az UploadButton s Click eseményhez, és adja hozzá a következő kódot:

Protected Sub UploadButton_Click(sender As Object, e As EventArgs) _
    Handles UploadButton.Click
    
    If UploadTest.HasFile = False Then
        ' 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
        Dim filePath As String = _
            Server.MapPath("~/Brochures/" & UploadTest.FileName)
        UploadTest.SaveAs(filePath)
    End If
End Sub

A FileUpload vezérlő számos tulajdonságot biztosít a feltöltött adatok kezeléséhez. A tulajdonság például azt jelzi, HasFile hogy a felhasználó feltöltött-e egy fájlt, míg a FileBytes tulajdonság bájttömbként biztosít hozzáférést a feltöltött bináris adatokhoz. Az Click eseménykezelő a fájl feltöltésének biztosításával kezdődik. Ha feltöltöttek egy fájlt, a Címke a feltöltött fájl nevét, bájtban megadott méretét és tartalomtípusát jeleníti meg.

Megjegyzés:

Annak érdekében, hogy a felhasználó feltöltsön egy fájlt, ellenőrizheti a HasFile tulajdonságot, és figyelmeztetést jeleníthet meg, ha igen False, vagy használhatja helyette a RequiredFieldValidator vezérlőt .

A FileUpload s SaveAs(filePath) a feltöltött fájlt a megadott filePath fájlba menti. A filePathnakfizikai elérési útnak (C:\Websites\Brochures\SomeFile.pdf) kell lennie, nem pedig virtuáliselérési útnak (/Brochures/SomeFile.pdf). A Server.MapPath(virtPath) metódus egy virtuális útvonalat használ, és visszaadja annak megfelelő fizikai elérési útját. Itt a virtuális elérési út az ~/Brochures/fileName, ahol a fileName a feltöltött fájl neve. A virtuális és fizikai elérési utakról és a használatról további információt a Server.MapPath MethosbanServer.MapPathtalál.

Az eseménykezelő befejezése Click után szánjon egy kis időt az oldal tesztelésére egy böngészőben. Kattintson a Tallózás gombra, és válasszon ki egy fájlt a merevlemezről, majd kattintson a Kijelölt fájl feltöltése gombra. A postback elküldi a kijelölt fájl tartalmát a webkiszolgálónak, amely ezután megjeleníti a fájl adatait, mielőtt a ~/Brochures mappába mentené. A fájl feltöltése után térjen vissza a Visual Studióba, és kattintson a Megoldáskezelő Frissítés gombjára. Látnia kell az imént feltöltött fájlt a ~/Brosúrák mappában!

A fájl EvolutionValley.jpg fel lett töltve a webkiszolgálóra

14. ábra: A fájl EvolutionValley.jpg feltöltve lett a webkiszolgálóra (ide kattintva megtekintheti a teljes méretű képet)

EvolutionValley.jpg a ~/Brosúrák mappába lett mentve

15. ábra: EvolutionValley.jpg A mappába ~/Brochures lett mentve

Finomságok a feltöltött fájlok fájlrendszerbe való mentésével

A fájlok webkiszolgáló fájlrendszerbe való mentésekor számos apróságra kell megoldást találni. Először is, itt van a biztonsági probléma. Ha fájlokat szeretne menteni a fájlrendszerbe, annak a biztonsági környezetnek, amelyben a ASP.NET lap fut, írási engedélyekkel kell rendelkeznie. A ASP.NET fejlesztői webkiszolgáló az aktuális felhasználói fiók környezetében fut. Ha a Microsoft Internet Information Servicest (IIS) használja webkiszolgálóként, a biztonsági környezet az IIS verziójától és konfigurációjától függ.

A fájlok fájlrendszerbe való mentésének egy másik kihívása a fájlok elnevezése körül forog. Jelenleg a lap az összes feltöltött fájlt a könyvtárba ~/Brochures menti ugyanazzal a névvel, mint az ügyfél számítógépén lévő fájl. Ha az A felhasználó feltölt egy brosúrát a névvel Brochure.pdf, a fájl a következőképpen lesz mentve ~/Brochure/Brochure.pdf. De mi történik, ha valamikor később a B felhasználó feltölt egy másik brosúrát, amely történetesen ugyanazzal a fájlnévvel (Brochure.pdf)? A most már megadott kóddal az A felhasználó fájlja felülíródik a B felhasználó feltöltésével.

A fájlnévütközések feloldására számos technika létezik. Az egyik lehetőség a fájl feltöltésének tiltása, ha már létezik ilyen nevű fájl. Ezzel a módszerrel, amikor a B felhasználó megpróbál feltölteni egy nevű Brochure.pdffájlt, a rendszer nem menti a fájlt, hanem egy üzenetet jelenít meg, amely tájékoztatja a B felhasználót a fájl átnevezéséről, majd próbálkozzon újra. Egy másik módszer a fájl mentése egyedi fájlnévvel, amely lehet globálisan egyedi azonosító (GUID) vagy a megfelelő adatbázisrekord elsődleges kulcsoszlopa(i) értéke (feltéve, hogy a feltöltés az adatmodell egy adott sorához van társítva). A következő oktatóanyagban részletesebben is bemutatjuk ezeket a lehetőségeket.

Nagyon nagy mennyiségű bináris adattal kapcsolatos kihívások

Ezek az oktatóanyagok feltételezik, hogy a rögzített bináris adatok mérete szerény. A sok megabájtos vagy nagyobb bináris adatfájlok használata új kihívásokat jelent, amelyek túlmutatnak ezen oktatóanyagok hatókörén. Alapértelmezés szerint az ASP.NET elutasítja a 4 MB-nál nagyobb feltöltéseket, bár ez a <httpRuntime> elem segítségével Web.config konfigurálható. Az IIS saját fájlfeltöltési méretkorlátozásokat is alkalmaz. Ezenkívül a nagyméretű fájlok feltöltéséhez szükséges idő meghaladhatja az alapértelmezett 110 másodpercet, ASP.NET várni fog egy kérésre. A nagyméretű fájlok használatakor memória- és teljesítményproblémák is jelentkeznek.

A FileUpload vezérlő nem praktikus a nagy méretű fájlfeltöltésekhez. Mivel a fájl tartalma a kiszolgálóra kerül, a végfelhasználónak türelmesen kell várnia anélkül, hogy megerősítést kap a feltöltés előrehaladásáról. Ez nem annyira probléma, ha kisebb, néhány másodperc alatt feltölthető fájlokat kezel, de probléma lehet a nagyobb fájlok kezelésekor, amelyek feltöltése perceket vehet igénybe. Számos külső fájlfeltöltési vezérlő létezik, amelyek jobban alkalmasak a nagy méretű feltöltések kezelésére, és ezek közül sok szállító előrehaladási mutatókat és ActiveX-feltöltési kezelőket biztosít, amelyek sokkal kifinomultabb felhasználói élményt nyújtanak.

Ha az alkalmazásnak nagy méretű fájlokat kell kezelnie, gondosan meg kell vizsgálnia a kihívásokat, és megfelelő megoldásokat kell találnia az adott igényekhez.

Összefoglalás

A bináris adatok rögzítésére szolgáló alkalmazások létrehozása számos kihívást jelent. Ebben az oktatóanyagban az első kettőt ismertettük: a bináris adatok tárolásának helyének eldöntését és a bináris tartalmak weblapon keresztüli feltöltésének engedélyezését. A következő három oktatóanyagban látni fogjuk, hogyan társíthatja a feltöltött adatokat egy rekordhoz az adatbázisban, és hogyan jelenítheti meg a bináris adatokat a szöveges adatmezők mellett.

Boldog programozást!

További olvasás

Az oktatóanyagban tárgyalt témakörökről az alábbi forrásokban talál további információt:

Tudnivalók a szerzőről

Scott Mitchell, hét ASP/ASP.NET-könyv szerzője és a 4GuysFromRolla.com alapítója, 1998 óta dolgozik a Microsoft webtechnológiáival. Scott független tanácsadóként, edzőként és íróként dolgozik. Legújabb könyve Sams Teach Yourself ASP.NET 2.0 24 óra alatt. Ő itt elérhető mitchell@4GuysFromRolla.com.

Külön köszönet

Ezt az oktatóanyag-sorozatot sok hasznos véleményező áttekintette. Az oktatóanyag vezető véleményezői Teresa Murphy és Bernadette Leigh voltak. Szeretné áttekinteni a közelgő MSDN-cikkeimet? Ha igen, írj egy sort a mitchell@4GuysFromRolla.com-ra.