【问题标题】:Converting image files to VARBINARY(max) in flutter在颤动中将图像文件转换为 VARBINARY(max)
【发布时间】:2021-09-27 22:05:12
【问题描述】:

我需要将使用“图像选择器”捕获的图像存储在 SQL 服务器数据库中

final image = await ImagePicker().pickImage(source: ImageSource.camera, imageQuality: 25);

现在,我知道图像应该存储在“VARBINARY”数据类型中。我尝试将从“ImagePicker()”获得的 XFile“图像”转换为 VARBINARY,这些是我所做的步骤。

final image = await ImagePicker().pickImage(source: ImageSource.camera, imageQuality: 25);

var imageTemp = File(image.path);

然后我使用以下方法将图像存储在数据库中。

Attachment(
            attachmentData: base64Encode((imageTemp .readAsBytesSync())),
            attachmentName: imageTemp .path.split('/').last,
            attachmentSize: imageTemp .readAsBytesSync().lengthInBytes,
            attachmentType: imageTemp .path.split(".").last,
          )

"attachmentData: base64Encode((imageTemp .readAsBytesSync()))" “附件数据是一个字符串” 所以从 XFile 到 VARBINARY,我做了以下操作

 final image = await ImagePicker().pickImage(source: ImageSource.camera, imageQuality: 25);
 var imageTemp = File(image.path);

  base64Encode((imageTemp .readAsBytesSync())) //the sent data 

当我在 readAsByteSynce() 之后打印数据时,它以 [255,216,.255,..] 开头,即 FF D8 FF 看起来像这样 screen shot of print(imageTemp.readAsBytesSync())

当我使用 base64Encode 打印图像时,它以 /9j/4Q 开头 看起来像这样 screen shot of print(base64Encode((imageTemp.readAsBytesSync())))

现在,当它存储在 SQL Server 数据库中时,它以 0x2F39 开头 看起来像这样screen shot of the attachmebtData field in the SQL server database

图片扩展名为 .jpg。 jpg 图像不应该以 0xFF 开头吗? 我需要拍摄这些图像并在 ArcGIS 中查看它们,当我打开图像时,它说图像的格式不受支持。

谁能告诉我我做错了什么以及为什么我的 jpg 图像在数据库中以 0x2F 而不是 0xFFD8FF 开头以及如何解决这个问题? 我希望将图像存储在数据库中

我还尝试使用 dart 包 hex 0.2.0 将 Uint8List 转换为十六进制 将其转换为the output of print(Hex.encode(await image.readAsBytes))

正如您在上图中看到的,它以 ffd8ff 开头,这是 jpg 图片的正确格式,但是当我将其发送到数据库时,它看起来像是将这些字母转换为 VARBINARY 和输出以 0x666666 开头,看起来像这样image from SQL server AttachmentData field when Hex.encode data was sent to it

【问题讨论】:

  • 0x2F39 是字符 /9 的字节。您正在对图像数据字节进行 base64 编码以发送它 - 但是在插入数据库之前您在哪里对其进行 base64 解码?
  • 老兄,问题是我没有解码。在您发表评论后,我对 API 进行了解码,然后再将其插入数据库。多谢。我正在使用python,这就是我所做的。 "attachment.attachmentData = base64.decodebytes(attachment.attachmentData)" 您能否添加您的评论作为答案,以便我批准?

标签: sql sql-server image flutter varbinary


【解决方案1】:

问题是在将其插入数据库之前,我没有在后端对其进行解码。

我正在使用 Python“FAST API”,我需要在 attachmentdata 中写入以下行,然后再将其插入数据库。

attachment.attachmentData = base64.decodebytes(attachment.attachmentData)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-06
    • 2022-01-06
    • 2012-08-26
    • 1970-01-01
    • 1970-01-01
    • 2021-05-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多