Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
által Scott Mitchell
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
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.
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.sitemap
utá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.
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.
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.jpg
lesz 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 varbinary
lé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. Részletesebb ismertetésért tekintse meg a bináris fájlok közvetlenül az adatbázisban való tárolását a ASP.NET 2.0 használatával.
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, BrochurePath
amely 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: AzBrochurePath
oszlop hozzáadása aCategories
tá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).
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 CategoriesTableAdapter
három adatlekérési metódus tölti ki:
-
GetCategories()
végrehajtja a TableAdapter fő lekérdezését, és visszaadja aCategoryID
tábla összes rekordjának ,CategoryName
ésDescription
mezőitCategories
. A fő lekérdezés az automatikusan létrehozottInsert
ésUpdate
metódusok által használt lekérdezés. -
GetCategoryByCategoryID(categoryID)
annak a kategóriának aCategoryID
,CategoryName
ésDescription
mezőit adja vissza, amelynekCategoryID
a kategóriaazonosítója egyenlő. -
GetCategoriesAndNumberOfProducts()
- visszaadja aCategoryID
táblában az összes rekordCategoryName
,Description
ésCategories
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.
Picture
Az é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).
6. ábra: Hozzon létre egy DataColumn
nevű Picture
, amelynek DataType
System.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 CategoriesDataTable
fá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.
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.
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)
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.
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.
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 Northwind.CategoriesDataTable
GetCategoryWithBinaryDataByCategoryID(int categoryID)
{
return Adapter.GetCategoryWithBinaryDataByCategoryID(categoryID);
}
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.
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.
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 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);
}
}
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 metódusbanServer.MapPath
talá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!
14. ábra: A fájl EvolutionValley.jpg
feltöltve lett a webkiszolgálóra (ide kattintva megtekintheti a teljes méretű képet)
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.pdf
fá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:
- Large-Value adattípusok használata
- A FileUpload Control rövid útmutatói
- A ASP.NET 2.0 FileUpload kiszolgálóvezérlő
- A fájlfeltöltések sötét oldala
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 Tanuld meg 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.