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

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

Скачивание примера приложения или Загрузка PDF-файла

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

Введение

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

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

Note

Двоичные данные, которые являются частью модели данных приложения, иногда называют 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, перетащив его из обозреватель решений на страницу s представление конструирования.

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

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

Наконец, добавьте эти страницы в качестве записей в файл Web.sitemap. В частности, добавьте следующую разметку после улучшения <siteMapNode>GridView:

<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, если мы решили, что все образы продуктов будут помещены в папку Application s Images.

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

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

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

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

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

Note

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

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

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

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

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

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

добавить столбец Брочурепас в таблицу Categories

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

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

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

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

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

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

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

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

создать столбец данных с именем Picture, DataType которого имеет тип System. Byte []

Рис. 6. Создание DataColumn с именем Picture, для которого DataType System.Byte[] (щелкните, чтобы просмотреть изображение с полным размером)

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

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

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

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

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

Рис. 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 s и выберите пункт Добавить запрос, чтобы запустить мастер настройки запроса адаптера таблицы. Первый шаг этого мастера запрашивает у нас запрос данных с помощью специального оператора SQL, новой хранимой процедуры или существующей. Выберите использовать инструкции SQL и нажмите кнопку Далее. Так как мы будем возвращать строку, выберите параметр выбрать, возвращающий строки на втором шаге.

выберите параметр использовать инструкции SQL

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

, так как запрос вернет запись из таблицы Categories, выберите команду выбрать, которая возвращает строки.

Рис. 9. Поскольку запрос будет возвращать запись из таблицы Categories, выберите команду выбрать, которая возвращает строки (щелкните, чтобы просмотреть изображение с полным размером).

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

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

Последним шагом является выбор имени для нового метода. Используйте FillCategoryWithBinaryDataByCategoryID и GetCategoryWithBinaryDataByCategoryID для заполнения DataTable и возврата шаблонов DataTable соответственно. Нажмите кнопку Готово, чтобы завершить работу с мастером.

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

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

Note

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

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

После добавления двух DataColumn s в 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 s New веб-элемент управления FileUpload предоставляет пользователям механизм для отправки файла с компьютера на веб-сервер. Элемент управления FileUpload готовится к просмотру как элемент <input>, атрибут type которого имеет значение File, в котором браузеры отображаются как текстовое поле с кнопкой обзора. При нажатии кнопки «Обзор» открывается диалоговое окно, из которого пользователь может выбрать файл. При обратной передаче формы выбранное содержимое файла отправляется вместе с обратной передачей. На стороне сервера сведения о отправленном файле доступны через свойства элемента управления FileUpload.

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

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

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

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

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

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

При обратной передаче переданный файл может быть сохранен в файловой системе, или его двоичные данные могут работать непосредственно через поток. В этом примере давайте создадим ~/Brochures папку и сохраните в ней отправленный файл. Сначала добавьте папку Brochures на сайт в качестве вложенной папки корневого каталога. Затем создайте обработчик событий для события UploadButton s 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 запускает, гарантируя, что файл был отправлен. Если файл был передан, метка отображает имя отправленного файла, его размер в байтах и его тип содержимого.

Note

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

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

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

файл Еволутионваллэй. jpg отправлен на веб-сервер

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

Еволутионваллэй. jpg сохранен в папку ~/Брочурес

Рис. 15. EvolutionValley.jpg был сохранен в папку ~/Brochures

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

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

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

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

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

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

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

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

Сводка

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

Поздравляем с программированием!

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

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

Об авторе

Скотт Митчелл, автор семи книг по ASP/ASP. NET и основатель 4GuysFromRolla.com, работал с веб-технологиями Майкрософт с 1998. Скотт работает как независимый консультант, преподаватель и модуль записи. Его последняя книга — Sams обучать себя ASP.NET 2,0 за 24 часа. Он доступен по адресу mitchell@4GuysFromRolla.com. или через его блог, который можно найти по адресу http://ScottOnWriting.NET.

Специальная благодарность

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