Laravel: Base64 изображение не загружается - PullRequest
0 голосов
/ 08 ноября 2018

Используя 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>

Я, честно говоря, не уверен, что именно из-за вышеизложенного вызывает ошибку. Если бы кто-нибудь мог помочь, я был бы очень благодарен.

1 Ответ

0 голосов
/ 08 ноября 2018

Вы должны декодировать строку base64 в двоичный файл перед тем, как вставить ее в поле varbinary, поскольку она будет принимать только данные binary.

Base64 разрешает безопасную передачу двоичного файла, но это не допустимое двоичное значение для mssql varbinary, так как это строковый тип.

DECLARE @string varchar(20)

SET @string = 'Hello World'

SELECT CONVERT(varbinary, @string)

Кроме того, если вы на самом деле используете mssql, вы должны добавить тэг mssql к своему вопросу соответственно, есть много людей с большим количеством навыков mssql (mssql это не моя типичная повседневная база данных, мои знания об этом серьезно ограничен), которые не отвечают на ваш вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...