在 flutter 中将图像文件转换为 VARBINARY(max)
Converting image files to VARBINARY(max) in flutter
我需要在 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,
)
“附件数据: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 服务器数据库中时,它以 0x2F39 开头
看起来像这样 screen shot of the attachmebtData field in the SQL server database
图片扩展名为.jpg。 jpg图片不应该以0xFF开头吗?
我需要拍摄这些图像并在 ArcGIS 中查看它们,当我打开图像时它说图像的格式不受支持。
有人可以告诉我我做错了什么吗?为什么我的 jpg 图像在数据库中以 0x2F 开头而不是 0xFFD8FF 以及如何解决这个问题?
我要图片存入数据库
我还尝试使用 dart 包将 Uint8List 转换为十六进制 hex 0.2.0
将其转换为 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
问题是我在将它插入数据库之前没有在后端对其进行解码。
我正在使用 Python“FAST API”,在将其插入数据库之前,我需要将以下行写入 attachmentdata。
attachment.attachmentData = base64.decodebytes(attachment.attachmentData)
我需要在 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,
)
“附件数据: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 服务器数据库中时,它以 0x2F39 开头 看起来像这样 screen shot of the attachmebtData field in the SQL server database
图片扩展名为.jpg。 jpg图片不应该以0xFF开头吗? 我需要拍摄这些图像并在 ArcGIS 中查看它们,当我打开图像时它说图像的格式不受支持。
有人可以告诉我我做错了什么吗?为什么我的 jpg 图像在数据库中以 0x2F 开头而不是 0xFFD8FF 以及如何解决这个问题? 我要图片存入数据库
我还尝试使用 dart 包将 Uint8List 转换为十六进制 hex 0.2.0 将其转换为 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
问题是我在将它插入数据库之前没有在后端对其进行解码。
我正在使用 Python“FAST API”,在将其插入数据库之前,我需要将以下行写入 attachmentdata。
attachment.attachmentData = base64.decodebytes(attachment.attachmentData)