Извлеките изображение base64 из строки и отправьте его с формой - PullRequest
0 голосов
/ 09 апреля 2019

Я пытаюсь загрузить изображение с моей формой в моем проекте Laravel. У меня есть Обрезка изображения, который сохраняет изображение как data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/..

Кроппер отправляет строку JSON, которая содержит строку файла в кодировке base64, мне нужно проанализировать строку JSON для объекта, а затем извлечь строку base64 и превратить ее в объект файла .

Я использую Image Intervention для процесса загрузки

Функция контроллера

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

                    }

View

<form class="form-horizontal" action="{{route('posts.store')}}" method="POST" enctype="multipart/form-data">{{ csrf_field() }}

<fieldset class="form-group">
<label for="featimage">Upload Image</label>
<input type="file" class="form-control slim" data-ratio="4:3" name="featimage">

<label class="col-md-2 col-form-label">Post Body</label>
<textarea type="textarea" class="form-control" rows="10" name="body"></textarea>
</fieldset>

<button class="btn btn-primary btn-block" name="submit">Save</button>
<button class="btn btn-danger btn-block" name="submit">Cancel</button>

</form>    

Я читал другие посты, подобные этой, и мне явно что-то не хватает, но я просто не знаю, что.

Ответы [ 3 ]

0 голосов
/ 09 апреля 2019

Я запустил ваш код в моей программе и получил много ошибок. Если вы пытаетесь передать входные данные в виде строки в кодировке base-64 в виде 'data: image / jpeg; base64, / 9j / 4AAQSkZJRgABAQAAAQABAAD / ..' и преобразовать его в файл изображения, используйте следующий код ....

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

Если вы пытаетесь взять обычный файл изображения и сохранить его в общей папке, а также преобразовать его в формат base-64, используйте следующий код.

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

Я надеюсь, что следующий код предоставит вам решение. Thankyou.

0 голосов
/ 09 апреля 2019

Вы можете попробовать эту функцию.

    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, вы можете сохранить изображение в локальном каталоге.

0 голосов
/ 09 апреля 2019

Попробуйте, надеюсь, это сработает для вас.

$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;  
                    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...