Przekazywanie plików (C#)

Autor : Scott Mitchell

Pobierz plik PDF

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

Dodawanie stron ASP.NET dla samouczków dotyczących Data-Related binarnych

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.

Dodaj kontrolkę Użytkownika SectionLevelTutorialListing.ascx, aby Default.aspx

Rysunek 2. Dodawanie kontrolki SectionLevelTutorialListing.ascx użytkownika do (Default.aspxkliknij, 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.sitemapprogramu 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.

Mapa witryny zawiera teraz wpisy na potrzeby samouczków dotyczących pracy 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.

Dane binarne mogą być przechowywane w systemie plików lub bezpośrednio w bazie danych

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ę , BrochurePathaby 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. DodawanieBrochurePathkolumny doCategoriestabeli

Obecnie tabela Categories zawiera tylko cztery kolumny: CategoryID, , DescriptionCategoryNamei 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).

Dodawanie kolumny BroszuraPath do tabeli Categories

Rysunek 5. Dodawanie BrochurePath kolumny do Categories tabeli (kliknij, aby wyświetlić obraz pełnowymiarowy)

Krok 4. Aktualizowanie architektury w celu używaniaPicturekolumn iBrochurePath

Element CategoriesDataTable w warstwie dostępu do danych (DAL) ma obecnie zdefiniowane cztery DataColumn elementy: CategoryID, DescriptionCategoryNamei NumberOfProducts. Po pierwotnie zaprojektowaniu tej tabeli DataTable w samouczku CategoriesDataTableTworzenie 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 zwraca CategoryIDpola , CategoryNamei Description wszystkich rekordów w Categories tabeli. Główne zapytanie jest używane przez generowane Insert automatycznie metody i Update .
  • GetCategoryByCategoryID(categoryID)CategoryIDZwraca pola , CategoryNamei Description kategorii, których CategoryID jest równe categoryID.
  • GetCategoriesAndNumberOfProducts() — zwraca CategoryIDpola , CategoryNamei Description dla wszystkich rekordów w Categories 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ówPictureiBrochurePath``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ą).

Utwórz obraz o nazwie DataColumn, którego typ danych to System.Byte[]

Rysunek 6. Tworzenie nazwanego DataColumnPicture elementu (System.Byte[]DataTypekliknij, 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).

ZwracaniePicturewartości iBrochurePathz 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.

Zaktualizuj listę kolumn w instrukcji SELECT, aby również zwrócić broszuręPath

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.

Wybierz opcję Użyj instrukcji SQL

Rysunek 8. Wybierz opcję Użyj instrukcji SQL (kliknij, aby wyświetlić obraz pełnowymiarowy)

Ponieważ zapytanie zwróci rekord z tabeli Kategorii, wybierz pozycję SELECT, która zwraca wiersze

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.

Wybierz nazwy metod TableAdapter s

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 CategoriesDataTableCategoriesTableAdapterklasy w zestawie typed DataSet Projektant powinny wyglądać jak zrzut ekranu na rysunku 11.

Zestaw danych Projektant zawiera nowe kolumny i metodę

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

Dodawanie kontrolki FileUpload do strony ASP.NET

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.

Użytkownik może wybrać plik do przekazania z komputera do serwera

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ń UploadButtonClick 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 falseto , 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!

Plik EvolutionValley.jpg został przekazany do serwera sieci Web

Rysunek 14. Plik EvolutionValley.jpg został przekazany do serwera sieci Web (kliknij, aby wyświetlić obraz pełnowymiarowy)

EvolutionValley.jpg został zapisany w folderze ~/Broszury

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:

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.