如何使用Laravel 5将二进制数据插入SQL。*

时间:2018-01-15 10:51:47

标签: php laravel

我想将图像保存到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的隐式转换   (最大)是不允许的。

4 个答案:

答案 0 :(得分:0)

我遇到了同样的问题,但我找到了一种方法让它与Laravel的DB类一起工作。

基本上就像在任何其他语言中一样,某些类型不能被隐式转换,MSSQL的类型也是如此。这是MSSQL的所有类型转换的图像。 enter image description here 请注意, nvarchar的 VARBINARY 的你只能做的显式转换

因为在PHP中你没有"二进制"键入并只是一个字符串,我们无法将其直接存储到MSSQL中。要解决此问题,我们需要手动/ 显式转换为二进制/ varbinary 。从conversionsbinary/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之类的文件,效果很好