我使用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>
老实说,我不确定导致错误的原因是什么。如果有人可以帮忙,我将非常感激。
答案 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不是我通常的日常数据库,我对它的了解受到严重限制)而遗漏了您的问题。