Отправка файлов (VB)

Скотт Митчелл

Скачать в формате PDF

Узнайте, как разрешить пользователям отправлять двоичные файлы (например, документы Word или PDF) на веб-сайт, где они могут храниться в файловой системе сервера или в базе данных.

Введение

Все учебники, которые мы изучили до сих пор, работали исключительно с текстовыми данными. Однако многие приложения имеют модели данных, которые фиксируют как текстовые, так и двоичные данные. Веб-сайт знакомств может позволить пользователям отправлять фотографию для связи с их профилем. Веб-сайт подбора может позволить пользователям отправлять свое резюме в виде документа Microsoft Word или PDF.

Работа с двоичными данными добавляет новый набор проблем. Мы должны решить, как двоичные данные хранятся в приложении. Интерфейс, используемый для вставки новых записей, должен быть обновлен, чтобы разрешить пользователю отправлять файл с компьютера и выполнять дополнительные действия, чтобы отобразить или предоставить средства для скачивания связанных двоичных данных записи. В этом руководстве и следующих трех мы рассмотрим, как решить эти проблемы. В конце этих руководств мы создадим полностью функциональное приложение, которое связывает рисунок и PDF-брошюру с каждой категорией. В этом руководстве мы рассмотрим различные методы хранения двоичных данных и узнайте, как разрешить пользователям отправлять файл с компьютера и сохранять их в файловой системе веб-сервера.

Примечание.

Двоичные данные, которые являются частью модели данных приложения, иногда называются BLOB-объектом, акронимом для больших двоичных объектов OBject. В этих руководствах я выбрал использовать терминологию двоичных данных, хотя термин BLOB является синонимом.

Шаг 1. Создание веб-страниц для работы с двоичными данными

Прежде чем приступить к изучению проблем, связанных с добавлением поддержки двоичных данных, сначала рассмотрим возможность создания страниц ASP.NET в нашем проекте веб-сайта, необходимых для этого руководства и следующих трех. Сначала добавьте новую папку с именем BinaryData. Затем добавьте в нее следующие ASP.NET страницы, чтобы связать каждую страницу с главной страницей Site.master :

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

Добавьте страницы ASP.NET для учебных пособий, связанных с двоичными данными

Рис. 1. Добавление страниц ASP.NET для учебников, связанных с двоичными данными

Как и в других папках, Default.aspx в папке BinaryData будет перечислять учебники в своем разделе. Помните, что элемент SectionLevelTutorialListing.ascx управления пользователем предоставляет эту функцию. Поэтому добавьте этот элемент управления пользователя Default.aspx, перетащив его из Проводника решений в режим проектирования страницы.

Добавьте элемент управления пользователем SectionLevelTutorialListing.ascx в Default.aspx

Рис. 2: Добавьте элемент управления SectionLevelTutorialListing.ascx в Default.aspx (Щелкните, чтобы просмотреть изображение полного размера)

Наконец, добавьте эти страницы в качестве записей в Web.sitemap файл. В частности, добавьте следующую разметку после блока «Enhancing the 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>

После обновления Web.sitemap просмотрите веб-сайт инструкций через браузер. Меню слева теперь содержит элементы для учебников по работе с двоичными данными.

Карта сайта теперь включает записи руководств по работе с двоичными данными.

Рис. 3. Карта сайта теперь содержит разделы для руководств по работе с двоичными данными.

Шаг 2. Выбор места хранения двоичных данных

Двоичные данные, связанные с моделью данных приложения, могут храниться в одном из двух мест: на файловой системе веб-сервера с ссылкой на файл, хранящийся в базе данных; или непосредственно в самой базе данных (см. рис. 4). Каждый подход имеет свой собственный набор плюсов и минусов и заслуживает более подробного обсуждения.

Двоичные данные можно хранить в файловой системе или непосредственно в базе данных.

Рис. 4. Двоичные данные можно хранить в файловой системе или непосредственно в базе данных (щелкните, чтобы просмотреть изображение полного размера)

Представьте, что мы хотели расширить базу данных Northwind, чтобы связать рисунок с каждым продуктом. Одним из вариантов будет хранение этих файлов изображений в файловой системе веб-сервера и запись пути в Products таблице. При таком подходе мы добавим ImagePath столбец в Products таблицу типа varchar(200), возможно. Когда пользователь отправил рисунок для Chai, этот рисунок может храниться в файловой системе ~/Images/Tea.jpgвеб-сервера, где ~ представляет физический путь приложения. То есть, если веб-сайт коренится по физическому пути C:\Websites\Northwind\, ~/Images/Tea.jpg будет эквивалентен C:\Websites\Northwind\Images\Tea.jpg. После отправки файла изображения мы обновим запись Chai в Products таблице, чтобы его ImagePath столбец ссылался на путь нового образа. Мы могли бы использовать ~/Images/Tea.jpg или просто Tea.jpg , если мы решили, что все образы продуктов будут помещены в папку приложения Images .

