Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Como exibir imagem da pasta storage laravel

Não consigo exibir uma imagem que foi guardada na pasta storage/app/fotos.

Consigo fazer o upload da imagem para a pasta, mas na view a imagem não é exibida.

4 respostas

Oi Leonardo, tudo bom?

Como você está tentando pegar essa imagem?

O que aparece no seu navegador quando você carrega a pagina?

Aparece algum erro no console?

Compartilha aqui com a gente =)

Assim fica mais facil de achar o problema.

Abraço!

Simplesmente a imagem não aparece, tento exibir a mesma assim:

<td><img id="myImg" 
        src="{{Storage::url('app/fotos/imagem3.jpg')}}"
      width="100"/>
</td>

Aí aparece esse erro no console:

GET
http://192.168.1.104/storage/app/fotos/imagem3.jpg 404 (Not Found)

O caminho absoluto da imagem é:

/Volumes/Dados/OneDrive/TRABALHO/INFOLC/PROJETOS/PS/storage/app/fotos/imagem3.jpg

OBS.: Estou no ambiente de desenvolvimento, utilizando o servidor embutido do Laravel, com o comando:

php artisan serve --host=192.168.1.104 --port=80

OBS.: Preciso salvar as imagens nesta pasta, pois se tratam de fotos de pessoas então, não posso salvar na pasta public do laravel, pois deixaria estas imagens publicas.

Se você vai renderizar essa imagem na tela do usuario, ele precisa ter acesso à ela. A tag img vai realizar uma requisição get pro src definido. Se a imagem não for publica a propria tag não vai conseguir acessá-la.

O helper Storage::url procura no diretorio:

http://192.168.1.104/storage

Acredito que a melhor abordagem seja inserir essa imagem no diretorio padrão do laravel mesmo.

solução!

Consegui resolver a questão, encontrei uma solução parecida, que tinha o objetivo de exibir uma imagem salva em um banco de dados então, peguei essa lógica para arquivos na store, seguem os códigos:

Laravel:

    public function exibeFotoStore($tipo, $id)
    {
        $this->foto = Foto::find($id);

        $arquivo = Storage::get('fotos/' . $tipo . '_' . $this->foto->nomeArquivo); 
        $this->imagem = Image::make($arquivo);

        $response = Response::make($this->imagem->encode('jpeg'));
        $response->header('Content-Type', 'image/jpeg');

        return $response;
    }

Html:

<td><img id="myImg" 
         src="{{'/cfg/fotos/exibe/p/' . $foto->id}}"
       width="100"/>
</td>

Se alguém precisar exibir uma imagem do banco de dados é só trocar isso:

$arquivo = Storage::get('fotos/' . $tipo . '_' . $this->foto->nomeArquivo); 
$this->imagem = Image::make($arquivo);

Por isso:

$this->imagem = Image::make($this->foto->binario);

Inicialmente até pensei salvar as imagens no BD, mas o site ficaria lento então, por isso pensei em usar a pasta storage do laravel que é protegida pelo mesmo.

OBS.: A classe Image, vem do plugin Intervention/image, disponível no link abaixo:

http://image.intervention.io/

Essa classe permite fazer muitas coisas com imagens como: redimensionamento, redimensionamento inteligente usando o método fit, mudar brilho, etc.