Я отправляю файл изображения 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 ); }