Przekazywanie plików (VB)

Autor : Scott Mitchell

Pobierz plik PDF

Dowiedz się, jak umożliwić użytkownikom przekazywanie plików binarnych (takich jak dokumenty programu Word lub PDF) do witryny sieci Web, w której mogą być przechowywane w systemie plików serwera lub bazie danych.

Wprowadzenie

Wszystkie samouczki, które zbadano 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żliwić użytkownikom przesłanie zdjęcia, aby skojarzyć je z ich profilem. Witryna internetowa rekrutująca może pozwolić użytkownikom przekazać swoje życiorysy jako dokument programu 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, aby umożliwić użytkownikowi przekazanie pliku z komputera i należy wykonać dodatkowe czynności w celu wyświetlenia lub udostępnienia środków do pobrania skojarzonych z rekordami danych binarnych. W tym samouczku i w kolejnych trzech omówimy, jak sprostać tym wyzwaniom. 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 zdecydowałem się używać terminologii danych binarnych, chociaż termin BLOB jest synonimem.

Krok 1: Tworzenie stron sieci Web do pracy z danymi binarnymi

Zanim zaczniemy eksplorować wyzwania związane z dodawaniem obsługi danych binarnych, najpierw poświęćmy chwilę, aby utworzyć strony ASP.NET w projekcie naszej witryny, które będą potrzebne w tym samouczku i w kolejnych trzech. Zacznij od dodania nowego folderu o nazwie BinaryData. Następnie dodaj następujące strony ASP.NET do tego folderu, aby skojarzyć każdą stronę ze stroną wzorcową Site.master :

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

Dodaj strony ASP.NET do binarnych samouczków Data-Related

Rysunek 1. Dodaj strony ASP.NET dla binarnych samouczków Data-Related

Podobnie jak w innych folderach, Default.aspx w folderze BinaryData wyświetli listę samouczków w swojej 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 Eksploratora rozwiązań na stronę w Widoku projektowania.

Dodaj kontrolkę użytkownika SectionLevelTutorialListing.ascx do Default.aspx

Rysunek 2. Dodawanie kontrolki SectionLevelTutorialListing.ascx użytkownika do Default.aspx (kliknij, aby wyświetlić obraz o pełnym rozmiarze)

Na koniec dodaj te strony jako wpisy do Web.sitemap pliku. W szczególności dodaj następujący znacznik 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, poświęć chwilę, aby wyświetlić witrynę samouczków w przeglądarce. Menu po lewej stronie zawiera teraz elementy samouczków Praca z danymi binarnymi.

Mapa witryny zawiera teraz wpisy dotyczące pracy z danymi binarnymi — samouczki

Rysunek 3. Mapa witryny zawiera teraz wpisy dotyczące samouczków 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 (zobacz Rysunek 4). Każde podejście ma własny zestaw zalet i wad oraz zasługuje na bardziej szczegółową dyskusję.

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 pełnowymiarowy)

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 moglibyśmy dodać kolumnę ImagePath do tabeli Products typu varchar(200), być może. Gdy użytkownik przekaże obraz dla usługi Chai, ten obraz może być przechowywany w systemie plików serwera internetowego w ~/Images/Tea.jpglokalizacji , gdzie ~ reprezentuje ścieżkę fizyczną aplikacji. Oznacza to, że jeśli witryna sieci Web jest zakorzeniona w ścieżce C:\Websites\Northwind\fizycznej , ~/Images/Tea.jpg byłaby równoważna C:\Websites\Northwind\Images\Tea.jpg. Po przesłaniu pliku obrazu zaktualizujemy rekord Chai w Products tabeli, tak aby jego ImagePath kolumna odwoływała się do ścieżki nowego obrazu. Możemy użyć ~/Images/Tea.jpg lub po prostu Tea.jpg, jeśli 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 obejmuje 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 zostać wyświetlony adres URL dla 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 pobierze i zwróci dane z bazy danych.
  • Szerszy dostęp do danych binarnych może być niezbędny dla innych usług lub aplikacji, które nie są w stanie pobierać 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 również utworzyć kopie zapasowe skojarzonych danych binarnych w systemie plików. Przeniesienie bazy danych do innej lokacji lub serwera wiąże się z podobnymi wyzwaniami.

