Início > ASP.NET MVC, C# > Imagens no Oracle com NHibernate, Asp.net Mvc e C#

Imagens no Oracle com NHibernate, Asp.net Mvc e C#

Cenário:
Um site de um concurso cultural, ao cadastrar uma promoção o usuário envia uma imagem que vai ser exibida com a promoção. Essa imagem é gravada no oracle com nhibernate, e é retornada sempre que a promoção é exibida ao usuário.

Exemplo resumido da classe Promoção:

public class Promocao
{
public virtual string Nome { get; set; }

public virtual string Desafio { get; set; }

public virtual string Regulamento { get; set; }

public virtual byte[] ImagemTopo { get; set; }
// Criamos a propriedade como um array de bytes -> byte[] que será persistido como binário.
}

Resumo da classe mapeada com Fluent NHibernate:

    public class PromocaoMap : ClassMap<Promocao>
    {
        public PromocaoMap()
        {
            .... omitido...            
            // Mapeei um campo para o regulamento da promoção e um campo para a imagem do topo
            Map(x => x.Regulamento).Length(1048576); // length de 1048576 bytes aproximadamente 1 mb -> será criado como NCLOB no oracle.
            Map(x => x.ImagemTopo).Length(5224880); // length 5224880 bytes aproximadamente 5 mb -> será criado como BLOB no oracle.
        }
    }

Gravando a imagem no banco

Código da Action que Recebe o Post do Form de Cadastro:

[HttpPost]
public ActionResult SavePromocao(Promocao promocaoGravar, HttpPostedFileBase ImagemTopoEnviar)
        {
            if (!ModelState.IsValid)
                return View("CadPromocao", promocaoGravar);

            using (var sessao = MvcApplication.ObterSessaoNh())
            {
                using (var transacao = sessao.BeginTransaction())
                {
                    try
                    {
                        var crud = new Dal.PromocaoDao(sessao);
                        if (promocaoGravar.Id <= 0)
                        {
                            crud.Incluir(promocaoGravar);
                        }
                        else
                        {
                            var objetoPersistido = crud.RetornaEntidade(promocaoGravar.Id);
                            objetoPersistido.Nome = promocaoGravar.Nome;

                            if (ImagemTopoEnviar != null)
                            {
                                // Converte stream do arquivo enviado para array de bytes[]
                                var memoryStream = new MemoryStream();
                                ImagemTopoEnviar.InputStream.CopyTo(memoryStream);

                                objetoPersistido.ImagemTopo = memoryStream.ToArray();
                            }

                            crud.Alterar(objetoPersistido);
                        }

                        transacao.Commit();
                    }
                    catch (Exception)
                    {
                        transacao.Rollback();
                    }
                }
            }

            return RedirectToAction("ListPromocoes");
        }

Dessa forma a imagem é persistida corretamente no Oracle.

Exibindo a imagem na view

Criar uma Action que busca a imagem no banco de dados e retorna via response

[HttpGet]
public ActionResult GetImagemPromocao(long idPromocao)
{
   byte[] imagemArray = null;

   using (var sessao = MvcApplication.ObterSessaoNh())
   {
	var crud = new Dal.PromocaoDao(sessao);
	imagemArray = crud.ObterImagem(idPromocao);
	if (imagemArray == null)
        {
		return null;
	}
	else
	{
		return new FileContentResult(imagemArray, "image/jpeg");
	} 
   }
} 

Código da View

// Minha View é TIPADA
<img src="@Url.Content("~/Admin/GetImagemPromocao?idPromocao = " + Model.Id)"/>

// O Helper Url.Content converte um Path Relativo para um Path Absoluto.

E assim a imagem é renderizada com sucesso na view.


Observações:

  1. Deve funcionar corretamente em outros SGBDS como MySql, PostgreSql e etc.
  2. Vale lembrar que o objeto byte[] armazena não somente imagems, mais qualquer outro tipo de arquivo, pois tudo é binário ok.
  3. Não inclui o tratamento de erros no exemplo.

Dúvidas deixe nos comentários que respondo.

Espero ter ajudado em seu projeto.


Referências:
Documentação do NHibernate – Tipos de Dados
Dica para converter Stream
no StackOverflow

Documentação Oficial de HTML Forms no W3C – World Wide Web Consortium.

Anúncios
  1. Nenhum comentário ainda.
  1. No trackbacks yet.

Deixar uma Anotação

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

dotnettips.wordpress.com/

Helping Programmers Since 1994

Viagem e Voo

Dicas para viagens, férias e voos nacionais e internacionais

Ivan Guimarães Meirelles

Analista Desenvolvedor

Void Podcast

Vazio e sem retorno de valor

Elemar DEV

Negócios, tecnologia e desenvolvimento

2,000 Things You Should Know About WPF

Everything a WPF Developer Needs to Know, in Bite-Sized Chunks

blog

so long

Fernando Franzini Blog

Engenharia de Software e Arquitetura Ágil

Gabriel RB.net

Blog técnico, com dicas, códigos, novidades e problemas do dia-a-dia programando.

Alexandre Valente's Blog

Experiências em tecnologia e assuntos diversos

%d blogueiros gostam disto: