1. Введение
При создании приложений, управляемых данными, часто необходимо собирать текстовые и двоичные данные. Такой программе может потребоваться хранить изображения, PDF-файлы, файлы Word или другие двоичные данные. Есть два способа хранения этих двоичных данных: в файловой системе веб-сервера и добавление ссылки на соответствующий файл в базе данных или непосредственно в самой базе данных;
Текстовые данные, такие как строки, числа, даты, идентификаторы GUID, денежные значения и т. д., имеют соответствующие определения типов данных в системе базы данных. Например, в Microsoft SQL Server вы можете использовать тип данных int для хранения целочисленного значения, а для хранения строкового значения — тип varchar или nvarchar; Кроме того, база данных также предоставляет определения типов для хранения двоичных данных. В Microsoft SQL SERVER 2000 и более ранних версиях для хранения двоичных данных используется тип данных image; в SQL SERVER 2005 используется тип данных varbinary (MAX). Эти типы данных способны хранить двоичные данные размером до 2 ГБ, используя любой из двух вышеуказанных методов.
Однако при хранении двоичных данных непосредственно в базе данных требуется дополнительная работа по вставке, обновлению и извлечению двоичных данных. К счастью, мы можем абстрагировать эту сложную низкоуровневую операцию T-SQL с помощью библиотек доступа к данным более высокого уровня, таких как ADO.NET, и проблема становится довольно простой. Однако работа с двоичными данными через ADO.NET немного отличается от работы с текстовыми данными. В этой статье мы проанализируем, как использовать ADO.NET и элемент управления ASP.NET 2.0 SqlDataSource для хранения и извлечения файлов изображений непосредственно из базы данных. Пожалуйста, читайте дальше!
2. Сравнение хранения данных в базе данных и их хранения в файловой системе.
Как только что было сказано, при захвате двоичных данных в приложении двоичные данные могут храниться непосредственно в базе данных или в виде файла на сервере. файловая система – сохраняется только ссылка на файл в базе данных. По своему опыту я обнаружил, что большинство разработчиков предпочитают хранить двоичные данные в файловой системе, главным образом по следующим причинам:
· Требуется меньше усилий. Хранение и извлечение двоичных файлов, хранящихся в базе данных, требует больше усилий при написании кода. Более того, обновлять эти двоичные данные будет проще — не нужно связываться с базой данных, просто измените файл напрямую!
· URL-адреса, указывающие на файлы, более прямые. Как мы увидим в этой статье, чтобы обеспечить доступ к двоичным данным, хранящимся в базе данных, нам необходимо создать еще одну страницу ASP.NET, которая может возвращать эти данные. Обычно на эту страницу передается уникальный идентификатор, соответствующий соответствующей записи в базе данных (возвращающий ее двоичные данные). В результате для доступа к двоичным данным, например, к загруженному изображению, URL-адрес выглядит как http://www.yourserver.com/ShowImage.aspx?ID=4352 , тогда как если бы изображение хранилось непосредственно в файле In системе URL-адрес будет более прямым, например http://www.yourserver.com/UploadedImages/Sam.jpg.
· Улучшенная поддержка инструментов для отображения изображений. Если вы используете ASP.NET 2.0, вы можете использовать элемент управления ImageField в элементе управления GridView или DetailsView для отображения изображения (путь к нему хранится в базе данных). Однако, к сожалению, этот ImageField не может напрямую отображать данные изображения в базе данных (так как требует запроса к внешней странице и возврата соответствующих данных).
· Производительность. Поскольку двоичные файлы хранятся в файловой системе веб-сервера, а не в базе данных, приложение может получить доступ к меньшему количеству данных в базе данных, тем самым снижая требования к базе данных и, соответственно, уменьшая требования к Интернету и перегрузку сети между серверы баз данных.
Основное преимущество хранения данных непосредственно в базе данных заключается в том, что это делает данные «автономными». Теперь, когда все данные содержатся в базе данных, поддержка данных, перемещение данных между серверами баз данных, репликация базы данных и т. д. становятся намного проще, поскольку нет необходимости беспокоиться о копировании или резервном копировании двоичного содержимого, хранящегося в файловой системе.
Как всегда, выбор решения для хранения данных будет зависеть от фактического места использования и потребностей бизнеса. Например, я разработал клиент, в котором двоичные данные нужно было хранить в базе данных, поскольку используемое ими программное обеспечение для составления отчетов могло включать в отчет только двоичные данные, если они поступали из базы данных. В другом случае мой коллега работал над проектом, в котором двоичные файлы должны были использоваться веб-приложением и быть доступны через FTP, и в этом случае двоичные данные необходимо было хранить в файловой системе.
3. Создайте таблицу базы данных для хранения двоичных данных.
В оставшейся части этой статьи будет проанализировано простое приложение галереи изображений ASP.NET 2.0, которое я написал с использованием Microsoft SQL Server 2005 Express Edition, чтобы продемонстрировать непосредственные концепции, связанные с хранением и получением двоичных данных в база данных.
Модель данных этого приложения галереи изображений состоит из таблицы — Картинки, где каждая запись соответствует картинке в галерее. Поле MIMEType этой таблицы «Изображения» хранит MIME-тип загруженного изображения (image/jpeg для файлов JPG, image/gif для файлов GIF и т. д.). Здесь тип MIME указывает браузеру, как генерировать двоичные данные. Столбец ImageData хранит фактическое двоичное содержимое изображения.
4. Загрузите изображение и сохраните двоичные данные с помощью кода ADO.NET.
Эта галерея изображений позволяет посетителям загружать файлы изображений (форматы GIF, JPG и PNG) в это приложение. После загрузки в таблицу «Изображения» добавляется новая запись, а содержимое файла изображения сохраняется в столбце ImageData новой записи. Чтобы загрузить файлы из веб-браузера на веб-сервер в ASP.NET 2.0, в этом примере используется элемент управления FileUpload. Использовать элемент управления FileUpload очень просто — просто перетащите его с панели инструментов на свою страницу. В конечном итоге этот элемент управления FileUpload будет создан в браузере пользователя как стандартная форма загрузки файла — кнопка «Обзор» (при нажатии) позволяет пользователю выбрать файл со своего жесткого диска для загрузки на веб-сервер.
Например, чтобы создать интерфейс для добавления нового изображения, я использовал элемент управления TextBox для захвата заголовка изображения и элемент управления FileUpload, позволяющий пользователю указать изображение для загрузки:
<b>Title:</b>
<asp:TextBox ID="PictureTitle" runat="server" />
<бр />
<b>Изображение:</b>
<asp:FileUpload ID="UploadedFile" runat="server" />
<бр />
<asp:LinkButton ID="btnInsert" runat="server" Text="Insert" />
Приведенный выше код создает страницу, на которой пользователь может указать файл со своего жесткого диска для загрузки на веб-сервер.
Как только пользователь выбирает файл и отправляет форму (например, нажав кнопку «Вставить»), двоичное содержимое указанного файла отправляется на веб-сервер. Из серверного кода эти двоичные данные становятся доступными через свойство PostedFile.InputStream элемента управления FileUpload, как показано в следующей разметке и коде:
Protected Sub btnInsert_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnInsert . Нажмите
'Убедитесь, что файл успешно загружен
Если UploadedFile.PostedFile не имеет значения OrElse String.IsNullOrEmpty(UploadedFile.PostedFile.FileName) OrElse UploadedFile.PostedFile.InputStream не имеет значения, тогда
...отобразить сообщение об ошибке...
Выход из подзаголовка
Конец, если
«Убедитесь, что мы работаем с файлом JPG или GIF.
Расширение Dim As String = Path.GetExtension(UploadedFile.PostedFile.FileName).ToLower()
Dim MIMEType As String = Ничего
Выберите расширение дела
Дело ".gif"
MIMEType = "изображение/гиф"
Регистр ".jpg", ".jpeg", ".jpe"
MIMEType = "изображение/jpeg"
Дело ".png"
MIMEType = "изображение/png"
Другое дело
'Неверный тип файла для загрузки... отображается сообщение об ошибке...
Выход из подзаголовка
Конец Выберите
«Подключиться к базе данных и вставить новую запись в таблицу «Товары».
Использование myConnection как нового SqlConnection(ConfigurationManager.ConnectionStrings("ImageGalleryConnectionString").ConnectionString)
Const SQL As String = "INSERT INTO [Pictures] ([Title], [MIMEType], [ImageData]) VALUES (@Title, @MIMEType, @ Данные изображения)"
Уменьшить myCommand как новую SqlCommand (SQL, myConnection)
myCommand.Parameters.AddWithValue("@Title", PictureTitle.Text.Trim())
myCommand.Parameters.AddWithValue("@MIMEType", MIMEType)
'Загружаем входной поток элемента управления FileUpload в массив байтов
Dim imageBytes(UploadedFile.PostedFile.InputStream.Length) как байт
UploadedFile.PostedFile.InputStream.Read(imageBytes, 0, imageBytes.Length)
myCommand.Parameters.AddWithValue("@ImageData", imageBytes)
моеСоединение.Открыть()
мояКоманда.ExecuteNonQuery()
моеСоединение.Закрыть()
Завершить использование
End
SubHere: этот обработчик событий сначала гарантирует, что файл был загружен. Затем он определяет тип MIME на основе расширения загружаемого файла.
Самая примечательная часть вышеизложенного — это раздел кода, который устанавливает параметры @ImageData. Сначала создайте массив байтов с именем imageBytes и сделайте его длину равной соответствующему входному потоку загружаемого файла. Затем используйте метод Read из InputStream, чтобы заполнить двоичный контент в этом массиве байтов. Обратите внимание, что именно этот массив байтов указан как значение @ImageData.