Php 从字符串中提取base64图像并将其与表单一起发布

Php 从字符串中提取base64图像并将其与表单一起发布,php,laravel,laravel-blade,Php,Laravel,Laravel Blade,我正试图在我的Laravel项目中上传一张带有我表格的图像。我有一个图像裁剪器,它将图像保存为data:Image/jpeg;base64,/9j/4AAQSKZJRGABAQAAAQABAD/。 裁剪器发送一个JSON字符串,其中包含文件的base64编码字符串,我需要将JSON字符串解析为一个对象,然后提取base64字符串并将其转换为文件对象 我在上传过程中使用图像干预 控制器功能 public function store(Request $request) {

我正试图在我的
Laravel
项目中上传一张带有我表格的图像。我有一个图像裁剪器,它将图像保存为
data:Image/jpeg;base64,/9j/4AAQSKZJRGABAQAAAQABAD/。

裁剪器发送一个
JSON
字符串,其中包含文件的
base64
编码字符串,我需要将
JSON
字符串解析为一个对象,然后提取
base64
字符串并将其转换为文件对象

我在上传过程中使用
图像干预

控制器功能

public function store(Request $request)

    {

        // save post in db

        $post = new Post;

        $post->title = $request->title;
        $post->body = $request->body;
        $post->user_id = auth()->id();



        if ($request->hasFile('featimage')) {
            $image = $request->file('featimage');
            $filename = time() . '.' . $image->getCLientOriginalExtension();

            $image = trim($image);
            $image = str_replace('data:image/png;base64,', '', $image);
            $image = str_replace('data:image/jpg;base64,', '', $image);
            $image = str_replace('data:image/jpeg;base64,', '', $image);
            $image = str_replace('data:image/gif;base64,', '', $image);
            $image = str_replace(' ', '+', $image);

            $imagedata = base64_decode($image);
            //Set image whole path here 

            $location = public_path('images/uploads/' . $filename);
            Image::make($image)->save($location);
            $post->image = $filename;
        }

        $post->save();

        $post->tags()->sync($request->tags, false);


        Session::flash('success', 'The blog post was saved successfully!');

        return redirect()->route('posts.show', $post->id);

                    }
看法

{{csrf_field()}
上传图像
柱体
拯救
取消

我读过其他类似的帖子,我显然遗漏了一些东西,但我不知道是什么。

试试这个,希望它对你有用

$featimage = $request->featimage; // base64 encoded image string

if (!empty($featimage)) {
    $image_parts = explode(";base64,", $featimage);
    $image_type_aux = explode("image/", $image_parts[0]);
    $image_type = $image_type_aux[1];
    $image_base64 = base64_decode($image_parts[1]);
    $imagename = rand(1, 999) . time() . '.png';
    $RootPath = public_path("images/uploads/"); // path where you want to upload image
    if (!File::exists($categoryRootPath)) {
        File::makeDirectory($categoryRootPath, 0777, true, true);
    }

    file_put_contents($RootPath . $imagename, $image_base64);

    $post->image = $imagename;  
}

我在我的程序中运行了你的代码,我得到了很多错误。如果您试图将输入作为base64编码字符串作为
“数据:image/jpeg;base64、/9j/4AAQSKZJRGABAQAAAQABAD/。
并将其转换为图像文件,然后使用以下代码:

$post = new Post;
$post->title = $request->title;
$post->body = $request->body;
$post->user_id = auth()->id();

if ($request->featimage) {
    $image = $request->featimage; // your base64 encoded
    $filename = time() . '.' . explode('/', explode(':', substr($image, 0, strpos($image, ';')))[1])[1];

    $image = str_replace('data:image/jpg;base64,', '', $image);
    $image = str_replace(' ', '+', $image);
    $location = public_path('images/uploads/' . $filename);
    Image::make($image)->save($location);
    $post->image = $filename;
}

$post->save();
如果您试图获取普通图像文件并将其保存在公用文件夹中,以及将其转换为base64格式,请使用以下代码

$post = new Post;
$post->title = $request->title;
$post->body = $request->body;
$post->user_id = auth()->id();

if ($request->hasFile('featimage')) {
    $image = $request->file('featimage'); 
    $extension = $image->getCLientOriginalExtension(); //gives extension of image
    $filename = time() . '.' . $extension; //gives filename

    $location = public_path('images/uploads/' . $filename); //sets path

    $image = Image::make($image)->save($location); //makes image and saves it to that location

    $base64 = 'data:image/' . $extension . ';base64,' . base64_encode($image); //changes image to base64 image

    $post->image = $filename;
}

$post->save();
我希望下面的代码为您提供了解决方案。
谢谢。

您可以尝试此功能

    function uploadImage($base_64_string,$image_name)
{

    preg_match("/^data:image\/(.*);base64/i", $base_64_string, $match);
    $extension_array = explode('/', (explode(';', $base_64_string))[0]);
    $extension = end($extension_array);

    $img = $base_64_string;
    if ($extension == 'png' || $extension == 'jpg' || $extension == 'jpeg'){
        $img = str_replace('data:image/' . $extension . ';base64,', '', $img);}
    elseif ($extension == 'mp4' || $extension == 'mov'){
        $img = str_replace('data:video/' . $extension . ';base64,', '', $img);
    }
    $img = str_replace(' ', '+', $img);

    $data = base64_decode($img);

    $fileNameI = $image_name.'_'.rand().time() . '.' . $extension;

//Uploading Image To S3 Bucket
    $s3 = Storage::disk('s3-image');
    $filePath = Config::get('common.Image_Folder') . $fileNameI;
    $s3->put($filePath, $data, 'public');

    return $fileNameI;
}

如果您没有Bucket,您可以将图像存储在本地目录中。

是否要将base64图像上载到您的服务器?是的,我想将其上载到我的public/images/uploads文件夹并将文件名保存在我的数据库中。请您提供一个指向您正在使用的裁剪器库的链接以及您必须初始化它的javascript?另外,
$request->hasFile('featimage')
的评估是否肯定为
true
?您是否将图像作为base64字符串发送给控制器?当我裁剪图像时,它会输出base64字符串,因此我需要对其进行解码并将其上载到服务器如果您将base64字符串分配给“$featimage”,则确定上面代码中的变量它肯定会工作,我在最后测试过。我需要写javascript来实现这一点吗?你能给我举个例子吗?不需要使用javascript。只需将“data:image/jpeg;base64,/9j/4aaqskzjrgabaaqaaad/”字符串分配给$featimage;并更改您的上传路径。我清楚地提到了代码中的注释。您好,这对我不起作用。谢谢您的帮助。您是否安装了图像干预软件包?还可以制作图像/上传文件夹。然后它会工作,因为它在我的代码中工作得很好。当我用同样的代码解决这个问题时,我也遇到了这个问题。谢谢你的回复。是的,我有图像干预软件包,我可以通过标准上传输入上传图像,没有问题。它没有检测到“featimage”名称标签,我想我可能需要一些js来实现这一点。如果你使用base64,那么不要使用$request->hasFile('featimage'))因为base64不是一个文件,所以只需使用$request->featimage即可
    function uploadImage($base_64_string,$image_name)
{

    preg_match("/^data:image\/(.*);base64/i", $base_64_string, $match);
    $extension_array = explode('/', (explode(';', $base_64_string))[0]);
    $extension = end($extension_array);

    $img = $base_64_string;
    if ($extension == 'png' || $extension == 'jpg' || $extension == 'jpeg'){
        $img = str_replace('data:image/' . $extension . ';base64,', '', $img);}
    elseif ($extension == 'mp4' || $extension == 'mov'){
        $img = str_replace('data:video/' . $extension . ';base64,', '', $img);
    }
    $img = str_replace(' ', '+', $img);

    $data = base64_decode($img);

    $fileNameI = $image_name.'_'.rand().time() . '.' . $extension;

//Uploading Image To S3 Bucket
    $s3 = Storage::disk('s3-image');
    $filePath = Config::get('common.Image_Folder') . $fileNameI;
    $s3->put($filePath, $data, 'public');

    return $fileNameI;
}