Основными преимуществами хранения двоичных данных в файловой системе являются:

  • Простота реализации , как мы увидим в ближайшее время, хранение и извлечение двоичных данных, хранящихся непосредственно в базе данных, включает в себя немного больше кода, чем при работе с данными через файловую систему. Кроме того, чтобы пользователь просматривал или скачивали двоичные данные, они должны быть представлены с URL-адресом данных. Если данные находятся в файловой системе веб-сервера, URL-адрес прост. Однако если данные хранятся в базе данных, необходимо создать веб-страницу, которая будет извлекать и возвращать данные из базы данных.
  • Более широкий доступ к двоичным данным может потребоваться, чтобы другие службы или приложения могли получить доступ к данным, потому что они не могут извлекать данные из базы данных. Например, изображения, связанные с каждым продуктом, также могут быть доступны пользователям через FTP, в этом случае мы хотим хранить двоичные данные в файловой системе.
  • Производительность , если двоичные данные хранятся в файловой системе, спрос и сетевой перегрузка между сервером базы данных и веб-сервером будет меньше, чем если двоичные данные хранятся непосредственно в базе данных.

Основной недостаток хранения двоичных данных в файловой системе заключается в том, что он отделяет данные от базы данных. Если запись удаляется из Products таблицы, связанный файл на файловой системе веб-сервера не удаляется автоматически. Необходимо написать дополнительный код, чтобы удалить файл или файловую систему будет загромождать неиспользуемые потерянные файлы. Кроме того, при резервном копировании базы данных необходимо также создать резервные копии связанных двоичных данных в файловой системе. Перемещение базы данных на другой сайт или сервер создает аналогичные проблемы.

Кроме того, двоичные данные можно хранить непосредственно в базе данных Microsoft SQL Server 2005, создав столбец типа varbinary. Как и в других типах данных переменной длины, можно указать максимальную длину двоичных данных, которые можно хранить в этом столбце. Например, чтобы зарезервировать не больше 5000 байт, используйте varbinary(5000); varbinary(MAX) позволяет использовать максимальный размер хранилища, примерно 2 ГБ.

Основное преимущество хранения двоичных данных непосредственно в базе данных — жесткое связывание между двоичными данными и записью базы данных. Это значительно упрощает задачи администрирования базы данных, такие как резервное копирование или перемещение базы данных на другой сайт или сервер. Кроме того, при удалении записи автоматически удаляются соответствующие двоичные данные. Существуют также более тонкие преимущества хранения двоичных данных в базе данных.

Примечание.

В Microsoft SQL Server 2000 и более ранних версиях varbinary тип данных имел максимальное ограничение в 8 000 байт. Для хранения до 2 ГБ двоичных данных необходимо использовать тип данных . Однако с появлением MAX в SQL Server 2005 тип данных image был признан устаревшим. Она по-прежнему поддерживается для обратной совместимости, но корпорация Майкрософт объявила, что image тип данных будет удален в будущей версии SQL Server.

Если вы работаете с более старой моделью данных, вы можете увидеть тип данных image. Таблица базы данных Categories Northwind содержит столбец Picture, который можно использовать для хранения бинарных данных файла изображения для категории. Так как база данных Northwind имеет свои корни в Microsoft Access и более ранних версиях SQL Server, этот столбец имеет тип image.

В этом руководстве и следующих трёх руководствах мы будем использовать оба подхода. В Categories таблице уже есть Picture столбец для хранения двоичного содержимого изображения для категории. Мы добавим дополнительный столбец, BrochurePath, для хранения пути к PDF-файлу в файловой системе веб-сервера, который может использоваться для предоставления качественного, пригодного для печати обзора категории.

Шаг 3. Добавление столбцаBrochurePathв таблицуCategories

