Przekazywanie plików (C#)
Autor : Scott Mitchell
Dowiedz się, jak umożliwić użytkownikom przekazywanie plików binarnych (takich jak Word lub dokumenty PDF) do witryny sieci Web, w której mogą być przechowywane w systemie plików serwera lub bazie danych.
Wprowadzenie
Wszystkie samouczki, które omówiliśmy do tej pory, działały wyłącznie z danymi tekstowymi. Jednak wiele aplikacji ma modele danych, które przechwytują zarówno dane tekstowe, jak i binarne. Witryna randkowa online może umożliwiać użytkownikom przekazywanie zdjęcia do skojarzenia z ich profilem. Witryna internetowa rekrutacji może pozwolić użytkownikom przekazać swoje życiorysy jako dokument microsoft Word lub PDF.
Praca z danymi binarnymi dodaje nowy zestaw wyzwań. Musimy zdecydować, w jaki sposób dane binarne są przechowywane w aplikacji. Interfejs używany do wstawiania nowych rekordów musi zostać zaktualizowany w celu umożliwienia użytkownikowi przekazania pliku z komputera i podjęcia dodatkowych kroków w celu wyświetlenia lub udostępnienia sposobu pobierania skojarzonych z rekordami danych binarnych. W tym samouczku i w następnych trzech krokach dowiemy się, jak pokonać te wyzwania. Na końcu tych samouczków utworzymy w pełni funkcjonalną aplikację, która kojarzy obraz i broszurę PDF z każdą kategorią. W tym konkretnym samouczku przyjrzymy się różnym technikom przechowywania danych binarnych i dowiesz się, jak umożliwić użytkownikom przekazywanie pliku z komputera i zapisanie go w systemie plików serwera internetowego.
Uwaga
Dane binarne, które są częścią modelu danych aplikacji, są czasami nazywane obiektem BLOB, akronimem Binary Large OBject. W tych samouczkach wybrano użycie danych binarnych terminologii, chociaż termin BLOB jest synonimem.
Krok 1. Tworzenie stron sieci Web danych binarnych
Zanim zaczniemy eksplorować wyzwania związane z dodawaniem obsługi danych binarnych, poświęćmy chwilę na utworzenie stron ASP.NET w projekcie witryny internetowej, które będą potrzebne w tym samouczku i kolejnych trzech. Zacznij od dodania nowego folderu o nazwie BinaryData
. Następnie dodaj do tego folderu następujące strony ASP.NET, aby skojarzyć każdą stronę ze stroną wzorcową Site.master
:
Default.aspx
FileUpload.aspx
DisplayOrDownloadData.aspx
UploadInDetailsView.aspx
UpdatingAndDeleting.aspx
Rysunek 1. Dodawanie stron ASP.NET dla samouczków Data-Related binarnych
Podobnie jak w przypadku innych folderów, Default.aspx
w BinaryData
folderze zostanie wyświetlona lista samouczków w jego sekcji. Pamiętaj, że kontrolka SectionLevelTutorialListing.ascx
użytkownika udostępnia tę funkcję. W związku z tym dodaj tę kontrolkę użytkownika, Default.aspx
przeciągając ją z Eksplorator rozwiązań na widok projektowy strony.
Rysunek 2. Dodawanie kontrolki SectionLevelTutorialListing.ascx
użytkownika do (Default.aspx
kliknij, aby wyświetlić obraz pełnowymiarowy)
Na koniec dodaj te strony jako wpisy do Web.sitemap
pliku. W szczególności dodaj następujące znaczniki po zwiększeniu kontrolki 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 zaktualizowaniu Web.sitemap
programu poświęć chwilę, aby wyświetlić witrynę internetową samouczków za pośrednictwem przeglądarki. Menu po lewej stronie zawiera teraz elementy samouczków Praca z danymi binarnymi.
Rysunek 3. Mapa witryny zawiera teraz wpisy samouczków dotyczących pracy z danymi binarnymi
Krok 2. Wybieranie miejsca przechowywania danych binarnych
Dane binarne skojarzone z modelem danych aplikacji mogą być przechowywane w jednym z dwóch miejsc: w systemie plików serwera internetowego z odwołaniem do pliku przechowywanego w bazie danych; lub bezpośrednio w samej bazie danych (patrz Rysunek 4). Każde podejście ma swój własny zestaw zalet i minusów i zalet bardziej szczegółowe omówienie.
Rysunek 4. Dane binarne mogą być przechowywane w systemie plików lub bezpośrednio w bazie danych (kliknij, aby wyświetlić obraz w pełnym rozmiarze)
Załóżmy, że chcemy rozszerzyć bazę danych Northwind, aby skojarzyć obraz z każdym produktem. Jedną z opcji jest przechowywanie tych plików obrazów w systemie plików serwera internetowego i rejestrowanie ścieżki Products
w tabeli. W przypadku tego podejścia dodaliśmy kolumnę ImagePath
do Products
tabeli typu varchar(200)
, być może. Gdy użytkownik przekaże obraz dla aplikacji Chai, ten obraz może być przechowywany w systemie plików serwera internetowego w lokalizacji ~/Images/Tea.jpg
, gdzie ~
reprezentuje ścieżkę fizyczną aplikacji. Oznacza to, że jeśli witryna internetowa jest zakorzeniona w ścieżce C:\Websites\Northwind\
fizycznej , ~/Images/Tea.jpg
byłaby równoważna C:\Websites\Northwind\Images\Tea.jpg
. Po przekazaniu pliku obrazu zaktualizujemy rekord Chai w Products
tabeli, tak aby jego ImagePath
kolumna odwołyła się do ścieżki nowego obrazu. Możemy użyć ~/Images/Tea.jpg
polecenia lub tylko Tea.jpg
wtedy, gdy zdecydujemy, że wszystkie obrazy produktów zostaną umieszczone w folderze aplikacji Images
.
Główne zalety przechowywania danych binarnych w systemie plików to:
- Łatwość implementacji , ponieważ wkrótce zobaczymy, przechowywanie i pobieranie danych binarnych przechowywanych bezpośrednio w bazie danych wymaga nieco więcej kodu niż podczas pracy z danymi za pośrednictwem systemu plików. Ponadto, aby użytkownik mógł wyświetlać lub pobierać dane binarne, musi mieć adres URL do tych danych. Jeśli dane znajdują się w systemie plików serwera internetowego, adres URL jest prosty. Jeśli jednak dane są przechowywane w bazie danych, należy utworzyć stronę internetową, która będzie pobierać i zwracać dane z bazy danych.
- Szerszy dostęp do danych binarnych , do których dane binarne mogą być dostępne dla innych usług lub aplikacji, które nie mogą ściągać danych z bazy danych. Na przykład obrazy skojarzone z każdym produktem mogą być również dostępne dla użytkowników za pośrednictwem protokołu FTP. W tym przypadku chcemy przechowywać dane binarne w systemie plików.
- Wydajność , jeśli dane binarne są przechowywane w systemie plików, zapotrzebowanie i przeciążenie sieci między serwerem bazy danych a serwerem internetowym będzie mniejsze niż wtedy, gdy dane binarne są przechowywane bezpośrednio w bazie danych.
Główną wadą przechowywania danych binarnych w systemie plików jest oddzielenie danych z bazy danych. Jeśli rekord zostanie usunięty z Products
tabeli, skojarzony plik w systemie plików serwera internetowego nie zostanie automatycznie usunięty. Musimy napisać dodatkowy kod, aby usunąć plik lub system plików stanie się zaśmiecony nieużywanymi, oddzielonymi plikami. Ponadto podczas tworzenia kopii zapasowej bazy danych musimy pamiętać o utworzeniu kopii zapasowych skojarzonych danych binarnych w systemie plików. Przeniesienie bazy danych do innej lokacji lub serwera stanowi podobne wyzwania.
Alternatywnie dane binarne mogą być przechowywane bezpośrednio w bazie danych microsoft SQL Server 2005, tworząc kolumnę typu varbinary
. Podobnie jak w przypadku innych typów danych o zmiennej długości, można określić maksymalną długość danych binarnych, które mogą być przechowywane w tej kolumnie. Na przykład aby zarezerwować maksymalnie 5000 bajtów, varbinary(5000)
użyj polecenia ; varbinary(MAX)
umożliwia maksymalny rozmiar magazynu, około 2 GB.
Główną zaletą przechowywania danych binarnych bezpośrednio w bazie danych jest ścisłe sprzężenie między danymi binarnymi a rekordem bazy danych. Znacznie upraszcza to zadania administracyjne bazy danych, takie jak tworzenie kopii zapasowych lub przenoszenie bazy danych do innej lokacji lub serwera. Ponadto usunięcie rekordu powoduje automatyczne usunięcie odpowiednich danych binarnych. Istnieją również bardziej subtelne zalety przechowywania danych binarnych w bazie danych. Aby uzyskać bardziej szczegółowe omówienie, zobacz Przechowywanie plików binarnych bezpośrednio w bazie danych przy użyciu ASP.NET 2.0 .
Uwaga
W programie Microsoft SQL Server 2000 i starszych wersjach varbinary
typ danych miał maksymalny limit 8000 bajtów. Aby przechowywać do 2 GB danych binarnych, image
należy zamiast tego użyć typu danych. Po dodaniu w MAX
SQL Server 2005 r. typ danych został jednak image
przestarzały. Nadal jest obsługiwana w przypadku zgodności z poprzednimi wersjami, ale firma Microsoft ogłosiła, że image
typ danych zostanie usunięty w przyszłej wersji SQL Server.
Jeśli pracujesz ze starszym modelem danych, może zostać wyświetlony image
typ danych. Tabela bazy danych Categories
Northwind zawiera kolumnę Picture
, która może służyć do przechowywania danych binarnych pliku obrazu dla kategorii. Ponieważ baza danych Northwind ma swoje korzenie w programie Microsoft Access i wcześniejszych wersjach SQL Server, ta kolumna jest typu image
.
W tym samouczku i w następnych trzech przypadkach użyjemy obu metod. Tabela Categories
zawiera już kolumnę Picture
do przechowywania zawartości binarnej obrazu dla kategorii. Dodamy dodatkową kolumnę , BrochurePath
aby przechowywać ścieżkę do pliku PDF w systemie plików serwera internetowego, który może służyć do zapewnienia jakości wydruku, polerowanego przeglądu kategorii.
Krok 3. DodawanieBrochurePath
kolumny doCategories
tabeli
Obecnie tabela Categories zawiera tylko cztery kolumny: CategoryID
, , Description
CategoryName
i Picture
. Oprócz tych pól musimy dodać nową, która wskaże broszurę kategorii (jeśli istnieje). Aby dodać tę kolumnę, przejdź do Eksploratora serwera, przejdź do szczegółów tabel, kliknij prawym przyciskiem myszy Categories
tabelę i wybierz polecenie Otwórz definicję tabeli (zobacz Rysunek 5). Jeśli Eksplorator serwera nie jest widoczny, wyświetl go, wybierając opcję Eksplorator serwera z menu Widok lub naciśnij klawisze Ctrl+Alt+S.
Dodaj nową varchar(200)
kolumnę do Categories
tabeli o nazwie BrochurePath
i zezwala na NULL
s i kliknij ikonę Zapisz (lub naciśnij klawisze Ctrl+S).
Rysunek 5. Dodawanie BrochurePath
kolumny do Categories
tabeli (kliknij, aby wyświetlić obraz pełnowymiarowy)
Krok 4. Aktualizowanie architektury w celu używaniaPicture
kolumn iBrochurePath
Element CategoriesDataTable
w warstwie dostępu do danych (DAL) ma obecnie zdefiniowane cztery DataColumn
elementy: CategoryID
, Description
CategoryName
i NumberOfProducts
. Po pierwotnie zaprojektowaniu tej tabeli DataTable w samouczku CategoriesDataTable
Tworzenie warstwy dostępu do danych tylko trzy pierwsze kolumny; kolumna NumberOfProducts
została dodana w samouczku Master/Detail Using a Bulleted List of Master Records with a Details DataList (Lista punktowana rekordów głównych z listą szczegółów datalist).
Jak opisano w temacie Tworzenie warstwy dostępu do danych, tabele danych w zestawie danych typowych tworzą obiekty biznesowe. Elementy TableAdapters są odpowiedzialne za komunikację z bazą danych i wypełnianie obiektów biznesowych wynikami zapytania. Obiekt CategoriesDataTable
jest wypełniany przez metodę CategoriesTableAdapter
, która zawiera trzy metody pobierania danych:
GetCategories()
Wykonuje główne zapytanie tableAdapter i zwracaCategoryID
pola ,CategoryName
iDescription
wszystkich rekordów wCategories
tabeli. Główne zapytanie jest używane przez generowaneInsert
automatycznie metody iUpdate
.GetCategoryByCategoryID(categoryID)
CategoryID
Zwraca pola ,CategoryName
iDescription
kategorii, którychCategoryID
jest równe categoryID.GetCategoriesAndNumberOfProducts()
— zwracaCategoryID
pola ,CategoryName
iDescription
dla wszystkich rekordów wCategories
tabeli. Używa również podquerii, aby zwrócić liczbę produktów skojarzonych z każdą kategorią.
Zwróć uwagę, że żadne z tych zapytań nie zwraca Categories
kolumn Picture
lub BrochurePath
tabeli ani nie CategoriesDataTable
udostępnia DataColumn
tych pól. Aby pracować z obrazem i BrochurePath
właściwościami, musimy najpierw dodać je do CategoriesDataTable
klasy, a następnie zaktualizować CategoriesTableAdapter
klasę, aby zwrócić te kolumny.
Dodawanie parametrówPicture
iBrochurePath``DataColumn
Zacznij od dodania tych dwóch kolumn do elementu CategoriesDataTable
. Kliknij prawym przyciskiem myszy CategoriesDataTable
nagłówek s, wybierz pozycję Dodaj z menu kontekstowego, a następnie wybierz opcję Kolumna. Spowoduje to utworzenie nowego DataColumn
elementu w tabeli DataTable o nazwie Column1
. Zmień nazwę tej kolumny na Picture
. W okno Właściwości ustaw DataColumn
właściwość s DataType
na System.Byte[]
(nie jest to opcja na liście rozwijanej; musisz wpisać ją).
Rysunek 6. Tworzenie nazwanego DataColumn
Picture
elementu (System.Byte[]
DataType
kliknij, aby wyświetlić obraz o pełnym rozmiarze)
Dodaj inny DataColumn
element do tabeli DataTable, nazywając ją BrochurePath
wartością domyślną DataType
(System.String
).
ZwracaniePicture
wartości iBrochurePath
z tabeli TableAdapter
Po dodaniu tych dwóch DataColumn
plików do elementu CategoriesDataTable
, możemy przystąpić do aktualizacji elementu CategoriesTableAdapter
. Oba te wartości kolumn mogą być zwracane w głównym zapytaniu TableAdapter, ale spowoduje to przywrócenie danych binarnych za każdym razem, gdy GetCategories()
metoda została wywołana. Zamiast tego zaktualizujmy główne zapytanie TableAdapter, aby przywrócić BrochurePath
i utworzyć dodatkową metodę pobierania danych zwracającą określoną kolumnę kategorii Picture
.
Aby zaktualizować główne zapytanie TableAdapter, kliknij prawym przyciskiem myszy CategoriesTableAdapter
nagłówek s i wybierz opcję Konfiguruj z menu kontekstowego. Spowoduje to wyświetlenie Kreatora konfiguracji adaptera tabel, który widzieliśmy w wielu poprzednich samouczkach. Zaktualizuj zapytanie, aby przywrócić BrochurePath
element i kliknij przycisk Zakończ.
Rysunek 7. Zaktualizuj listę kolumn w instrukcji SELECT
, aby również powrócić BrochurePath
(kliknij, aby wyświetlić obraz pełnowymiarowy)
W przypadku korzystania z instrukcji SQL ad hoc dla klasy TableAdapter aktualizowanie listy kolumn w zapytaniu głównym aktualizuje listę kolumn dla wszystkich SELECT
metod zapytań w tableAdapter. Oznacza GetCategoryByCategoryID(categoryID)
to, że metoda została zaktualizowana w celu zwrócenia BrochurePath
kolumny, co może być tym, co zamierzyliśmy. Jednak zaktualizowała również listę kolumn w metodzie GetCategoriesAndNumberOfProducts()
, usuwając podquerię zwracającą liczbę produktów dla każdej kategorii! W związku z tym musimy zaktualizować to zapytanie metody SELECT
. Kliknij prawym przyciskiem myszy metodę GetCategoriesAndNumberOfProducts()
, wybierz pozycję Konfiguruj i przywróć SELECT
zapytanie z powrotem do oryginalnej wartości:
SELECT CategoryID, CategoryName, Description,
(SELECT COUNT(*)
FROM Products p
WHERE p.CategoryID = c.CategoryID)
as NumberOfProducts
FROM Categories c
Następnie utwórz nową metodę TableAdapter, która zwraca wartość kolumny Picture
określonej kategorii. Kliknij prawym przyciskiem myszy CategoriesTableAdapter
nagłówek s i wybierz opcję Dodaj zapytanie, aby uruchomić Kreatora konfiguracji zapytań TableAdapter. Pierwszy krok tego kreatora pyta nas, czy chcemy wysyłać zapytania o dane przy użyciu instrukcji AD-hoc SQL, nowej procedury składowanej lub istniejącej. Wybierz pozycję Użyj instrukcji SQL i kliknij przycisk Dalej. Ponieważ zwracamy wiersz, wybierz opcję SELECT, która zwraca wiersze z drugiego kroku.
Rysunek 8. Wybierz opcję Użyj instrukcji SQL (kliknij, aby wyświetlić obraz pełnowymiarowy)
Rysunek 9. Ponieważ zapytanie zwróci rekord z tabeli Kategorii, wybierz pozycję SELECT, która zwraca wiersze (kliknij, aby wyświetlić obraz pełnowymiarowy)
W trzecim kroku wprowadź następujące zapytanie SQL i kliknij przycisk Dalej:
SELECT CategoryID, CategoryName, Description, BrochurePath, Picture
FROM Categories
WHERE CategoryID = @CategoryID
Ostatnim krokiem jest wybranie nazwy nowej metody. Użyj FillCategoryWithBinaryDataByCategoryID
wartości i GetCategoryWithBinaryDataByCategoryID
dla opcji Wypełnij tabelę danych i zwróć odpowiednio wzorce DataTable. Kliknij przycisk Zakończ, aby zakończyć kreatora.
Rysunek 10. Wybierz nazwy metod TableAdapter s (kliknij, aby wyświetlić obraz pełnowymiarowy)
Uwaga
Po ukończeniu pracy Kreatora konfiguracji zapytania karty tabeli może zostać wyświetlone okno dialogowe z informacją, że nowy tekst polecenia zwraca dane ze schematem innym niż schemat zapytania głównego. Krótko mówiąc, kreator zauważa, że główne zapytanie GetCategories()
TableAdapter zwraca inny schemat niż właśnie utworzony. Ale to jest to, czego chcemy, więc możesz zignorować tę wiadomość.
Należy również pamiętać, że jeśli używasz instrukcji AD-hoc SQL i użyjesz kreatora, aby zmienić główne zapytanie TableAdapter w późniejszym czasie, zmodyfikuje GetCategoryWithBinaryDataByCategoryID
listę kolumn instrukcji metody SELECT
, aby uwzględnić tylko te kolumny z zapytania głównego (czyli spowoduje to usunięcie Picture
kolumny z zapytania). Musisz ręcznie zaktualizować listę kolumn, aby zwrócić kolumnę Picture
, podobnie jak w GetCategoriesAndNumberOfProducts()
przypadku metody wcześniej w tym kroku.
Po dodaniu dwóch DataColumn
s do metody i GetCategoryWithBinaryDataByCategoryID
do CategoriesDataTable
CategoriesTableAdapter
klasy w zestawie typed DataSet Projektant powinny wyglądać jak zrzut ekranu na rysunku 11.
Rysunek 11. Zestaw danych Projektant zawiera nowe kolumny i metodę
Aktualizowanie warstwy logiki biznesowej (BLL)
Po zaktualizowaniu narzędzia DAL wszystkie pozostałe elementy to rozszerzenie warstwy logiki biznesowej (BLL), aby uwzględnić metodę dla nowej CategoriesTableAdapter
metody. Dodaj następującą metodę do klasy CategoriesBLL
:
[System.ComponentModel.DataObjectMethodAttribute
(System.ComponentModel.DataObjectMethodType.Select, false)]
public Northwind.CategoriesDataTable
GetCategoryWithBinaryDataByCategoryID(int categoryID)
{
return Adapter.GetCategoryWithBinaryDataByCategoryID(categoryID);
}
Krok 5. Przekazywanie pliku z klienta do serwera sieci Web
Podczas zbierania danych binarnych często te dane są dostarczane przez użytkownika końcowego. Aby przechwycić te informacje, użytkownik musi mieć możliwość przekazania pliku z komputera do serwera internetowego. Przekazane dane należy następnie zintegrować z modelem danych, co może oznaczać zapisanie pliku w systemie plików serwera internetowego i dodanie ścieżki do pliku w bazie danych lub zapisanie zawartości binarnej bezpośrednio w bazie danych. W tym kroku przyjrzymy się, jak zezwolić użytkownikowi na przekazywanie plików z komputera do serwera. W następnym samouczku zwrócimy uwagę na integrację przekazanego pliku z modelem danych.
ASP.NET 2.0 s nowa kontrolka sieci Web FileUpload udostępnia mechanizm wysyłania pliku z komputera do serwera internetowego. Kontrolka FileUpload jest renderowana jako <input>
element, którego type
atrybut jest ustawiony na plik, który przeglądarki są wyświetlane jako pole tekstowe z przyciskiem Przeglądaj. Kliknięcie przycisku Przeglądaj powoduje wyświetlenie okna dialogowego, z którego użytkownik może wybrać plik. Po wysłaniu formularza z powrotem wybrana zawartość pliku jest wysyłana wraz z postback. Po stronie serwera informacje o przekazanym pliku są dostępne za pośrednictwem właściwości kontrolki FileUpload.
Aby zademonstrować przekazywanie plików, otwórz FileUpload.aspx
stronę w BinaryData
folderze, przeciągnij kontrolkę FileUpload z przybornika na Projektant i ustaw właściwość s kontrolki ID
na UploadTest
. Następnie dodaj kontrolkę Sieć Web przycisku odpowiednio do ID
UploadButton
właściwości i Text
Upload Selected File (Przekaż wybrany plik). Na koniec umieść kontrolkę Etykieta sieci Web pod przyciskiem, wyczyść jej Text
właściwość i ustaw jej ID
właściwość na UploadDetails
.
Rysunek 12. Dodawanie kontrolki FileUpload do strony ASP.NET (kliknij, aby wyświetlić obraz pełnowymiarowy)
Rysunek 13 przedstawia tę stronę podczas przeglądania za pośrednictwem przeglądarki. Należy pamiętać, że kliknięcie przycisku Przeglądaj powoduje wyświetlenie okna dialogowego wyboru pliku, co pozwala użytkownikowi wybrać plik z komputera. Po wybraniu pliku kliknięcie przycisku Przekaż wybrany plik powoduje powrót, który wysyła wybraną zawartość binarną pliku do serwera internetowego.
Rysunek 13. Użytkownik może wybrać plik do przekazania z komputera do serwera (kliknij, aby wyświetlić obraz pełnowymiarowy)
Po zakończeniu przekazywania przekazany plik można zapisać w systemie plików lub z danymi binarnymi można pracować bezpośrednio za pośrednictwem Stream. W tym przykładzie utwórzmy ~/Brochures
folder i zapiszmy tam przekazany plik. Zacznij od dodania Brochures
folderu do witryny jako podfolderu katalogu głównego. Następnie utwórz procedurę obsługi zdarzeń UploadButton
Click
dla zdarzenia i dodaj następujący kod:
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);
}
}
Kontrolka FileUpload udostępnia różne właściwości do pracy z przekazanymi danymi. Na przykład właściwość wskazuje, HasFile
czy plik został przekazany przez użytkownika, podczas gdy FileBytes
właściwość zapewnia dostęp do przekazanych danych binarnych jako tablicy bajtów. Procedura Click
obsługi zdarzeń rozpoczyna się od upewnienia się, że plik został przekazany. Jeśli plik został przekazany, etykieta zawiera nazwę przekazanego pliku, jego rozmiar w bajtach i typ zawartości.
Uwaga
Aby upewnić się, że użytkownik przekaże plik, możesz sprawdzić HasFile
właściwość i wyświetlić ostrzeżenie, jeśli jest false
to , lub zamiast tego możesz użyć kontrolki RequiredFieldValidator .
Element FileUpload zapisuje SaveAs(filePath)
przekazany plik do określonej ścieżki plików. filePath musi być ścieżką fizyczną (C:\Websites\Brochures\SomeFile.pdf
), a nie ścieżkąwirtualną (/Brochures/SomeFile.pdf
). MetodaServer.MapPath(virtPath)
przyjmuje ścieżkę wirtualną i zwraca odpowiednią ścieżkę fizyczną. W tym miejscu ścieżka wirtualna to ~/Brochures/fileName
, gdzie fileName to nazwa przekazanego pliku. Aby uzyskać więcej informacji na temat ścieżek wirtualnych i fizycznych, zobacz Server.MapPath Method (Metoda Server.MapPath ), aby uzyskać więcej informacji na temat ścieżek wirtualnych i fizycznych oraz przy użyciu polecenia Server.MapPath
.
Po ukończeniu Click
procedury obsługi zdarzeń poświęć chwilę, aby przetestować stronę w przeglądarce. Kliknij przycisk Przeglądaj i wybierz plik z dysku twardego, a następnie kliknij przycisk Przekaż wybrany plik. Postback wyśle zawartość wybranego pliku na serwer internetowy, który następnie wyświetli informacje o pliku przed zapisaniem go w folderze ~/Brochures
. Po przekazaniu pliku wróć do programu Visual Studio i kliknij przycisk Odśwież w Eksplorator rozwiązań. Powinien zostać wyświetlony właśnie przekazany plik w folderze ~/Broszury!
Rysunek 14. Plik EvolutionValley.jpg
został przekazany do serwera sieci Web (kliknij, aby wyświetlić obraz pełnowymiarowy)
Rysunek 15. EvolutionValley.jpg
Zapisano go w folderze ~/Brochures
Subtelności dotyczące zapisywania przekazanych plików w systemie plików
Istnieje kilka subtelności, które należy rozwiązać podczas zapisywania plików przekazywania plików do systemu plików serwera internetowego. Po pierwsze, istnieje problem z zabezpieczeniami. Aby zapisać plik w systemie plików, kontekst zabezpieczeń, w którym jest uruchamiana strona ASP.NET, musi mieć uprawnienia do zapisu. Serwer internetowy ASP.NET Development Działa w kontekście bieżącego konta użytkownika. Jeśli używasz usług Microsoft Internet Information Services (IIS) jako serwera internetowego, kontekst zabezpieczeń zależy od wersji usług IIS i jej konfiguracji.
Innym wyzwaniem jest zapisanie plików w systemie plików wokół nazewnictwa plików. Obecnie nasza strona zapisuje wszystkie przekazane pliki do ~/Brochures
katalogu przy użyciu tej samej nazwy co plik na komputerze klienckim. Jeśli użytkownik A przekaże broszurę o nazwie Brochure.pdf
, plik zostanie zapisany jako ~/Brochure/Brochure.pdf
. Ale co zrobić, jeśli jakiś czas później użytkownik B przekaże inny plik broszury, który ma taką samą nazwę pliku (Brochure.pdf
)? Po utworzeniu kodu plik User A zostanie zastąpiony przekazywaniem użytkownika B.
Istnieje wiele technik rozwiązywania konfliktów nazw plików. Jedną z opcji jest zakaz przekazywania pliku, jeśli istnieje już jeden o tej samej nazwie. Dzięki temu podejściu użytkownik B próbuje przekazać plik o nazwie Brochure.pdf
, system nie zapisze pliku i wyświetli komunikat informujący użytkownika B o zmianie nazwy pliku i spróbuj ponownie. Innym podejściem jest zapisanie pliku przy użyciu unikatowej nazwy pliku, która może być globalnie unikatowym identyfikatorem (GUID) lub wartością z odpowiednich kolumn klucza podstawowego rekordu bazy danych (przy założeniu, że przekazywanie jest skojarzone z określonym wierszem w modelu danych). W następnym samouczku bardziej szczegółowo omówimy te opcje.
Wyzwania związane z bardzo dużymi ilościami danych binarnych
W tych samouczkach założono, że przechwycone dane binarne są niewielkie. Praca z bardzo dużymi ilościami plików danych binarnych, które są kilkoma megabajtami lub większymi, wprowadza nowe wyzwania wykraczające poza zakres tych samouczków. Na przykład domyślnie ASP.NET odrzuca przekazywanie więcej niż 4 MB, chociaż można to skonfigurować za pośrednictwem <httpRuntime>
elementu w programie Web.config
. Usługi IIS nakładają również ograniczenia rozmiaru przekazywania plików. Ponadto czas potrzebny na przekazanie dużych plików może przekroczyć domyślne 110 sekund, ASP.NET poczeka na żądanie. Występują również problemy z pamięcią i wydajnością występujące podczas pracy z dużymi plikami.
Kontrolka FileUpload jest niepraktyczna dla dużych przekazywania plików. Ponieważ zawartość pliku jest publikowana na serwerze, użytkownik końcowy musi cierpliwie czekać bez potwierdzenia, że ich przekazywanie trwa. Nie jest to tak duży problem podczas pracy z mniejszymi plikami, które można przekazać w ciągu kilku sekund, ale może to być problem podczas pracy z większymi plikami, które mogą potrwać kilka minut do przekazania. Istnieje wiele kontrolek przekazywania plików innych firm, które lepiej nadają się do obsługi dużych przekazywania, a wielu z tych dostawców zapewnia wskaźniki postępu i menedżerów przekazywania ActiveX, które prezentują znacznie bardziej dopracowane środowisko użytkownika.
Jeśli aplikacja musi obsługiwać duże pliki, należy dokładnie zbadać wyzwania i znaleźć odpowiednie rozwiązania dla konkretnych potrzeb.
Podsumowanie
Tworzenie aplikacji, która musi przechwytywać dane binarne, wprowadza szereg wyzwań. W tym samouczku zapoznaliśmy się z dwoma pierwszymi: podjęciem decyzji o tym, gdzie przechowywać dane binarne i umożliwić użytkownikowi przekazywanie zawartości binarnej za pośrednictwem strony internetowej. W kolejnych trzech samouczkach zobaczymy, jak skojarzyć przekazane dane z rekordem w bazie danych, a także jak wyświetlać dane binarne wraz z polami danych tekstowych.
Szczęśliwe programowanie!
Dalsze informacje
Aby uzyskać więcej informacji na temat tematów omówionych w tym samouczku, zapoznaj się z następującymi zasobami:
- Używanie typów danych Large-Value
- FileUpload Control — przewodniki Szybki start
- Kontrolka serwera ASP.NET 2.0 FileUpload
- Ciemna strona przekazywania plików
Informacje o autorze
Scott Mitchell, autor siedmiu książek ASP/ASP.NET i założyciel 4GuysFromRolla.com, współpracuje z technologiami internetowymi firmy Microsoft od 1998 roku. Scott pracuje jako niezależny konsultant, trener i pisarz. Jego najnowsza książka to Sams Teach Yourself ASP.NET 2.0 w ciągu 24 godzin. Można do niego dotrzeć pod adresem mitchell@4GuysFromRolla.com. Lub za pośrednictwem swojego bloga, który można znaleźć na stronie http://ScottOnWriting.NET.
Specjalne podziękowania
Ta seria samouczków została sprawdzona przez wielu pomocnych recenzentów. Recenzenci w tym samouczku byli Teresa Murphy i Bernadette Leigh. Chcesz przejrzeć nadchodzące artykuły MSDN? Jeśli tak, upuść mi wiersz pod adresem mitchell@4GuysFromRolla.com.
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla