3
respostas

Como passa outras extensões de imagens ou como mandar um link da imagem para o banco Laravel5.2?

No meu código atual esta tudo funcionado a minha duvida e como posso passa outras formas de extensões de imagens que não seja "(.jpg)" ou como posso salvar essa extensão no banco de dados ou ate mesmo um link da imagem com esta solução alguém pode ajudar ? desde já obrigado.

Controller

public function postSaveAccount(Request $request)
    {
        $this->validate($request, [
            'email' => 'required|email|max:100'
        ]);

        $user           = Auth::user();
        $old_email      = $user->email;
        $user->email    = $request['email'];


        $user->update();
        $file = $request->file('image');

        $file_email     = $request['email'] . '-' . $user->id . '.jpg';
        $old_file_email = $old_email . '-' . $user->id . '.jpg';
        $update = false;

        if (Storage::disk('local')->has($old_file_email)) {
            $old_file = Storage::disk('local')->get($old_file_email);
            Storage::disk('local')->put($file_email, $old_file);
            $update = true;
        }

        if ($file) {
            Storage::disk('local')->put($file_email, File::get($file));
        }

        if ($update && $old_file_email !== $file_email) {
            Storage::delete($old_file_email);
        }
        return redirect()->route('account');
    }

    public function getUserImage()
    {
        $user  = Auth::user();
        $image ="". $user->email . '-' . $user->id . '.jpg';
        $file  = Storage::disk('local')->get($image);
        return Response::make($file,200,[ 'Content-Type' => 'image/jpeg']);


    }

Route

Route::get('/account', [
    'uses' => 'UserController@getAccount',
    'as'   => 'account'
]);

Route::post('/upateaccount', [
    'uses' => 'UserController@postSaveAccount',
    'as'   => 'account.save'
]);

Route::get('/userimage', [
    'uses' => 'UserController@getUserImage',
    'as'   => 'account.image'
]);

View

 <img src="{{ route('account.image')}}">

Repository GitLab https://gitlab.com/ronnyere/imageUploadLaravel.git

3 respostas

Oi Ronnyere, tudo bom?

Você pode trocar a concatenação da extensão do arquivo pela extensão selecionada pelo usuario:

$extension = $request->imagem->extension();
ou 
$extension = $request->file("imagem")->extension();

Com a extensão na mão a gente pode concatenar:

       $file_email     = $request['email'] . '-' . $user->id .$extension;
        $old_file_email = $old_email . '-' . $user->id . $extension;

Qualquer duvida é só falar.

Abraço e bons estudos =)

Boa Andre Chaves! vou testar sua solução. contudo Eu estava testando uma outra solução que manda o link para o banco de dados e salvar na pasta Storage a imagem dai não precisava passa a extensão, ate ai tranquilo o problema na solução que encontrei e como da o return da imagem com GET para mostrar na view.

Controller

public function update_avatar(Request $request){

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

            $file            = $request->file('avatar');
            $filename        = time() . '.' . $file->getClientOriginalExtension();
            $image           = Image::make($file);

            $image->fit(250, 250, function ($constraint) {
                $constraint->aspectRatio();
            });

            Storage::put($filename, (string) $image->encode());

            $user         = Auth::user();
            $user->avatar = $filename;
            $user->save();
        }

        return view('profile', array('user' => Auth::user()) );
    }

    public function getUserImage(Request $request){
        //return image the past Storage
    }

View Criei essa rota para pegar o metodo getUserImage() e retorna a imagem minha duvida e como da o return

 <img src="{{ route('profile.image')}}">

Em Resposta a minha pergunta essa e a solução referente a usar um link que salvar a extensão no Banco de dados. Estou usando uma Lib chamada Intervention Image, fiz as configurações para salvar o arquivo na pasta Storage por questão de segurança e criei uma Route GET para capturar a imagem e exibir na View.

Solução Controller

public function update_avatar(Request $request){

        if($request->hasFile('avatar')){
            $user            = Auth::user();
            $old_avatar      = $user->avatar;
            $file            = $request->file('avatar');
            $filename        = time() . '.' . $file->getClientOriginalExtension();
            $old_file_avatar = $old_avatar . time() . '.' . $file->getClientOriginalExtension();
            $image           = Image::make($file);

            $image->fit(250, 250, function ($constraint) {
                $constraint->aspectRatio();
            });

            Storage::put($filename, (string) $image->encode());

            $user->avatar = $filename;
            $user->save();


        }

        if (Storage::disk('local')->exists($old_avatar)) {
            Storage::delete($old_file_avatar);
        }

        return redirect('profile');
    }

    public function getUserImage()
    {
        $user        = Auth::user();
        $old_avatar  = $user->avatar;
        $file        = Storage::disk('local')->get($old_avatar);
        return Response::make($file,200,[ 'Content-Type' => $old_avatar]);


    }

Route

Route::get('profile', 'UserController@profile');

Route::post('profile', 'UserController@update_avatar');

Route::get('/userimage', [
    'uses' => 'UserController@getUserImage',
    'as'   => 'profile.image'
]);

View

<img src="{{ route('profile.image')}}>

Unico Problema nesta solução e que não estou conseguindo passa essa condição para Deletar o arquivo anterior se alguém souber como posso esta resolvendo esse problema sou muito grato.

if (Storage::disk('local')->exists($old_avatar)) {
            Storage::delete($old_file_avatar);
        }