Используя Laravel и PHP, я пытаюсь добавить фотографию в базу данных. Эта база данных принимает только base64
изображений.
Я беру данный файл, проверяю его тип изображения (png, jpg и т. Д.) И пытаюсь кодировать его как base64
изображение. Затем я пытаюсь загрузить его в базу данных с другими подробностями об объекте.
Однако это не работает. Вместо этого мне сообщают о несоответствии типов данных:
SQLSTATE [HY000]: общая ошибка: 20018 неявное преобразование из данных
Тип varchar (max) для varbinary (max) не допускается. Используйте КОНВЕРТ
функция для запуска этого запроса. [20018] (серьезность 16)
Мой код работает, когда я удаляю значение 'photo' из вставки. Поэтому мне интересно, что может быть проблемой с тем, что я делаю.
См. Ниже мою функцию контроллера Laravel.
public function addStudent(Request $request) {
$courses = [1, 2, 3, 4, 5];
$statuses = [1,2,3,4];
$validated = Validator::make($request->all(), [
"submit" => "required",
"student_id" => ["required", "integer", "regex:/^[0-9]+$/"],
"forename" => ["required", "regex: /^[a-zA-Z’'. -]+$/"],
"surname" => ["required", "regex: /^[a-zA-Z’'. -]+$/"],
"course_id" => ["required", Rule::in([1, 2, 3, 4, 5]) ],
"status_id" => ["required", Rule::in([1, 2, 3, 4]) ],
/*Image validation done here: must be of the types below
Since this part passes, I know I am working with an image */
"photo" => "required|image|file:jpeg,png,jpg,gif,svg|max:2048"
]);
$errors = $validated->errors();
if($validated->fails()) {
return redirect()->back()->withInput($request->all())->withErrors($errors);
}
$data = $request->all();
/* Here I try to encode the image as base64 */
if ($request->hasFile("photo")) {
if($request->file("photo")->isValid()) {
$file = $request->file('photo');
$image = base64_encode($file);
$image = base64_encode(file_get_contents($request->file('photo')));
if (!($image)) {
echo "<h3>Image null!</h3>";
}
}
} else {
echo "<h3>Request doesn't have photo</h3>";
}
/*Try to upload values to database, return errors if fail */
try {
$insert =
DB::table('CCEAGpoc.dbo.Student')->insert([
['student_id' => $data['student_id'],
'forename' => $data['forename'],
'surname' => $data['surname'],
'course_id' => $data['course_id'],
'photo' => $image,
'status_id' => $data['status_id']]
]);
return view('success');
} catch (Exception $ex) {
return redirect()->back()->withInput($request->all())->withErrors($errors);
}
Для полной ясности моя форма выглядит следующим образом:
<form action="submitAdd" method="post" class="form-inline" enctype="multipart/form-data">
@csrf
...
<div class="form-group">
<label for="photo">Photo: </label>
<input type="file" name="photo" />
</div>
<div class="form-group">
<input type="submit" name="submit" value="Add Student" />
</div>
</form>
Я, честно говоря, не уверен, что именно из-за вышеизложенного вызывает ошибку. Если бы кто-нибудь мог помочь, я был бы очень благодарен.