Não é somente em aplicações Web que se podem ter arquivos salvos em banco de dados, também é possível desenvolver aplicações com Windows Forms para salvar e recuperar imagens ou arquivos do banco de dados.
Para um breve exemplo, vamos criar uma aplicação Windows Forms no Visual Studio, com um formulário com um botão ‘Escolher’ para o “upload” da imagem/arquivo e um botão ‘Mostrar’ para exibir a imagem. Para a caixa de seleção do arquivo, precisaremos de um Open File Dialog e para exibição, um Picture Box:
Desta vez, estaremos utilizando Entity Framework para salvar a imagem/arquivo no banco de dados (ainda com a mesma modelagem do artigo anterior).
Ajustamos os eventos do formulário:
using System; using System.ComponentModel; using System.Drawing; using System.IO; using System.Linq; using System.Windows.Forms; using Microsoft.Win32; namespace DemoApp.WinForms { public partial class Form1 : Form { public Form1() { InitializeComponent(); } public int ArquivoId { get; set; } /// <summary> /// Clique do botão Escolher abre OpenFileDialog /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnEscolher_Click(object sender, EventArgs e) { ofdEscolher.ShowDialog(); } /// <summary> /// Retorno do OpenFileDialog /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void ofdEscolher_FileOk(object sender, CancelEventArgs e) { var file = new FileInfo(ofdEscolher.FileName); var obj = new Arquivos { Nome = file.Name, Extensao = file.Extension, Tipo = GetMimeType(file.Extension) }; using (var stream = ofdEscolher.OpenFile()) using (var reader = new BinaryReader(stream)) obj.Bytes = reader.ReadBytes((int)stream.Length); using (var context = new DemoAppEntities()) { context.AddObject("Arquivos", obj); context.SaveChanges(); } // Regra somente para efeito de demonstração, // pois restrições devem ser criadas no Open File Dialog if (obj.Extensao == ".jpg") ArquivoId = obj.ArquivoId; } /// <summary> /// Recuperar Content Type do registro do Windows, /// por compatibilidade às aplicações Web /// Original.: http://www.codeproject.com/KB/dotnet/ContentType.aspx /// </summary> /// <param name="ext"></param> /// <returns></returns> public string GetMimeType(string ext) { var classesRoot = Registry.ClassesRoot; var typeKey = classesRoot.OpenSubKey(@"MIME\Database\Content Type"); if (typeKey == null) return string.Empty; return ( from regExt in typeKey.GetSubKeyNames() let path = @"MIME\Database\Content Type\" + regExt let curKey = classesRoot.OpenSubKey(path) where curKey != null let value = curKey.GetValue("Extension") where value != null && value.ToString().ToLower() == ext select regExt ).FirstOrDefault() ?? string.Empty; } /// <summary> /// Recuperando imagem do banco de dados e exibindo em um PictureBox /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnMostrar_Click(object sender, EventArgs e) { if (ArquivoId == 0) return; Arquivos obj; using (var context = new DemoAppEntities()) obj = context.Arquivos.FirstOrDefault(a => a.ArquivoId == ArquivoId); if (obj == null) return; var stream = new MemoryStream(obj.Bytes); picImagem.Image = Image.FromStream(stream); } } }
Agora na execução, clicamos no botão “Escolher”:
Escolhemos o arquivo para importação, no caso uma imagem JPG.
Por fim, com um clique sobre o botão Mostrar, teremos a imagem no Picture Box:
Em um cenário real, criem restrições dos tipos de arquivos no processo de importação/download da imagem/arquivo. No caso de aplicações Windows Forms, estas restrições serão no Open File Dialog.