декодировать и перемещать закодированное в base64 изображение в laravel

Я пытаюсь реализовать загрузку изображения с другими элементами формы с dropzone.js в laravel. До сих пор мне удавалось отображать перетаскиваемый вид загрузки изображений с другими элементами формы. А также получить POST-данные из представленной формы. Но когда dropzone передает загруженное изображение в функцию сохранения данных базы данных, оно кодирует изображение с помощью base64. Я думаю, что мне удалось получить расширение файла также. И когда я отправляю кнопку, это дает мне эту ошибку «Вызов функции-члена move () для строки» . Пожалуйста, поставьте меня в правильном направлении.

Вот форма

<form class="form-horizontal" action="{{ route('save-slider-content') }}" method="POST" enctype="multipart/form-data">
{{ csrf_field() }}
<div class="box-body">
<div class="form-group">
<label for="inputEmail3" class="col-sm-2 control-label">Title</label>
<div class="col-sm-10">
<input type="text" class="form-control" name="sliderTitle" id="sliderTitle" placeholder="Title of the post goes here">
</div>
</div>
<input type="hidden" name="date" id="date" value="<?php echo date("d-m-Y"); ?>">
<div class="form-group">
<label for="image" class="col-sm-2 control-label">Image</label>
<input hidden id="file" name="file"/>
<div class="col-sm-10">
<div class="dropzone needsclick dz-clickable" id="fileUpload">
<div class="dz-default dz-message">
<i class="fa fa-image fa-5x"></i>
<h3 class="sbold">Drop an image here to upload</h3>
<span>You can also click to open file browser</span>
</div>
</div>
</div>
</div>
<div class="form-group">
<label for="inputEmail3" class="col-sm-2 control-label">Link</label>
<div class="col-sm-10">
<input type="text" class="form-control" name="sliderLink" id="sliderLink" placeholder="Provide a link">
</div>
</div>
</div><br>
<!-- /.box-body -->
<div class="box-footer">
<button type="submit" class="btn btn-default">Cancel</button>
<button type="submit" class="btn btn-info pull-right">Post</button>
</div>
<!-- /.box-footer -->
</form>

Вот конфигурация dropzone

<script type="text/javascript">
Dropzone.options.fileUpload = {
url: "save-slider-content",
addRemoveLinks: true,
accept: function(file) {
let fileReader = new FileReader();

fileReader.readAsDataURL(file);
fileReader.onloadend = function() {

let content = fileReader.result;
$('#file').val(content);
file.previewElement.classList.add("dz-success");
}
file.previewElement.classList.add("dz-complete");
}
}
</script>

маршрут

Route::post('store-slider-content', [ 'as' => 'save-slider-content', 'uses' => 'SliderContent@save_slider_data']);

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

public function save_slider_data(Request $request)
{
$slider = new Slider;
$slider->title = $request->sliderTitle;
$slider->title_sin = $request->sliderTitleSin;
$slider->date = $request->date;
$slider->link = $request->sliderLink;

$file = $request->file;;
$image_data = base64_decode(preg_replace('#^data:image/\w+;base64,#i', '', $file));
$f = finfo_open();
$mime_type = finfo_buffer($f, $image_data, FILEINFO_MIME_TYPE);
$imageName = time().'.'.$mime_type;
$image_data->move(public_path('slider_uploads'), $imageName);
return response()->json(['success'=>$imageName]);

$slider->img_url = $imageName;

$slider->save();
}

2

Решение

отредактированный включить логику для или Symfony\Component\HttpFoundation\File\File или же Illuminate\Support\Facades\File (Illuminate\Filesystem\Filesystem)

move это метод File объект, но $image_data это просто строка. Таким образом, вы можете записать декодированное изображение во временный файл, создать экземпляр File и двигай, как

//... your code ...
$image_data = base64_decode(preg_replace('#^data:image/\w+;base64,#i', '', $file));
// ... and then:
//grab a new tmp file
$tmpFilePath=sys_get_temp_dir().'/'.uniqid();
//write the image to it
file_put_contents($tmpFilePath, $image_data);
//move it.
//give it a name
$imageName = time().'.'.str_replace("image/","",$mime_type);
//if using Symfony\Component\HttpFoundation\File\File;
//get an instance of File from the temp file and call ->move on it
$tmpFile=new File($tmpFilePath);
$tmpFile->move(public_path('slider_uploads'), $imageName);
//or if using File facade
File::move($tmpFilePath, public_path("slider_uploads/$imageName"));
//...and then, back to your code...
$slider->img_url = $imageName;
$slider->save();
return response()->json(['success'=>$imageName]);
}
1

Другие решения

Вы можете сделать это:

В config/filesystems.phpзарегистрировать новый диск slider_uploads

'disks' => [

'local' => [
'driver' => 'local',
'root'   => storage_path('app'),
],
'slider_uploads' => [
'driver' => 'local',
'root'   => public_path('slider_uploads')
]
]

А затем использовать ваш новый диск для хранения вашего образа

$image_data = $request->file;

@list($type, $image_data ) = explode(';', $image_data );
@list(, $image_data ) = explode(',', $image_data );
if($image_data !=""){ // storing image in public/slider_uploads/ Folder
\Storage::disk('slider_uploads')->put($imageName, base64_decode($image_data ));
}
1

По вопросам рекламы [email protected]