Alternatywnie dane binarne mogą być przechowywane bezpośrednio w bazie danych programu 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, użyj varbinary(5000); varbinary(MAX) pozwala na 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 kopie zapasowe 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 korzyści wynikające z przechowywania danych binarnych w bazie danych.

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, należy zamiast tego użyć typu danych image. Po dodaniu MAX w SQL Server 2005, typ danych image został uznany za 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 programu SQL Server.

Jeśli pracujesz ze starszym modelem danych, możesz zobaczyć 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 programu 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, w celu przechowywania ścieżki do pliku PDF w systemie plików serwera internetowego, który może służyć do przygotowania wysokiej jakości wydruku, doskonale opracowanego przeglądu kategorii.

Krok 3. DodawanieBrochurePathkolumny doCategoriestabeli

Obecnie tabela Categories ma tylko cztery kolumny: CategoryID, , CategoryNameDescriptioni Picture. Oprócz tych pól musimy dodać nową, która będzie wskazywać 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 Ctrl+Alt+S.

Dodaj nową kolumnę varchar(200) do tabeli Categories o nazwie BrochurePath, która pozwala na NULL, i kliknij ikonę zapisu (lub naciśnij Ctrl+S).

Dodaj kolumnę BrochurePath 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żywania Picture i BrochurePath kolumn

Element CategoriesDataTable w warstwie dostępu do danych (DAL) ma obecnie zdefiniowane cztery DataColumn: CategoryID, CategoryName, Description, i NumberOfProducts. Pierwotnie zaprojektowano tę tabelę DataTable w samouczku Tworzenie warstwy dostępu do danych; początkowo zawierała tylko trzy pierwsze kolumny. Kolumna CategoriesDataTable została dodana w samouczku NumberOfProducts.

Zgodnie z opisem w temacie Tworzenie warstwy dostępu do danych tabele DataTable w typowych zestawach danych tworzą obiekty biznesowe. Elementy TableAdapters są odpowiedzialne za komunikację z bazą danych i wypełnianie obiektów biznesowych wynikami zapytania. Element CategoriesDataTable jest wypełniany przez metodę CategoriesTableAdapter, która zawiera trzy metody pobierania danych:

  • GetCategories() wykonuje główne zapytanie TableAdapter i zwraca pola CategoryID, CategoryName i Description wszystkich rekordów w tabeli Categories. Główne pytanie dotyczy tego, co jest używane przez automatycznie generowane metody Insert i Update.
  • GetCategoryByCategoryID(categoryID) zwraca CategoryID, CategoryName i Description pola kategorii, której CategoryID równa się categoryID.
  • GetCategoriesAndNumberOfProducts() — zwraca pola CategoryID, CategoryName i Description dla wszystkich rekordów w tabeli Categories. Używa również podzapytania, aby zwrócić liczbę produktów skojarzonych z każdą kategorią.

Zwróć uwagę, że żadne z tych zapytań nie zwracają Categories tabel ani Picture i BrochurePath kolumn oraz CategoriesDataTable nie dostarcza DataColumn dla tych pól. Aby pracować z obrazem i właściwościami BrochurePath, musimy najpierw dodać je do CategoriesDataTable, a następnie zaktualizować klasę CategoriesTableAdapter w celu zwrócenia tych kolumn.

Dodawanie parametrówPictureiBrochurePath``DataColumn

Zacznij od dodania tych dwóch kolumn do elementu CategoriesDataTable. Kliknij prawym przyciskiem myszy nagłówek CategoriesDataTable, wybierz z menu kontekstowego opcję Dodaj, 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 oknie Właściwości ustaw właściwość DataColumn jako DataType na System.Byte[] (nie jest to opcja na liście rozwijanej; musisz ją wpisać ręcznie).

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

Rysunek 6. Tworzenie nazwanego DataColumn elementu o PictureDataType nazwie System.Byte[] (kliknij, aby wyświetlić obraz o pełnym rozmiarze)

Dodaj kolejny DataColumn do DataTable, nazywając go BrochurePath przy użyciu domyślnej wartości DataType (System.String).

Zwracanie Picture i BrochurePath wartości z TableAdaptera

Po dodaniu tych dwóch DataColumn do CategoriesDataTable jesteśmy gotowi, aby zaktualizować 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 Picture danych zwracającą określoną kolumnę kategorii.

