【问题标题】:How to insert binary data to SQL using Laravel 5.*如何使用 Laravel 5.* 将二进制数据插入 SQL
【发布时间】:2022-01-11 02:53:21
【问题描述】:

我想将图像保存到 MSSQL 中的 varbinary(max) 字段中。

我的控制器中的 store 方法如下所示:

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][ODBC Driver 11 for SQL Server][SQL Server]Die implizite Konvertierung vom nvarchar(max)-Datentyp in varbinary(max) ist nicht zulässig.

翻译:

从 nvarchar (max) 数据类型到 varbinary 的隐式转换 (max) 是不允许的。

【问题讨论】:

  • 一个题外话的问题,你为什么要尝试将图像存储在数据库中? Laravel 提供了一个很棒的 Storage API,你为什么不使用它呢?有什么特别的原因吗?

标签: php sql-server laravel


【解决方案1】:

我最近遇到了类似的要求,并这样做了。 (假设 $base64String 是包含 base64 格式图像的字符串)

$sql = "CAST(N'' AS xml).VALUE('xs:base64Binary(\"".$base64String."\")', 'VARBINARY(max)')";

UserProfilePicture::updateOrCreate(
    ['user_id' => $this->user_id],
    [
        'type' => $type,
        'size' => $size,
        'data' => DB::raw($sql),
    ],
);

【讨论】:

  • 一个多星期后...这是最好的解决方案
  • 谢谢@BenjaminIni
【解决方案2】:

我也面临同样的问题,但我想出了一种方法让它与 Laravel 的 DB 类一起工作。

基本上就像任何其他语言一样,某些类型不能隐式转换,MSSQL 的类型也是如此。这是 MSSQL 的所有类型转换的图像。 请注意,From nvarchar To varbinary 您只能进行显式转换。 p>

由于在 PHP 中没有“二进制”类型,而只是一个 字符串,我们不能将它直接存储到 MSSQL 中。为了解决这个问题,我们需要手动/显式地转换我们的图像到 binary/varbinary。从conversionsbinary/varbinary 读取,我们需要在我们的图像上调用CASTCONVERT

由于我们想做预处理语句,我们可以说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'ed 字符串,因为据我了解,您不能那么容易地将二进制文件从 PHP 传递到 SQL。

【讨论】:

    【解决方案3】:

    这段代码对我有用

    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) ") ]);
    }
    

    【讨论】:

      【解决方案4】:

      我知道这个主题已经很老了,但是这是我的解决方法

      $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 等文件,并且工作得很好

      【讨论】:

        猜你喜欢
        • 2014-04-11
        • 1970-01-01
        • 1970-01-01
        • 2010-10-15
        • 2010-11-10
        • 2012-07-01
        • 2010-09-27
        • 2015-06-09
        • 1970-01-01
        相关资源
        最近更新 更多