[PROMOÇÃO] Assine com + 30% de desconto ANUAL MENSAL (últimas horas)
Antonio Fernandes
Criador Antonio Fernandes 30/08/2018

01 - Usamos essa logica de continuar a imagem com mesmo nome, como visto a imagem é substituida.

Mais caso a imagem utilizada no cadastro se uma imagem JPG e a utilizada na atualização seja uma PNG com transparência a mesma será nomeada com JPG e perderá suas propriedades. Se estou correto, como posso resolver isto?

02 - Esse metodo utilizado no exemplo pode ser utilizado para qualquer tipo de arquivo? (jpg, png, mp3, pdf) ?? Se sim, como posso validar para permitir somente arquivos específicos?

03 - Existe alguma forma de resolver essa questão do cache, onde a imagem de fato so é substituida na view após um crtl + f5 ?

Manager Carlos Ferreira 30/08/2018

Olá, Antonio!
Tudo bem?

Nesse caso você pode deletar o arquivo (imagem) e fazer um novo upload.

Veja um exemplo básico:
public function update(StoreUpdateProductFormRequest $request, $id)
{
    if (!$product = $this->product->find($id))
        return redirect()->back();

    $data = $request->all();

    if ($request->hasFile('image') && $request->file('image')->isValid()) {
        // Remove a imagem caso já exista!
        if ($product->image) {
            // Não pode esquecer: use Storage;
            if (Storage::exists("{$this->path}/{$product->image}"))
                Storage::delete("{$this->path}/{$product->image}");
        }

        $name = kebab_case($request->name);
        $extension = $request->image->extension();

        $nameFile = "{$name}.{$extension}";
        $data['image'] = $nameFile;

        $upload = $request->image->storeAs($this->path, $nameFile);

        if (!$upload)
            return redirect()->back()->withError('Falha no upload');
    }

    $product->update($data);

    [...]
}

Carlos Ferreira
Criador Antonio Fernandes 30/08/2018

Nesta parte de sua resposta:

// Não pode esquecer: use Storage;
            if (Storage::exists("{$this->path}/{$product->image}"))
                Storage::delete("{$this->path}/{$product->image}");

 

Storage é uma classe? Onde ela está?

e de onde ou onde foi setado o {$this->path} ?

Antonio Fernandes
Manager Carlos Ferreira 30/08/2018

Olá, Antonio!

Esse foi apenas um exemplo que tenho pronto, precisa adptar ao seu projeto.

Storage é uma Facade do Laravel, precisa usar ela:
use Storage;

$this->path é apenas um atributo da minha classe, onde armazenei o path de upload. Mas, no seu caso pode ficar assim:

// Existe a imagem, então precisa deletar antes de fazer upload novamente:
if ($nomeObjeto->image) {
    // Não pode esquecer: use Storage;
    if (Storage::exists("nomediretorio/{$nomeObjeto->image}"))
        Storage::delete("nomediretorio/{$nomeObjeto->image}");
}

Carlos Ferreira
Sabe a Solução? Ajude a resolver!

Precisa estar logado para conseguir responder a este ticket!

Clique Aqui Para Entrar!