В настоящее время таблица категорий содержит только четыре столбца: CategoryID, CategoryName, Descriptionи Picture. В дополнение к этим полям необходимо добавить новый, указывающий на брошюру категории (если она существует). Чтобы добавить этот столбец, перейдите в обозреватель серверов, разверните таблицы, щелкните таблицу правой кнопкой мыши Categories и выберите команду "Открыть определение таблицы" (см. рис. 5). Если обозреватель сервера не отображается, откройте его, выбрав параметр обозревателя серверов в меню "Вид" или нажмите клавиши CTRL+ALT+S.

Добавьте новый varchar(200) столбец в Categories таблицу, который называется BrochurePath и допускает NULL, затем нажмите значок "Сохранить" (или нажмите Ctrl+S).

Добавление столбца BrochurePath в таблицу категорий

Рис. 5. Добавление столбца BrochurePath в Categories таблицу (щелкните, чтобы просмотреть изображение полного размера)

Шаг 4. Обновление архитектуры для использования Picture и BrochurePath столбцов

CategoriesDataTable в уровне доступа данных (DAL) в настоящее время определены четыре DataColumn: CategoryID, CategoryName, Description и NumberOfProducts. При первоначальном создании этой таблицы данных в учебнике Создание уровня доступа к данным в ней было только три первых столбца; столбец CategoriesDataTable был добавлен в учебнике Мастер/подробности с использованием маркированного списка главных записей и списка данных подробностей.

Как описано в разделе "Создание уровня доступа к данным", данные в типизированном наборе данных составляют бизнес-объекты. TableAdapters отвечает за взаимодействие с базой данных и заполнение бизнес-объектов результатами запроса. Заполняется CategoriesDataTable с помощью CategoriesTableAdapter, который имеет три метода извлечения данных:

  • GetCategories()выполняет основной запрос TableAdapter и возвращает CategoryIDCategoryNameDescription поля всех записей в Categories таблице. Основной запрос — это то, что используется автоматически созданными Insert и Update методами.
  • GetCategoryByCategoryID(categoryID) возвращает поля CategoryID, CategoryName и Description категории, чей CategoryID равен идентификатору категории.
  • GetCategoriesAndNumberOfProducts() — возвращает поля CategoryID, CategoryName и Description для всех записей в таблице Categories. Кроме того, для возврата количества продуктов, связанных с каждой категорией, используется вложенный запрос.

Обратите внимание, что ни один из этих запросов не возвращает таблицы Categories или столбцы Picture, и CategoriesDataTable также не предоставляет DataColumn для этих полей. Чтобы работать с рисунком и BrochurePath свойствами, сначала необходимо добавить их в CategoriesDataTable, а затем обновить класс CategoriesTableAdapter, чтобы он возвращал эти столбцы.

PictureДобавление иBrochurePath``DataColumn s

Начните с добавления этих двух столбцов в CategoriesDataTable. Щелкните правой кнопкой мыши на заголовке CategoriesDataTable, выберите "Добавить" в контекстном меню, а затем выберите опцию "Столбец". Это создаст новое DataColumn в DataTable с именем Column1. Переименуйте этот столбец в Picture. В окне свойств установите для свойства DataType значение DataColumn, которое не появляется в раскрывающемся списке; его необходимо ввести вручную с System.Byte[].

Создайте DataColumn с именем Picture и типом данных System.Byte[]

Рис. 6. Создание именованного DataColumnPictureDataTypeSystem.Byte[] объекта( щелкните, чтобы просмотреть изображение полного размера)

Добавьте другой DataColumn в DataTable, назвав его BrochurePath и используя значение по умолчанию DataType (System.String).

Возврат значений Picture и BrochurePath из TableAdapter

С добавлением этих двух DataColumn в CategoriesDataTable, мы готовы обновить CategoriesTableAdapter. Мы могли бы вернуть оба этих значения столбцов в основном запросе TableAdapter'а, но это будет возвращать эти двоичные данные при каждом вызове метода GetCategories(). Вместо этого давайте обновим основной запрос TableAdapter, чтобы вернуть BrochurePath и создать дополнительный метод извлечения данных, возвращающий определенный столбец категории Picture .

Чтобы обновить основной запрос TableAdapter, щелкните правой кнопкой мыши заголовок CategoriesTableAdapter и в контекстном меню выберите "Настроить". Откроется мастер настройки адаптера таблиц, который мы видели в нескольких предыдущих руководствах. Обновите запрос, чтобы вернуть BrochurePath и нажмите кнопку "Готово".

Обновите список столбцов в инструкции SELECT, чтобы также возвращать BrochurePath

Рис. 7. Обновление списка столбцов в операторе SELECT для возврата BrochurePath (щелкните, чтобы просмотреть изображение в полном размере)