Aby zaktualizować główne zapytanie TableAdapter, kliknij prawym przyciskiem myszy nagłówek CategoriesTableAdapter i wybierz opcję Konfiguruj z menu kontekstowego. Spowoduje to wyświetlenie Kreatora konfiguracji Adaptera Tabel, którego poznaliśmy w wielu poprzednich samouczkach. Zaktualizuj zapytanie, aby przywrócić element BrochurePath i kliknij Zakończ.

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

Rysunek 7. Zaktualizuj listę kolumn w instrukcji SELECT aby zwrócić również BrochurePath (Kliknij, aby wyświetlić obraz o pełnym rozmiarze)

W przypadku używania instrukcji SQL ad hoc dla tabeli TableAdapter aktualizowanie listy kolumn w zapytaniu głównym aktualizuje listę kolumn dla wszystkich SELECT metod zapytań w tabeli TableAdapter. Oznacza to, że metoda GetCategoryByCategoryID(categoryID) została zaktualizowana w celu zwrócenia kolumny BrochurePath, co może być zgodne z intencjami. Jednak zaktualizowała ona również listę kolumn w metodzie GetCategoriesAndNumberOfProducts() , usuwając podzapytywanie zwracające 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óć kwerendę SELECT 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 nagłówek CategoriesTableAdapter i wybierz opcję Dodaj zapytanie, aby uruchomić Kreatora konfiguracji zapytań TableAdapter. Pierwszy krok tego kreatora pyta nas, czy chcemy wykonywać zapytania o dane za pomocą instrukcji ad-hoc SQL, nowej procedury składowanej lub istniejącej. Wybierz pozycję Użyj instrukcji SQL i kliknij przycisk Dalej. Ponieważ będziemy zwracać wiersz, wybierz opcję SELECT, która zwraca wiersze, w drugim 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 Categories, 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 dla wzorca Fill a DataTable (Wypełnianie tabeli DataTable) i GetCategoryWithBinaryDataByCategoryID dla wzorca Return a DataTable (Zwracanie tabeli DataTable). Kliknij Zakończ, aby zakończyć kreatora.

Wybieranie nazw metod TableAdapter s

Rysunek 10. Wybierz nazwy metod TableAdapter (Kliknij, aby wyświetlić obraz pełnowymiarowy)

Uwaga

Po zakończeniu pracy Kreatora Konfiguracji Kwerendy Adaptera Tabel zostanie wyświetlone okno dialogowe z informacją, że nowy tekst polecenia zwraca dane z innym schematem 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 zapytań ad hoc SQL i wykorzystasz kreatora, aby zmodyfikować główne zapytanie TableAdaptera w pewnym późniejszym momencie, zmodyfikuje listę kolumn instrukcji GetCategoryWithBinaryDataByCategoryID metody SELECT, aby uwzględnić tylko te kolumny z zapytania głównego (czyli spowoduje to usunięcie kolumny Picture z zapytania). Musisz ręcznie zaktualizować listę kolumn, aby zwrócić kolumnę Picture, podobnie jak zrobiliśmy to z metodą GetCategoriesAndNumberOfProducts() we wcześniejszym kroku.

Po dodaniu dwóch DataColumn do CategoriesDataTable oraz metody GetCategoryWithBinaryDataByCategoryID do CategoriesTableAdapter, klasy w projektancie Typed DataSet powinny wyglądać jak zrzut ekranu na rysunku 11.

Projektant zestawu danych zawiera nowe kolumny i metodę

Rysunek 11. Projektant zestawu danych zawiera nowe kolumny i metodę

Aktualizowanie warstwy logiki biznesowej (BLL)

Po zaktualizowaniu DAL wystarczy rozszerzyć warstwę logiki biznesowej (BLL), aby dodać nową metodę CategoriesTableAdapter. Dodaj następującą metodę do klasy CategoriesBLL:

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

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 umożliwić użytkownikowi przekazywanie plików z komputera na serwer. W następnym samouczku skoncentrujemy się na integracji przesłanego pliku z modelem danych.

