我想将图像保存到MSSQL中的varbinary(max)字段中。
我的控制器中的商店方法如下所示:
public function store(Request $request)
{
$vorname = $request->input('vorname');
$nachname = $request->input('nachname');
$file = $request->file('avatar');
$extension = $file->clientExtension();
$fullname = $nachname . "_" . $vorname . "." . $extension;
$file->storeAs('avatars' , $fullname);
$path = storage_path() . "\app\avatars\\". $fullname;
$imageData = unpack("H*", file_get_contents($path));
Mitarbeiter::create([
'PersonalNr' => request('personalnr'),
'Mitarbeiterschluessel' => request('mitarbeiterkey'),
'Vorname' => $vorname,
'Familienname' => $nachname,
'Bild' => $imageData[1]
]);
return view('welcome');
}
我收到了一个错误:
SQLSTATE [42000]:[Microsoft] [SQL Server的ODBC驱动程序11] [SQL Server] Die implizite Konvertierung vom nvarchar(max)-Datentyp in varbinary(max)istnichtzulässig。
翻译:
从nvarchar(max)数据类型到varbinary的隐式转换 (最大)是不允许的。
答案 0 :(得分:0)
我遇到了同样的问题,但我找到了一种方法让它与Laravel的DB类一起工作。
基本上就像在任何其他语言中一样,某些类型不能被隐式转换,MSSQL的类型也是如此。这是MSSQL的所有类型转换的图像。 请注意,从 nvarchar的的到 VARBINARY 的你只能做的显式转换
因为在PHP中你没有"二进制"键入并只是一个字符串,我们无法将其直接存储到MSSQL中。要解决此问题,我们需要手动/ 将显式转换为二进制/ varbinary 。从conversions的binary/varbinary读取,我们需要在图片上调用 CAST 或 CONVERT 。
由于我们想做预备语句,我们可以说CONVERT(VARBINARY(MAX), ?)
然后将其绑定到图像值。
DB::statement(
"INSERT INTO files (PersonalNr, Mitarbeiterschluessel, Vorname, Familienname, Bild) VALUES (?,?,?,?,CONVERT(VARBINARY(MAX), ?));", [
request('personalnr'),
request('mitarbeiterkey'),
$vorname,
$nachname,
base64_encode(file_get_contents($path))
]);
请注意,我不做任何打包/解压缩,而只是base64_encode的字符串,因为据我所知,你不能轻易地将二进制从PHP传递给SQL。
答案 1 :(得分:0)
此代码对我有用
if($request->input('Image')){
$datastring = file_get_contents($request->input('Image'));
$data = unpack("H*hex", $datastring);
$data = '0x'.$data['hex'];
$photo = \App\TraineeImage::where('ID', 13)->first();
$photo->update(['Image' => \DB::raw("CONVERT(VARBINARY(MAX), $data) ") ]);
}
答案 2 :(得分:0)
我最近遇到了类似的要求,并且这样做了。 (假设$ base64String是包含base64格式图像的字符串)
UserProfilePicture::updateOrCreate(
['user_id' => $this->user_id],
[
'type' => $type,
'size' => $size,
'data' => DB::raw("cast(N'' as xml).value('xs:base64Binary(\"".$base64String."\")', 'varbinary(max)')")
]
);
答案 3 :(得分:0)
我知道这个主题很老,但这是我的解决方法
$doc = file_get_contents($path);
$data = unpack("H*hex", $doc);
DB::connection("sqlsrv")->statement("INSERT INTO tb_docs (id, doc) VALUES (?,0x".$data['hex'].");",[$id]);
“ doc”字段的数据类型为varbinary(max),没有属性FILESTREAM,在该字段中,我存储了JPG,PNG,PDF之类的文件,效果很好