How do I solve this problem of method create in Laravel

Asked

Viewed 290 times

0

Well, I have a form that contains an html input of an image. When I send the form to Control, I do the image processing, taking his name and uploading to the image directory. More when I see in the bank the name of the image is not correct. See in the image beside -> O Nome da imagem no banco vai dessa forma, diferente do nome que vai para o diretório

So with this problem I can not find the image, since the names do not match (The name of the directory != of the name of the bank). See how I am 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 will, but the image won’t. I’m seriously afraid of having to do it that way:

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

Because I have a large form and would mess up my controlller.

  • you are filling the variable $filename before save, that is, taking the directory tmp image. Mount the directory that the image will be stored, pass this directory to the method save and save him on the bench.

  • On this line I already have the name of the image. Maybe I didn’t mean what you mean. $filename = time() . '. ' . $imagem->getClientOriginalExtension() Soon after I thought of assigning the value $filename in $membro->imagem , and then saving. but he’s not going to the bank

1 answer

1


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

Recommending

NEVER use the method all() for mass assignmentof eloquent methods, this is a security flaw, always make use of the method only() to specify what will be passed on to the 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();
}

Browser other questions tagged

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