Laravel:将Base64 .png文件从控制器保存到公用文件夹

时间:2014-11-06 17:43:25

标签: php laravel laravel-4

我通过Ajax将一个png图像文件发送到base64中的控制器。我已经测试并确定控制器已收到id但仍无法将其保存到公共文件夹。

这是我的控制器

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

7 个答案:

答案 0 :(得分:5)

这是一个容易犯的错误。

您正在错误地使用public_path。它应该是:

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

另外,我会避免你发送图像的方法。查看表单中的正确上传并使用Laravel的Input :: file方法。

答案 1 :(得分:4)

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

答案 2 :(得分:4)

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

答案 3 :(得分:1)

我的解决方案是:

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

答案 4 :(得分:0)

我做完了!!

我换了 $data->base64_image$_POST['base64_image']然后使用 $result = file_put_contents($path, $image); 而不是Image::make($image->getRealPath())->save($path);

但这看起来并不像是一种拉扯方式。我有另一种看起来更优雅的方式,请告诉我!

答案 5 :(得分:0)

实际上,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数组,并且在您的情况下它不存在

答案 6 :(得分:0)

我在做什么是使用基本方式

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