5. Загрузите изображения и сохраните двоичные данные с помощью кода управления источником данных ASP.NET 2.0.
Хотя метод ADO.NET работает в контексте приложения ASP.NET 2.0, вы также можете использовать элементы управления источниками данных ASP.NET 2.0 для хранения двоичных данных.
Данныедвоичные данные хранятся в базе данных, что не требует написания кода ADO.NET. Элемент управления SqlDataSource, используемый в этой демонстрационной программе, содержит InsertCommand и параметры, соответствующие значениям Title, MIMEType и ImageData:
InsertCommand="INSERT INTO [Pictures] ([Title], [MIMEType], [ImageData]) ЗНАЧЕНИЯ (@Title, @MIMEType, @ImageData)">
<asp:Parameter Name="Title" Type="String" />
<asp:Parameter Name="MIMEType" Type="String" />
<asp:Имя параметра="ImageData" />
</ВставитьПараметры>
</asp:SqlDataSource>
Обратите внимание, что здесь параметр ImageData не указывает тип. Если вы попытаетесь использовать мастер графического интерфейса для создания синтаксиса SqlDataSource, он, вероятно, укажет для него Type="Object". Однако этот Type="Object" создаст параметр типа sql_variant. Однако тип sql_variants нельзя использовать для хранения изображений или типов данных varbinary (MAX), поскольку внутренний размер данных sql_variant не может превышать 8000 байт. (Если вы попытаетесь использовать Type="Object", а затем попытаетесь сохранить двоичные данные, размер которых превышает 8000 байт, система выдаст исключение с сообщением "Параметр '@ImageData' превышает ограничение размера для типа данных sql_variant"; Если вы попытаетесь добавить двоичные данные размером менее 8000 байт, в исключении отобразится сообщение «Неявное преобразование типа данных sql_variant в varbinary(max) не разрешено».
Кроме того, элемент управления DetailsView содержит два поля TemplateField. Среди них элемент управления TextBox используется в одном TemplateField для отображения строки заголовка; другой использует элемент управления FileUpload для представления панели ImageData. Конечным результатом является пользовательский интерфейс, похожий на тот, что описан в разделе «Загрузка изображений и хранение двоичных данных с помощью кода ADO.NET». При нажатии кнопки «Вставить» в DetailsView запускается событие Inserting. В это время двоичные данные должны быть получены из элемента управления FileUpload, прочитаны в массив байтов и присвоены соответствующим параметрам:
Protected Sub UploadPictureUI_ItemInserting(ByVal). отправитель как объект, по значению и как System.Web.UI.WebControls.DetailsViewInsertEventArgs) обрабатывает UploadPictureUI.ItemInserting
'Ссылка на элемент управления FileUpload Dim UploadedFile As FileUpload = CType(UploadPictureUI.FindControl("UploadedFile"), FileUpload)
'Убедитесь, что файл успешно загружен.If UploadedFile.PostedFile Is Nothing OrElse String.IsNullOrEmpty(UploadedFile.PostedFile.FileName) OrElse UploadedFile .PostedFile .InputStream тогда ничего не значит
...отобразить сообщение об ошибке...
e.Cancel = Истина
Выход из подзаголовка
End If
'Убедитесь, что мы имеем дело с файлом 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"
Другое дело
'Неверный тип файла для загрузки... отображается сообщение об ошибке...
e.Cancel = Истина
Выход из подзаголовка
Конец Выберите
«Укажите значения параметров MIMEType и ImageData».
e.Values("MIMEType") = MIMEType
'Загружаем входной поток FileUpload в массив байтов
Dim imageBytes(UploadedFile.PostedFile.InputStream.Length) как байт
UploadedFile.PostedFile.InputStream.Read(imageBytes, 0, imageBytes.Length)
e.Values("ImageData") = imageBytes
End Sub
Как и обработчик событий Click предыдущей кнопки «Вставить», обработчик событий Inserting элемента DetailsView также выполняет ту же логику — есть лишь некоторые незначительные синтаксические различия. Во-первых, поскольку элемент управления FileUpload находится внутри шаблона, на него необходимо ссылаться программно с помощью метода FindControl("controlID"). После ссылки на него выполняются те же проверки, чтобы убедиться, что файл был успешно загружен и разрешено соответствующее расширение. Небольшое отличие от обработчика событий Inserting в DetailsView заключается в том, что в случае возникновения ошибки нам необходимо уведомить DetailsView о прекращении соответствующей работы по вставке — это достигается путем установки свойства e.Cancel в значение True.
После проверки параметры MIMEType и ImageData будут назначены с использованием синтаксиса e.Values("parameterName")=value. Как и в предыдущем примере ADO.NET, сначала считайте двоичные данные в массив байтов, а затем назначьте массив байтов параметру.
6. Отображение двоичного содержимого.
Независимо от того, какую технологию вы используете для хранения данных в базе данных, для извлечения и отображения двоичных данных нам необходимо создать новую страницу ASP.NET. Страница с именем ShowPicture.aspx передаст ей PictureID через строку запроса и вернет двоичные данные из поля ImageData указанного продукта. После завершения определенное изображение можно увидеть, посетив адрес /ShowPicture.aspx?PictureID=picutreID. Следовательно, чтобы отобразить изображение на веб-странице, мы можем использовать элемент управления изображением и установить для его свойства ImageUrl соответствующий URL-адрес.
Обратите внимание, что ShowPicture.aspx не включает HTML-теги на своей странице .aspx. В обработчике событий Page_Load класса выделенного кода код ADO.NET будет использоваться для получения MIMEType и ImageData указанной строки изображений из базы данных. Затем для ContentType страницы устанавливается значение поля MIMEType, а двоичные данные выводятся с помощью Response.BinaryWrite(ImageData):
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me. Нагрузка
Dim PictureID As Integer = Convert.ToInt32(Request.QueryString("PictureID"))
'Подключаемся к базе данных и возвращаем содержимое изображения и MIME-тип указанного изображения, используя myConnection As New SqlConnection(ConfigurationManager.ConnectionStrings("ImageGalleryConnectionString"). ConnectionString)
Const SQL As String = «ВЫБЕРИТЕ [MIMEType], [ImageData] FROM [Pictures] WHERE [PictureID] = @PictureID»
Уменьшить myCommand как новую SqlCommand (SQL, myConnection)
myCommand.Parameters.AddWithValue("@PictureID", PictureID)
myConnection.Open()
Dim myReader As SqlDataReader = myCommand.ExecuteReader
If myReader.Read Тогда
Response.ContentType = myReader("MIMEType").ToString()
Response.BinaryWrite(myReader("ImageData"))
Конец, если
myReader.Close()
моеСоединение.Закрыть()
Завершить использование
Конец субтитра