Laravel: сохранить файл Base64 .png в общую папку с контроллера

Я отправляю файл изображения png в контроллер в base64 через Ajax. Я уже тестировал и уверен, что контроллер получил идентификатор, но все равно не может сохранить его в общей папке.

Вот мой контроллер

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 ); } 

Intervention Image получает двоичные данные, используя функцию file_get_content: Ссылка: http://image.intervention.io/api/make

Ваш контроллер должен выглядеть так:

 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 ); } 

Это легкая ошибка.

Вы неправильно используете public_path. Должен быть:

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

Кроме того, я бы избегал вашего метода отправки изображения. Посмотрите правильную загрузку в форме и используйте метод Input :: file Laravel.

 $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.'; 

Я сделал это! Я изменил $data->base64_image на $_POST['base64_image'] . И используйте $result = file_put_contents($path, $image); вместо Image::make($image->getRealPath())->save($path); Но это не похоже на ларавельные пути. У меня есть другой способ выглядеть более элегантным, пожалуйста, скажите мне!

Фактически, Input::all() возвращает array входов, поэтому у вас есть следующее:

 $data = Input::all(); 

Теперь ваши $data являются массивом, а не объектом, поэтому вы пытаетесь получить доступ к изображению в виде объекта:

 $data->base64_image 

Таким образом, он не работает. Вы должны попробовать:

 $image = $data['base64_image']; 

Поскольку он ( base64_image ) доступен из $_POST то Input::file('base64_image') не будет работать, потому что Input::file('base64_image') проверяет массив $_FILES и его нет в вашем случае.

то, что я делаю, использует основной способ

 $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; } 

Мое решение:

 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 ); }