При использовании нерегламентированных инструкций SQL для TableAdapter обновление списка столбцов в основном запросе обновляет список столбцов для всех SELECT методов запроса в TableAdapter. Это означает, что GetCategoryByCategoryID(categoryID) метод был обновлен для возврата столбца BrochurePath , который может быть тем, что мы планировали. Однако он также обновил список столбцов в методе GetCategoriesAndNumberOfProducts() , удалив вложенный запрос, который возвращает количество продуктов для каждой категории! Поэтому нам нужно обновить запрос этого метода SELECT . Щелкните метод правой GetCategoriesAndNumberOfProducts() кнопкой мыши, выберите "Настроить" и верните SELECT запрос обратно к исходному значению:

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

Затем создайте новый метод TableAdapter, который возвращает значение столбца Picture определенной категории. Щелкните правой кнопкой мыши CategoriesTableAdapter заголовок и выберите параметр "Добавить запрос", чтобы запустить мастер настройки запросов TableAdapter. Первый шаг этого мастера спрашивает нас о том, нужно ли запрашивать данные с помощью нерегламентированной инструкции SQL, новой хранимой процедуры или существующей. Выберите "Использовать инструкции SQL" и нажмите кнопку "Далее". Так как мы возвращаем строку, выберите параметр SELECT, который возвращает строки на втором шаге.

Выберите параметр

Рис. 8. Выберите параметр "Использовать инструкции SQL" (щелкните, чтобы просмотреть изображение полного размера)

Так как запрос вернет запись из таблицы категорий, выберите SELECT, который возвращает строки.

Рис. 9. Так как запрос вернет запись из таблицы категорий, выберите select, который возвращает строки (щелкните, чтобы просмотреть изображение полного размера)

На третьем шаге введите следующий SQL-запрос и нажмите кнопку Далее:

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

Последний шаг — выбрать имя нового метода. Используйте FillCategoryWithBinaryDataByCategoryID и GetCategoryWithBinaryDataByCategoryID для паттернов заполнения таблицы данных и возвращения таблицы данных соответственно. Чтобы завершить работу мастера, нажмите Готово.

Выберите имена для методов TableAdapter

Рис. 10. Выберите имена для методов TableAdapter (щелкните, чтобы просмотреть изображение полного размера)

Примечание.

После завершения работы мастера настройки запросов адаптера таблицы может появиться диалоговое окно, информирующее о том, что новый текст команды возвращает данные по схеме, отличающейся от схемы основного запроса. Короче говоря, мастер отмечает, что основной запрос GetCategories() TableAdapter возвращает другую схему, отличную от только что созданной. Но это то, что мы хотим, поэтому вы можете игнорировать это сообщение.

Кроме того, помните, что если вы используете нерегламентированные инструкции SQL и используете мастер для изменения основного запроса TableAdapter в какой-то момент времени, он изменит GetCategoryWithBinaryDataByCategoryID список столбцов инструкций метода SELECT , чтобы включить только эти столбцы из основного запроса (то есть это приведет к удалению Picture столбца из запроса). Необходимо вручную обновить список столбцов, чтобы вернуть Picture столбец, аналогичный тому, что мы сделали с методом GetCategoriesAndNumberOfProducts() ранее на этом шаге.

После добавления двух DataColumn к CategoriesDataTable и метода GetCategoryWithBinaryDataByCategoryID к CategoriesTableAdapter, эти классы в конструкторе типизированных наборов данных должны выглядеть как на рисунке 11.

Конструктор наборов данных включает новые столбцы и метод

Рис. 11. Конструктор наборов данных включает новые столбцы и метод

Обновление уровня бизнес-логики (BLL)

После обновления DAL осталось только расширить уровень бизнес-логики (BLL), чтобы добавить новый метод CategoriesTableAdapter. Добавьте приведенный ниже метод в класс CategoriesBLL:

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

Шаг 5. Отправка файла из клиента на веб-сервер

При сборе двоичных данных часто эти данные предоставляются конечным пользователем. Чтобы получить эти сведения, пользователю необходимо иметь возможность отправить файл с компьютера на веб-сервер. Затем загруженные данные необходимо интегрировать с моделью данных, что может означать сохранение файла в файловой системе веб-сервера и добавление пути к файлу в базе данных или запись двоичного содержимого непосредственно в базу данных. На этом шаге мы рассмотрим, как разрешить пользователю отправлять файлы с компьютера на сервер. В следующем руководстве мы рассмотрим интеграцию отправленного файла с моделью данных.

