web-dev-qa-db-fra.com

Laravel: Enregistrer le fichier .png Base64 dans le dossier public à partir du contrôleur

J'envoie un fichier image png au contrôleur en base64 via Ajax. J'ai déjà testé et vérifié que le contrôleur a reçu l'identifiant mais ne peut toujours pas l'enregistrer dans un dossier public.

Voici mon contrôleur

public function postTest() {
        $data = Input::all();

        //get the base-64 from data
        $base64_str = substr($data->base64_image, strpos($data->base64_image, ",")+1);

        //decode base64 string
        $image = base64_decode($base64_str);
        $png_url = "product-".time().".png";
        $path = public_path('img/designs/' . $png_url);

        Image::make($image->getRealPath())->save($path);
        // I've tried using 
        // $result = file_put_contents($path, $image); 
        // too but still not working

        $response = array(
            'status' => 'success',
        );
        return Response::json( $response  );
}
10
Expl0de

Image d'intervention obtient des données binaires en utilisant la fonction file_get_content: Référence: http://image.intervention.io/api/make

Votre contrôleur devrait ressembler à ceci:

public function postTest() {
    $data = Input::all();
    $png_url = "product-".time().".png";
    $path = public_path().'img/designs/' . $png_url;

    Image::make(file_get_contents($data->base64_image))->save($path);     
    $response = array(
        'status' => 'success',
    );
    return Response::json( $response  );
 }
12

C'est une erreur facile.

Vous n'utilisez pas public_path correctement. CA devrait etre:

$path = public_path() . "/img/designs/" . $png_url;

De plus, j'éviterais votre méthode d'envoi de l'image. Regardez un téléchargement approprié dans un formulaire et utilisez la méthode Input :: file de Laravel.

5
Daniel Twigg
$data = Input::all();
$png_url = "perfil-".time().".jpg";
$path = public_path() . "/img/designs/" . $png_url;
$img = $data['fileo'];
$img = substr($img, strpos($img, ",")+1);
$data = base64_decode($img);
$success = file_put_contents($path, $data);
print $success ? $png_url : 'Unable to save the file.';
3
Carlos Mundaray
$file = base64_decode($request['image']);
        $folderName = 'public/uploads/';
        $safeName = str_random(10).'.'.'png';
        $destinationPath = public_path() . $folderName;
        $success = file_put_contents(public_path().'/uploads/'.$safeName, $file);
        print $success;
2
nageen nayak

Ma solution est:

public function postTest() {
        $data = Input::all();

        //get the base-64 from data
        $base64_str = substr($data->base64_image, strpos($data->base64_image, ",")+1);

        //decode base64 string
        $image = base64_decode($base64_str);
        Storage::disk('local')->put('imgage.png', $image);
        $storagePath = Storage::disk('local')->getDriver()->getAdapter()->getPathPrefix();
        echo $storagePath.'imgage.png'; 
        $response = array(
            'status' => 'success',
        );
        return Response::json( $response  );
}
1
Armando Cordova

Je l'ai fait !! 

J'ai remplacé $data->base64_image par $_POST['base64_image'] et ensuite utilisé $result = file_put_contents($path, $image); Au lieu de Image::make($image->getRealPath())->save($path); 

Mais cela ne ressemble pas à un Laravel façons. Si vous avez un autre aspect plus élégant, dites-le-moi!

0
Expl0de

En fait, Input::all() retourne une array d'entrées afin que vous ayez:

$data = Input::all();

Maintenant, votre $data est un tableau et non un objet. Vous essayez donc d'accéder à l'image en tant qu'objet tel que:

$data->base64_image

Donc, ça ne marche pas. Vous devriez essayer d'utiliser:

$image = $data['base64_image'];

Étant donné que (base64_image) est accessible à partir de $_POST, alors Input::file('base64_image') ne fonctionnera pas car Input::file('base64_image') vérifie le tableau $_FILES et ne figure pas dans votre cas.

0
The Alpha

qu'est-ce que je fais utilise de manière basique 

$file = base64_decode($request['profile_pic']);
            $folderName = '/uploads/users/';
            $safeName = str_random(10).'.'.'png';
            $destinationPath = public_path() . $folderName;
            file_put_contents(public_path().'/uploads/users/'.$safeName, $file);

           //save new file path into db
            $userObj->profile_pic = $safeName;
        }
0
Learner