5. Carregue imagens e armazene dados binários usando o código de controle de fonte de dados do ASP.NET 2.0
Embora o método ADO.NET funcione no contexto de um aplicativo ASP.NET 2.0, você também pode usar controles de fonte de dados do ASP.NET 2.0 para armazenar binários.
dados.Os dados binários são armazenados em um banco de dados, o que não requer a gravação de código ADO.NET. O controle SqlDataSource usado neste programa de demonstração contém um InsertCommand e parâmetros correspondentes aos valores Title, MIMEType e ImageData:
InsertCommand="INSERT INTO [Imagens] ([Título], [MIMEType], [ImageData]) VALUES (@Title, @MIMEType, @ImageData)">
<asp:Nome do parâmetro="Título" Type="String" />
<asp:Nome do parâmetro="MIMEType" Type="String" />
<asp:Nome do Parâmetro="ImageData" />
</Inserir Parâmetros>
Observe que aqui o parâmetro ImageData não especifica um tipo. Se você tentar usar o assistente GUI para construir a sintaxe de um SqlDataSource, ele provavelmente especificará Type="Object" para ele. No entanto, este Type="Object" produzirá um parâmetro do tipo sql_variant. No entanto, o tipo sql_variants não pode ser usado para armazenar imagens ou tipos de dados varbinários (MAX) porque o tamanho dos dados intrínsecos do sql_variant não pode exceder 8.000 bytes. (Se você tentar usar Type="Object" e depois tentar salvar dados binários que excedam 8.000 bytes de tamanho, o sistema lançará uma exceção com a mensagem "O parâmetro '@ImageData' excede o limite de tamanho para o tipo de dados sql_variant "; Se você tentar adicionar dados binários com tamanho inferior a 8.000 bytes, a exceção exibirá a mensagem "A conversão implícita do tipo de dados sql_variant para varbinary(max) não é permitida").
Além disso, o controle DetailsView contém dois TemplateFields. Entre eles, um controle TextBox é usado em um TemplateField para exibir a barra de título; o outro usa um controle FileUpload para representar a barra ImageData; O resultado final é uma interface de usuário semelhante à da seção "Fazendo upload de imagens e armazenando dados binários usando código ADO.NET". Quando o botão "Inserir" do DetailsView é clicado, seu evento Inserting é acionado. Neste momento, os dados binários devem ser obtidos do controle FileUpload, lidos em uma matriz de bytes e atribuídos aos parâmetros apropriados:
Protected Sub UploadPictureUI_ItemInserting(ByVal). sender As Object , ByVal e As System.Web.UI.WebControls.DetailsViewInsertEventArgs) Lida com UploadPictureUI.ItemInserting
'Faça referência ao controle FileUpload Dim UploadedFile As FileUpload = CType(UploadPictureUI.FindControl("UploadedFile"), FileUpload)
'Garanta que um arquivo foi carregado com sucessoIf UploadedFile.PostedFile Is Nothing OrElse String.IsNullOrEmpty(UploadedFile.PostedFile.FileName) OrElse UploadedFile .PostedFile .InputStream não é nada então
...exibir mensagem de erro...
e.Cancelar = Verdadeiro
Sair do sub
End If
'Certifique-se de que estamos lidando com um arquivo JPG ou GIF
Dim extensão As String = Path.GetExtension(UploadedFile.PostedFile.FileName).ToLower()
Dim MIMEType As String = Nada
Selecione a extensão do caso
Caso ".gif"
MIMEType = "imagem/gif"
Caso ".jpg", ".jpeg", ".jpe"
MIMEType = "imagem/jpeg"
Caso ".png"
MIMEType = "imagem/png"
Outro caso
'Upload de tipo de arquivo inválido... mensagem de erro exibida...
e.Cancelar = Verdadeiro
Sair do sub
End Select
"Especifique os valores dos parâmetros MIMEType e ImageData
e.Values("MIMEType") = MIMEType
'Carrega o InputStream do FileUpload no array de bytes
Dim imageBytes (UploadedFile.PostedFile.InputStream.Length) como byte
UploadedFile.PostedFile.InputStream.Read(imageBytes, 0, imageBytes.Length)
e.Values("ImageData") = imagemBytes
End Sub
Assim como o manipulador de eventos Click do botão "Insert" anterior, o manipulador de eventos Inserting do DetailsView também executa a mesma lógica - há apenas algumas pequenas diferenças de sintaxe. Primeiro, como o controle FileUpload está dentro de um modelo, ele deve ser referenciado programaticamente usando o método FindControl("controlID"). Depois de referenciado, as mesmas verificações são realizadas para garantir que o upload do arquivo foi realizado com êxito e que a extensão apropriada foi permitida. Uma pequena diferença para o manipulador de eventos Inserting do DetailsView é que, se ocorrer um erro, precisamos notificar o DetailsView para interromper o trabalho de inserção correspondente - isso é conseguido definindo a propriedade e.Cancel como True.
Após a verificação, os parâmetros MIMEType e ImageData serão atribuídos usando a sintaxe e.Values("parameterName")=value. Assim como no exemplo anterior do ADO.NET, primeiro leia os dados binários em uma matriz de bytes e, em seguida, atribua a matriz de bytes ao parâmetro.
6. Exibir conteúdo binário
Não importa qual tecnologia você use para armazenar dados no banco de dados, para recuperar e exibir dados binários, precisamos criar uma nova página ASP.NET. A página chamada ShowPicture.aspx passará um PictureID para ela por meio da string de consulta e retornará os dados binários do campo ImageData do produto especificado. Depois de concluída, uma imagem específica pode ser vista visitando o endereço /ShowPicture.aspx?PictureID=picutreID. Portanto, para exibir uma imagem em uma página web, podemos usar um controle de imagem e definir sua propriedade ImageUrl para a URL apropriada.
Observe que ShowPicture.aspx não inclui nenhuma tag HTML em sua página .aspx. No manipulador de eventos Page_Load da classe code-behind, o código ADO.NET será usado para recuperar o MIMEType e ImageData da linha Pictures especificada do banco de dados. Em seguida, o ContentType da página é definido como o valor do campo MIMEType e os dados binários são gerados usando Response.BinaryWrite(ImageData):
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me. Carregar
Dim PictureID As Integer = Convert.ToInt32(Request.QueryString("PictureID"))
'Conecta-se ao banco de dados e retorna o conteúdo da imagem e o tipo MIME da imagem especificada Usando myConnection As New SqlConnection(ConfigurationManager.ConnectionStrings("ImageGalleryConnectionString"). ConnectionString)
Const SQL As String = "SELECT [MIMEType], [ImageData] FROM [Pictures] WHERE [PictureID] = @PictureID"
Dim myCommand como novo SqlCommand(SQL, myConnection)
myCommand.Parameters.AddWithValue("@PictureID", PictureID)
myConnection.Open()
Dim myReader As SqlDataReader = myCommand.ExecuteReader
If myReader.Read Then
Response.ContentType = meuLeitor("MIMEType").ToString()
Response.BinaryWrite(myReader("ImageData"))
Terminar se
myReader.Close()
minhaConexão.Close()
Terminar de usar
Finalizar sub