How do I solve this method create problem in Laravel

0

Well, I have a form where it contains an html input of an image. When I send the form to the Control, I do the image processing, taking its name and uploading it to the image directory. But when I look in the bank, the image name is not correct. See next image - >

Then with this problem I can not get the image, since the names do not match (The name of the directory! = the name of the bank). Here's how I'm doing:

if ($request->hasFile('imagem')) {

        $imagem = $request->file('imagem');
        $filename = time() . '.' . $imagem->getClientOriginalExtension();
        Image::make($imagem)->resize(100, 100)->save(public_path('/imagem/igreja/membros/' . $filename));

        $all = $request->all();
        $membro->imagem = $filename ;

        $return = $membro->create(
           $all 
        );

        if ($return)
            return redirect()->route('membro.index')->with('msg', 'Membro cadastrado com sucesso!');
        else
            return redirect()->back();
    }

The information goes, the more the image will not. I'm seriously afraid of having to do it this way:

$membro->create(['Imagem' => 'value','...' => '....'   ]  );

Because I have a large form and it would foul my controlller.

    
asked by anonymous 04.08.2017 / 18:13

1 answer

1

Problem is that you pass on the entire collection of the request to mass assignment of the create method, so it transforms the file uploader instance into a string, returning the path. Replace the image input with the $path of the saved image.

Recommendation

NEVER use the all() method for mass assignment of eloquent methods, this is a security flaw, always use the only() method to specify what to pass to eloquent.

// se a imagem não existir, o membro não será criado
// mas a imagem não deveria ser um input obrigatório?
// você pode validar isso no request, leia mais aqui:
// https://laravel.com/docs/5.4/validation#form-request-validation
if ($request->hasFile('imagem')) {
    $imagem = $request->file('imagem');

    // Para que você esta colocando esse time()?
    // Eu não salvaria só com time, fica muito sem padronização.
    // Eu utilizaria um package de geração de uuid, por exemplo
    // https://github.com/ramsey/uuid
    // salvaria: 396e0a22-74a9-4b18-b9f8-9f2d32b9b70c.jpg
    // ou
    // {userId}-time().extension
    $filename = time() . '.' . $imagem->getClientOriginalExtension();

    // Aqui você esta definindo como irá ficar o caminho
    // que a imagem será salva
    // p.x: /imagem/igreja/membros/1501865802.jpg
    $imagePath = public_path('/imagem/igreja/membros/' . $filename);

    // Você precisa fazer uma checagem se a imagem foi salva
    // e se ocorrer algum erro e não for salva? sem espaço no servidor
    // sem permissões de pasta
    Image::make($imagem)
           ->resize(100, 100)
           ->save($imagePath);

    // Troque o input imagem, que até agora é instancia de file uploader
    // troque pelo diretório da imagem desse usuário, que foi salvo acima.
    $request->replace(['imagem' => $imagePath]);

    // Defina aqui todos os inputs de seu formulário
    $fields = $request->only([
                        'name',
                        'imagem'
                    ]);



    // Não é recomendado utilizado o método all()
    // para preencher métodos de mass assignment
    $created = $membro->create($fields);

    if ($created == true){
        return redirect()
               ->route('membro.index')
               ->withMsg('Membro cadastrado com sucesso!'); // método mágico :)
    }

    // temos um problema de lógica aqui
    // se o membro não for creado, você apenas da o redirect back
    // mas não retorna nenhuma mensagem de erro
    return redirect()->back();
}
    
04.08.2017 / 18:42