1. Introdução
Ao construir aplicativos orientados a dados, muitas vezes é necessário capturar texto e dados binários. Esse programa pode precisar armazenar imagens, PDFs, arquivos do Word ou outros dados binários. Existem duas maneiras de armazenar esses dados binários: no sistema de arquivos do servidor web e adicionando uma referência ao arquivo correspondente no banco de dados ou diretamente no próprio banco de dados;
Dados textuais como strings, números, datas, GUIDs, valores monetários, etc. - possuem definições de tipo de dados apropriadas e correspondentes no sistema de banco de dados. Por exemplo, no Microsoft SQL Server, você pode usar o tipo de dados int para armazenar um valor inteiro e para armazenar um valor de string, você pode usar um tipo varchar ou nvarchar. Além disso, o banco de dados também fornece definições de tipo para armazenar dados binários. No Microsoft SQL SERVER 2000 e versões anteriores, o tipo de dados de imagem é usado para armazenar dados binários; no SQL SERVER 2005, o tipo de dados varbinary (MAX) é usado. Esses tipos de dados são capazes de armazenar dados binários de até 2 GB usando qualquer um dos dois métodos acima.
No entanto, ao armazenar dados binários diretamente no banco de dados, é necessário algum trabalho adicional para inserir, atualizar e recuperar os dados binários. Felizmente, podemos abstrair essa complexa operação T-SQL de baixo nível por meio de bibliotecas de acesso a dados de nível superior - como ADO.NET - para que o problema se torne bastante simples. Entretanto, trabalhar com dados binários via ADO.NET é um pouco diferente de trabalhar com dados de texto. Neste artigo, analisaremos como usar o ADO.NET e o controle ASP.NET 2.0 SqlDataSource para armazenar e recuperar arquivos de imagem diretamente de um banco de dados. Por favor, continue lendo!
2. Comparação entre armazenar dados no banco de dados e armazená-los no sistema de arquivos
Conforme apresentado, ao capturar dados binários em uma aplicação, os dados binários podem ser armazenados diretamente no banco de dados ou como um arquivo no servidor. sistema de arquivos - apenas uma referência ao arquivo no banco de dados é mantida. Na minha experiência, descobri que a maioria dos desenvolvedores prefere armazenar dados binários no sistema de arquivos, principalmente pelos seguintes motivos:
· Menos esforço necessário - Armazenar e recuperar binários armazenados em um banco de dados exige mais esforço de codificação. Além disso, atualizar esses dados binários será mais fácil - não há necessidade de comunicação com o banco de dados, apenas modifique o arquivo diretamente!
· URLs que apontam para arquivos são mais diretas - Como veremos neste artigo, para fornecer acesso aos dados binários armazenados em um banco de dados, precisamos criar outra página ASP.NET que possa retornar esses dados. Normalmente, um identificador exclusivo correspondente ao registro correspondente no banco de dados (retornando seus dados binários) é passado para esta página. O resultado é que, para acessar os dados binários - digamos, uma imagem carregada - o URL se parece com http://www.yourserver.com/ShowImage.aspx?ID=4352 , enquanto se a imagem foi armazenada diretamente no arquivo Em sistema, a URL será mais direta - por exemplo http://www.yourserver.com/UploadedImages/Sam.jpg.
· Melhor suporte de ferramentas para exibição de imagens - Se você estiver usando ASP.NET 2.0, poderá usar um controle ImageField em um controle GridView ou DetailsView para exibir uma imagem (seu caminho de imagem é armazenado no banco de dados). Porém, infelizmente, este ImageField não pode exibir diretamente os dados da imagem no banco de dados (pois requer a consulta de uma página externa e o retorno dos dados correspondentes).
· Desempenho - Como os arquivos binários são armazenados no sistema de arquivos do servidor web e não no banco de dados, o aplicativo pode acessar menos dados no banco de dados, reduzindo assim os requisitos no banco de dados e reduzindo correspondentemente os requisitos na web e o congestionamento da rede entre servidores de banco de dados.
A principal vantagem de armazenar dados diretamente no banco de dados é que isso torna os dados “autocontidos”. Agora que todos os dados estão contidos no banco de dados, o suporte de dados, a movimentação de dados entre servidores de banco de dados, a replicação do banco de dados, etc. são muito mais fáceis porque não há necessidade de se preocupar em copiar ou fazer backup do conteúdo binário armazenado no sistema de arquivos.
Como sempre, a solução de armazenamento a ser escolhida dependerá do local de uso real e das necessidades do negócio. Por exemplo, desenvolvi um cliente onde os dados binários tinham que ser armazenados em um banco de dados porque o software de relatório que eles usavam só era capaz de incluir dados binários no relatório - se viessem do banco de dados. Em outro caso, um colega meu estava trabalhando em um projeto onde os binários precisavam ser utilizados por uma aplicação web e disponibilizados via FTP, caso em que era necessário armazenar os dados binários no sistema de arquivos.
3. Crie uma tabela de banco de dados para armazenar dados binários
O restante deste artigo analisará um aplicativo simples de galeria de imagens ASP.NET 2.0 que escrevi usando o Microsoft SQL Server 2005 Express Edition para demonstrar os conceitos diretos relacionados ao armazenamento e recuperação de dados binários em um banco de dados.
O modelo de dados desta aplicação de galeria de imagens é composto por uma tabela - Imagens, onde cada registro corresponde a uma imagem da galeria. O campo MIMEType desta tabela Pictures armazena o tipo MIME da imagem carregada (image/jpeg para arquivos JPG, imagem/gif para arquivos GIF, etc.); o tipo MIME aqui especifica ao navegador como gerar os dados binários. A coluna ImageData armazena o conteúdo binário real da imagem.
4. Carregue uma imagem e armazene dados binários usando o código ADO.NET
Esta galeria de imagens permite aos visitantes fazer upload de arquivos de imagem (formatos GIF, JPG e PNG) para este aplicativo. Após o upload, um novo registro é adicionado à tabela Pictures e o conteúdo do arquivo de imagem é armazenado na coluna ImageData do novo registro. Para fazer upload de arquivos do navegador da Web para o servidor da Web no ASP.NET 2.0, o controle FileUpload é usado neste exemplo. Usar o controle FileUpload é muito simples - basta arrastá-lo da barra de ferramentas para a sua página. Em última análise, esse controle FileUpload será gerado no navegador do usuário como um formulário padrão de upload de arquivo - um botão "Navegar" (quando clicado) permite ao usuário selecionar um arquivo de seu disco rígido para carregá-lo no servidor web.
Por exemplo, para criar uma interface para adicionar uma nova imagem, usei um controle TextBox para capturar o título da imagem e um controle FileUpload para permitir ao usuário especificar a imagem a ser carregada:
<b>Title:</b>
<asp:TextBox ID="PictureTitle" runat="servidor" />
<br />
<b>Imagem:</b>
<asp:FileUpload ID="UploadedFile" runat="servidor" />
<br />
<asp:LinkButton ID="btnInsert" runat="servidor" Text="Inserir" />
<asp:LinkButton ID="btnCancel" runat="server" Text="Cancel" />
O código acima cria uma página onde o usuário pode especificar um arquivo de seu disco rígido para ser carregado no servidor web.
Assim que o usuário seleciona um arquivo e envia o formulário (por exemplo, clicando no botão “Inserir”), o conteúdo binário do arquivo especificado é enviado ao servidor web. A partir do código do lado do servidor, esses dados binários ficam disponíveis por meio da propriedade PostedFile.InputStream do controle FileUpload, conforme demonstrado pela seguinte marcação e código:
Protected Sub btnInsert_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnInsert . Clique
'Certifique-se de que um arquivo foi carregado com sucesso
Se UploadedFile.PostedFile não for nada ouElse String.IsNullOrEmpty(UploadedFile.PostedFile.FileName) OuElse UploadedFile.PostedFile.InputStream não for nada, então
...exibir mensagem de erro...
Sair do sub
Terminar se
'Certifique-se de que estamos trabalhando 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...
Sair do sub
End Select
'Conectar ao banco de dados e inserir um novo registro na tabela Produtos
Usando myConnection como novo SqlConnection(ConfigurationManager.ConnectionStrings("ImageGalleryConnectionString").ConnectionString)
Const SQL As String = "INSERT INTO [Imagens] ([Título], [MIMEType], [ImageData]) VALORES (@Title, @MIMEType, @ Dados de imagem)"
Dim myCommand como novo SqlCommand(SQL, myConnection)
myCommand.Parameters.AddWithValue("@Title", PictureTitle.Text.Trim())
myCommand.Parameters.AddWithValue("@MIMEType", MIMEType)
'Carrega o InputStream do controle FileUpload em uma matriz de bytes
Dim imageBytes (UploadedFile.PostedFile.InputStream.Length) como byte
UploadedFile.PostedFile.InputStream.Read(imageBytes, 0, imageBytes.Length)
myCommand.Parameters.AddWithValue("@ImageData",imageBytes)
minhaConexão.Open()
meuCommand.ExecuteNonQuery()
minhaConexão.Close()
Terminar de usar
End
SubHere, este manipulador de eventos primeiro garante que um arquivo foi carregado. Em seguida, ele determina o tipo MIME com base na extensão do arquivo que está sendo carregado.
A parte mais notável acima é a seção de código que define os parâmetros @ImageData. Primeiro, crie uma matriz de bytes chamada imageBytes e torne seu comprimento o InputStream correspondente do arquivo que está sendo carregado. Em seguida, use o método Read do InputStream para preencher o conteúdo binário nesta matriz de bytes. Observe que é essa matriz de bytes especificada como o valor de @ImageData.