Sobre atualização de imagem
[Concluído]
Carlos, boa noite.
No processo de atualização de imagem, notei que não há um método para remover a imagem que está sendo substituída. Porém, a remoção dela ocorreu assim mesmo.
Achei que fosse necessário um método parecido com o unlink() para fazer isso.
Por que isso ocorre? O Laravel reconhece a atualização e automaticamente faz isso?
Um abraço.
Olá, Abraão!
Tudo bem?
Uma excelente pergunta você fez.
Quando fazemos o upload de uma imagem com o mesmo nome a imagem antiga é sobreposta, ou seja, a nova imagem substitui a antiga.
Se quiser deletar a imagem antiga antes de fazer um novo upload (no momento de editar), pode usar essa lógica:
// Não esquece: use Illuminate\Support\Facades\Storage;
if($flight->image) {
if (Storage::exists("flights/{$flight->image}"))
Storage::delete("flights/{$flight->image}");
}
Carlos,
Obrigado pelo retorno.
Há alguns meses fiz um sistema em Laravel que ler um webservice de produtos para pegar todos os produtos e imagens. As imagens, ainda tinham que passar por uma autenticação em HTTP. Bem chatinho de fazer. De fato, isso estava acontecendo: toda vez que executava a integração, não duplicava a imagem, mas substituia a imagem já existente, mas não entendia o porquê disso. E, como funcionava, deixei quieto.
Agora, se fizer o upload para o diretório public, por exemplo, public/banners, você precisa de remover a imagem no processo de atualização. Tem que ter um método para remoção da imagem:
$filename = md5(time().$image->getClientOriginalName()).'.'.$image->getClientOriginalExtension();
$destinationPath = public_path(self::PATH_IMAGE);
File::delete($destinationPath.'/'.$current_image);
Mais ou menos isso, aí.
Agora, aí vai mais uma dúvida:
Estou usando o servidor embutido do PHP para acompanhar o curso, o Docker não roda no Windows 10 Home nem com reza forte! Então, resolvi usar o servidor embutido do php mesmo.
A dúvida, é a seguinte: na url localhost:8000 não é possível exibir a imagem que foi armazenada no storage.
O print da imagem, no HTML, ocorre numa boa:
<td>
<img src="http://localhost:8000/storage/flights/002231201806045b14864738126.jpeg" style="max-width:70px">
</td>
Mas, não exibe a imagem. No console do browser, mostra erro 404.
Eu sei que se eu jogar isso para uma outra url, tipo: dominio.com.br/storage/etc a imagem exibirá numa boa. A encrenca está no localhost:8000 mesmo.
Sabe como resolver isso?
Se não souber, tranquilo. Isso não está atrapalhando no entendimento do curso.
Valeu.
Um abraço.
Olá, Abraão!
O primeiro caso pelo o que entendi, posso deduzir que talvez seja algum cache do Webservice, isso talvez podia tá retornando o conteúdo com cache, e por esse motivo essa questão da imagem. Apenas uma hipótese. Precisaria de detalhes e testes para chegar na verdadeira causa do problema.
O segundo problema não se trata de um problema com o modo como acessa o projeto (http://localhost:8000)
Só de acessar sem ter URL sobrando "/public" já funciona da mesma forma como se estivesse acessando diretamente por um domínio "dominio.com.br"
Acontece o seguinte, arquivos devem ser armazenados em storage/app/
Agora se for uma arquivo que precisa exibir posteriormente, como uma imagem posteriormente neste caso deve ser armazenada em storage/app/public/
Acontece o seguinte, quando precisa recuperar um arquivo em storage/app/public/ para exibir no Browser (como uma imagem) precisa estar de alguma forma ligado ao diretório public/ do Laravel.
Por isso quando rodamos o comando: php artisan storage:link ele cria um link simbólico (atalho) de storage/app/public/ para public/storage/
Ao acessar uma imagem que está em public/storage/nome-image.png na realidade ela não está neste diretório, mas sim em storage/app/public/nome-image.png
Ficou claro amigo?
Carlos, boa noite.
Obrigado pelas explicações.
Ficaram claras, sim.
Um abraço.
Precisa estar logado para conseguir responder a este ticket!
Clique Aqui Para Entrar!