Recover image through path and display

Asked

Viewed 1,000 times

2

I created the following method to save an image in the database

public ActionResult enviaArquivo(UsurioViewModel arq)      
 {

    try {
            string nomeArquivo ="";

            if (arq.Arquivo != null && arq.Arquivo.ContentLength > 0)
            {
                nomeArquivo= Path.GetFileName(arq.Arquivo.FileName);
                var caminho = Path.Combine(Server.MapPath("~/images"), nomeArquivo);
                arq.File.SaveAs(caminho);
                arq.CaminhoArquivo = caminho;
            }
            ViewBag.Mensagem = "Arquivo: " + nomeArquivo+ ", enviado com sucesso.";
        }
    catch (Exception ex)
    {
        ViewBag.Mensagem("Erro:" + ex);
    }
    return View();
}

Now I need to create a method to recover the server image and display it in html, read some tutorials and watched some videos, but it’s still not clear to me how to do. If anyone can help me, I’d be very grateful!!! :)

  • Hello Ana, what exactly is not clear? As you said you want the image in html, just include your path in a tag img, once you have the path and name of the image when you uploaded it: <img src='/imagens/nomearquivo'/>.

1 answer

1


About this code, I made some modifications to support my answer:

public ActionResult enviaArquivo(UsuarioViewModel arq)      
 {
    // Não use try ... catch em Actions. 
    // O evento correto para interceptar exceções é o OnException de Controller.
    // try {
        string nomeArquivo ="";

        if (arq.Arquivo != null && arq.Arquivo.ContentLength > 0)
        {
            nomeArquivo = Path.GetFileName(arq.Arquivo.FileName);
            var caminho = Path.Combine(Server.MapPath("~/images"), nomeArquivo);
            arq.File.SaveAs(caminho);
            arq.CaminhoArquivo = caminho;

            // Depois de gravar o arquivo, o ideal é que você guarde
            // o nome do arquivo associado a alguma coisa. 
            // Não é uma boa ideia usar o nome do arquivo para recuperá-lo.
            // Minha sugestão é:

            var imagem = new Imagem 
            {
                CaminhoArquivo = arq.CaminhoArquivo
            };

            contexto.Imagens.Add(imagem);
            contexto.SaveChanges();

            ViewBag.Mensagem = "Arquivo: " + nomeArquivo + ", enviado com sucesso.";
            // Se o upload do arquivo ocorreu com sucesso, redirecione
            // o usuário para algum lugar.
            return RedirectToAction("Sucesso", imagem);
        }


    // }
    // catch (Exception ex)
    // {
    //    ViewBag.Mensagem("Erro:" + ex);
    // }

    // Este ponto deve ser executado apenas se o Upload falhou.
    return View();
}

That is, the image is recovered through the database. It doesn’t have to be that way. The important thing is not to expose the name because it can be a security problem. I explain all this here.

The download already explained here:

public FileResult Download(int id)
{
    var caminhoDaImagem = /* Aqui você usa id que vem por parâmetro pra fazer alguma operação que seleciona o caminho da imagem de algum lugar */
    byte[] dadosArquivo = System.IO.File.ReadAllBytes(caminhoDaImagem);
    return File(dadosArquivo, System.Net.Mime.MediaTypeNames.Image.Jpeg, "nomedoarquivo.jpg");
}

Browser other questions tagged

You are not signed in. Login or sign up in order to post.