Поделиться через


Отправка файлов (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 пользователем, перетащив его из Обозреватель решений в представление конструктора страницы.

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

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

Наконец, добавьте эти страницы в качестве записей в Web.sitemap файл. В частности, добавьте следующую разметку после улучшения 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 ГБ двоичных данных image необходимо использовать тип данных. Однако при добавлении 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).

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

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

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

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

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

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

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

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

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

Создание рисунка с именем DataColumn, тип которого — System.Byte[]

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

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

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

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

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

Обновление списка столбцов в инструкции SELECT, чтобы также вернуть брошюруPath

Рис. 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 для заполнения dataTable и возвращайте шаблоны DataTable соответственно. Чтобы завершить работу мастера, нажмите кнопку Готово .

Выберите имена для методов 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 и Text его ID свойства в UploadButton и отправьте выбранный файл соответственно. Наконец, поместите веб-элемент управления Label под кнопкой, очистите его свойство и задайте для него Text значение ID UploadDetails.

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

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

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

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

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

После обратной передачи отправленный файл можно сохранить в файловой системе или его двоичные данные можно работать напрямую через 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это имя файла, в котором имя отправленного файла. Дополнительные сведения о виртуальных и физических путях и использовании Server.MapPathсм. в разделе Server.MapPath Methos.

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

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

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

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

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

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

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

Еще одна проблема сохранения файлов в файловой системе вращается вокруг именования файлов. В настоящее время наша страница сохраняет все отправленные файлы ~/Brochures в каталог, используя то же имя, что и файл на клиентском компьютере. Если пользователь А отправляет брошюру с именем Brochure.pdf, файл будет сохранен как ~/Brochure/Brochure.pdf. Но что делать, если некоторое время позже Пользователь B отправляет другой файл брошюры, который происходит с тем же именем файла (Brochure.pdf)? В коде, который у нас есть, файл User 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 года. Скотт работает независимым консультантом, тренером и писателем. Его последняя книга Сэмс Учит себя ASP.NET 2.0 в 24 часах. Он может быть достигнут в mitchell@4GuysFromRolla.com. или через его блог, который можно найти на http://ScottOnWriting.NET.

Особое спасибо

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