ASP.NET 2.0 новый веб-элемент управления FileUpload предоставляет механизм отправки файла с компьютера на веб-сервер. Элемент управления FileUpload отображается как <input> элемент, атрибут которого type имеет значение file, которое браузеры отображают как текстовое поле с кнопкой "Обзор". При нажатии кнопки "Обзор" откроется диалоговое окно, из которого пользователь может выбрать файл. Когда форма отправляется обратно, содержимое выбранного файла отправляется вместе с постбеком. На стороне сервера сведения о отправленном файле доступны с помощью свойств элемента управления FileUpload.

Чтобы продемонстрировать отправку файлов, откройте FileUpload.aspx страницу в BinaryData папке, перетащите элемент управления FileUpload из панели элементов в конструктор и задайте для свойства элемента управления ID значение UploadTest. Затем добавьте веб-элемент управления Button, установив его свойства ID и Text на UploadButton и "Загрузить выбранный файл" соответственно. Наконец, поместите веб-элемент управления Label под кнопкой, очистите его свойство Text, а затем установите его свойство ID в UploadDetails.

Добавление элемента управления FileUpload на страницу ASP.NET

Рис. 12. Добавление элемента управления FileUpload на страницу ASP.NET (щелкните, чтобы просмотреть изображение полного размера)

На рисунке 13 показана эта страница при просмотре через браузер. Обратите внимание, что при нажатии кнопки "Обзор" откроется диалоговое окно выбора файла, позволяющее пользователю выбрать файл с компьютера. После выбора файла нажатие кнопки "Отправить выбранный файл" вызывает обратную передачу, которая отправляет двоичное содержимое выбранного файла на веб-сервер.

Пользователь может выбрать файл для отправки с компьютера на сервер

Рис. 13. Пользователь может выбрать файл для отправки с компьютера на сервер (щелкните, чтобы просмотреть изображение полного размера)

После postback отправленный файл можно сохранить в файловой системе или с его двоичными данными можно работать напрямую через Stream. В этом примере давайте создадим папку и сохраните загруженный ~/Brochures файл там. Начните с добавления Brochures папки на сайт в качестве вложенной папки корневого каталога. Затем создайте обработчик UploadButton события Click и добавьте следующий код:

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

Элемент управления FileUpload предоставляет различные свойства для работы с отправленными данными. Например, свойство указывает,HasFileбыл ли файл отправлен пользователем, а FileBytes свойство предоставляет доступ к отправленным двоичным данным в виде массива байтов. Обработчик Click событий сначала проверяет, что файл был загружен. Если файл был отправлен, метка отображает имя отправленного файла, его размер в байтах и тип контента.

Примечание.

Чтобы убедиться, что пользователь отправляет файл, можно проверить HasFile свойство и отобразить предупреждение, если оно задано False, или вместо этого можно использовать элемент управления RequiredFieldValidator.

FileUpload сохраняет SaveAs(filePath) отправленный файл в указанный filePath. filePath должен быть физическим путем(C:\Websites\Brochures\SomeFile.pdf), а не виртуальнымпутем ()./Brochures/SomeFile.pdf Метод Server.MapPath(virtPath) принимает виртуальный путь и возвращает соответствующий физический путь. Здесь виртуальный путь — ~/Brochures/fileName, где fileName — это имя загруженного файла. Дополнительные сведения о виртуальных и физических путях и их использовании см. в разделе Метод Server.MapPath и Server.MapPath.

После завершения выполнения обработчика события Click уделите немного времени, чтобы проверить страницу в браузере. Нажмите кнопку «Обзор», выберите файл на жестком диске, затем нажмите кнопку «Загрузить выбранный файл». Обратная передача отправит содержимое выбранного файла на веб-сервер, который затем отобразит сведения о файле, прежде чем сохранять его в папке ~/Brochures . После загрузки файла вернитесь в Visual Studio и нажмите кнопку "Обновить" в обозревателе решений. Вы должны увидеть только что загруженный файл в папке ~/Brochures!

Файл EvolutionValley.jpg был отправлен на веб-сервер

Рис. 14. Файл EvolutionValley.jpg был отправлен на веб-сервер (щелкните, чтобы просмотреть изображение полного размера)

EvolutionValley.jpg сохранен в папке ~/Брошюры

Рис. 15. EvolutionValley.jpg Сохранено в папке ~/Brochures

Тонкости при сохранении отправленных файлов в файловую систему