Nowa kontrolka FileUpload do ASP.NET 2.0 zapewnia możliwość przesyłania pliku z ich komputera na serwer. Kontrolka FileUpload jest renderowana jako element <input>, którego atrybut type jest ustawiony na wartość 'plik', i który przeglądarki wyświetlają 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 ze postbackiem. 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 stronę FileUpload.aspx w folderze BinaryData, przeciągnij kontrolkę FileUpload z przybornika do Projektanta, a następnie ustaw właściwość kontrolki ID na UploadTest. Następnie dodaj kontrolkę przycisku sieciowego, ustawiając właściwości ID i Text odpowiednio na UploadButton oraz "Przekaż wybrany plik". Na koniec umieść kontrolkę sieciową Etykieta pod przyciskiem, wyczyść właściwość Text i ustaw właściwość ID na wartość 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ę po wyświetleniu za pośrednictwem przeglądarki. Należy pamiętać, że kliknięcie przycisku Przeglądaj powoduje wyświetlenie okna dialogowego wyboru pliku, co umożliwia użytkownikowi wybranie pliku 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 na serwer

Rysunek 13. Użytkownik może wybrać plik do przekazania z komputera na serwer (kliknij, aby wyświetlić obraz o pełnym rozmiarze)

Podczas odsyłania danych, przekazany plik można zapisać w systemie plików lub można pracować bezpośrednio z jego danymi binarnymi, korzystając ze strumienia. 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ń dla UploadButton zdarzenia s Click i dodaj następujący kod:

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

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ł przesłany. Jeśli plik został przekazany, etykieta zawiera nazwę przekazanego pliku, jego rozmiar w bajtach i jego typ zawartości.

Uwaga

Aby upewnić się, że użytkownik przesłał plik, możesz sprawdzić HasFile właściwość i wyświetlić ostrzeżenie, jeśli jest to False, lub zamiast tego możesz użyć kontroli RequiredFieldValidator.

Mechanizm przesyłania plików zapisuje SaveAs(filePath) przesłany plik do określonej ścieżki pliku. 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 odpowiadającą jej ścieżkę fizyczną. W tym miejscu ścieżka wirtualna to ~/Brochures/fileName, gdzie fileName jest nazwą przekazanego pliku. Aby uzyskać więcej informacji na temat ścieżek wirtualnych i fizycznych, zobacz Server.MapPath Method oraz użycie Server.MapPath.

Po zakończeniu procedury obsługi zdarzenia Click, przetestuj 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 Eksploratorze rozwiązań. Plik, który właśnie przesłałeś, powinien być widoczny 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 o pełnym rozmiarze)

EvolutionValley.jpg został zapisany w folderze ~/Broszury

Rysunek 15. EvolutionValley.jpg Zapisano w folderze ~/Brochures

Subtelności dotyczące zapisywania przesłanych plików do systemu plików

Istnieje kilka subtelności, które należy rozwiązać podczas zapisywania plików przekazywanych 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 Internet Information Services (IIS) firmy Microsoft jako serwera internetowego, kontekst zabezpieczeń zależy od wersji usług IIS i jej konfiguracji.

Innym wyzwaniem zapisania plików w systemie plików jest nazewnictwo 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)? Z obecnym kodem plik użytkownika A zostanie nadpisany przez przesłanie 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. W przypadku tej metody, gdy użytkownik B próbuje przekazać plik o nazwie Brochure.pdf, system nie zapisze pliku, a zamiast tego 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 zapoznamy się z tymi opcjami.

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 plików większych niż 4 MB, chociaż można to skonfigurować za pomocą elementu <httpRuntime> w 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 będzie czekać 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 w przypadku przekazywania dużych plików. Ponieważ zawartość pliku jest wysyłana na serwer, użytkownik końcowy musi cierpliwie czekać bez potwierdzenia, że wysyłanie pliku 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. Istnieje wiele kontrolek przekazywania plików innych firm, które lepiej nadają się do obsługi dużych operacji przekazywania, a wielu z tych dostawców zapewnia wskaźniki postępu i menedżerów przekazywania ActiveX, które przedstawiają 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, stanowi szereg wyzwań. W tym samouczku zapoznaliśmy się z dwoma pierwszymi: umożliwiając podjęcie decyzji o tym, gdzie mają być przechowywane dane binarne, i umożliwiając 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świetlić 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 go uzyskać pod adresem mitchell@4GuysFromRolla.com.

Specjalne podziękowania

Ta seria samouczków została omówiona przez wielu przydatnych recenzentów. Główni recenzenci tego samouczka to Teresa Murphy i Bernadette Leigh. Chcesz przejrzeć nadchodzące artykuły MSDN? Jeśli tak, napisz do mnie na adres mitchell@4GuysFromRolla.com.