Laravel:Base64图片未上传

时间:2018-11-08 11:29:10

标签: php laravel

我使用Laravel和PHP,试图将照片添加到数据库中。该数据库仅拍摄base64张图片。

我获取了一个给定的文件,确认它是图像类型(png,jpg等),然后尝试将其编码为base64图像。然后,我尝试将其与有关该对象的其他详细信息一起上传到数据库。

但是,这不起作用。相反,我被告知数据类型不匹配:

  

SQLSTATE [HY000]:常规错误:20018从数据进行隐式转换   不允许将varchar(max)类型更改为varbinary(max)。使用转换   函数来运行此查询。 [20018](严重性16)

当我从插入中删除“照片”值时,我的代码绝对有效。所以我想知道我正在做什么可能是问题所在。

请参阅下面的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 :(得分:0)

您必须先将base64字符串解码为二进制,然后才能将其插入varbinary字段,因为它仅接受$(document).on('click','td', function(e) { var id = $(this).closest('tr').data('id'); if(e.target == this) location.href = id; }); 数据。

base64允许安全的二进制文件传输,但是它不是mssql varbinary的有效二进制值,因为它是字符串类型。

binary

此外,如果您实际使用的是mssql,则应在问题中相应地添加mssql标记,那里有很多具有许多mssql技能的人(mssql不是我通常的日常数据库,我对它的了解受到严重限制)而遗漏了您的问题。