При сохранении загружаемых файлов в файловую систему веб-сервера необходимо учитывать несколько тонкостей. Во-первых, возникает проблема безопасности. Чтобы сохранить файл в файловой системе, контекст безопасности, в котором выполняется страница ASP.NET, должна иметь разрешения на запись. Веб-сервер разработки ASP.NET выполняется в контексте текущей учетной записи пользователя. Если вы используете Microsoft Internet Information Services (IIS) в качестве веб-сервера, контекст безопасности зависит от версии IIS и его конфигурации.

Еще одна проблема сохранения файлов в файловой системе вращается вокруг именования файлов. В настоящее время наша страница сохраняет все отправленные файлы ~/Brochures в каталог, используя то же имя, что и файл на клиентском компьютере. Если пользователь А отправляет брошюру с именем Brochure.pdf, файл будет сохранен как ~/Brochure/Brochure.pdf. Но что делать, если некоторое время спустя Пользователь B отправит другой файл брошюры, который случайно имеет то же имя файла (Brochure.pdf)? В нашем текущем коде файл пользователя A будет перезаписан загрузкой пользователя B.

Существует ряд методов разрешения конфликтов имен файлов. Один из вариантов заключается в том, чтобы запретить отправку файла, если он уже существует с тем же именем. При таком подходе, когда пользователь B пытается отправить файл с именем Brochure.pdf, система не сохранит свой файл и вместо этого отобразит сообщение, информирующее пользователя B переименовать файл и повторить попытку. Другой подход заключается в сохранении файла с использованием уникального имени файла, который может быть глобально уникальным идентификатором (GUID) или значением из соответствующих столбцов первичного ключа базы данных (если отправка связана с определенной строкой в модели данных). В следующем руководстве мы рассмотрим эти параметры более подробно.

Проблемы, связанные с очень большими объемами двоичных данных

В этих руководствах предполагается, что двоичные данные, захваченные, являются скромными по размеру. Работа с очень большими объемами двоичных файлов данных, которые являются несколькими мегабайтами или большими, представляют новые проблемы, которые выходят за рамки этих учебников. Например, по умолчанию ASP.NET отклоняет загрузку более 4 МБ, хотя это можно настроить с помощью <httpRuntime> элемента в Web.config. IIS также накладывает собственные ограничения размера отправки файлов. Кроме того, время, затраченное на отправку больших файлов, может превышать 110 секунд, ASP.NET будет ожидать запроса. При работе с большими файлами также возникают проблемы с памятью и производительностью.

Элемент управления FileUpload неподходящий для загрузки больших файлов. По мере того как содержимое файла отправляется на сервер, конечный пользователь должен терпеливо ждать без подтверждения, что их отправка выполняется. Это не так много проблем при работе с меньшими файлами, которые могут быть отправлены в течение нескольких секунд, но может быть проблемой при работе с большими файлами, которые могут занять минуты для отправки. Существуют различные сторонние элементы управления загрузкой файлов, которые лучше подходят для обработки больших объёмов загрузки. Многие из этих поставщиков предоставляют индикаторы хода выполнения и диспетчеры загрузки ActiveX, которые обеспечивают более гладкий пользовательский опыт.

Если приложение должно обрабатывать большие файлы, необходимо тщательно изучить проблемы и найти подходящие решения для конкретных потребностей.

Итоги

Создание приложения, которое должно записывать двоичные данные, представляет ряд проблем. В этом руководстве мы изучили первые два: выбор места хранения двоичных данных и предоставление пользователю возможности отправлять двоичное содержимое через веб-страницу. В следующих трех руководствах мы посмотрим, как связать отправленные данные с записью в базе данных, а также как отобразить двоичные данные вместе с текстовыми полями данных.

Счастливое программирование!

Дополнительные материалы

Дополнительные сведения о разделах, описанных в этом руководстве, см. в следующих ресурсах:

Об авторе

Скотт Митчелл, автор семи книг ASP/ASP.NET и основатель 4GuysFromRolla.com, работает с технологиями Microsoft Web с 1998 года. Скотт работает независимым консультантом, тренером и писателем. Его последняя книга Sams обучает ASP.NET 2.0 за 24 часа. С ним можно связаться по адресу mitchell@4GuysFromRolla.com.

Особое спасибо кому

Эта серия учебников была проверена многими полезными рецензентами. Ведущими рецензентами этого руководства были Тереса Мерфи и Бернадетт Ли. Хотите просмотреть мои предстоящие статьи MSDN? Если да, напишите мне на mitchell@4GuysFromRolla.com.