Flutter将ImagePicker采集图片存入SQL Server VARBINARY(max)异常问题
问题根因
你两次存储失败的核心原因都是:将编码后的字符串直接传入了VARBINARY类型字段,SQL Server存储时会自动将字符串的每个字符转换为对应的ASCII二进制值存入,最终存储的不是图片本身的原始二进制数据:
- 第一次传base64编码结果时,开头的
/9j字符对应ASCII编码为0x2F、0x39、0x6A,因此数据库字段开头显示为0x2F39 - 第二次传Hex编码结果时,开头的
ff字符对应ASCII编码为0x66,因此数据库字段开头显示为0x666666
正确解决方案
VARBINARY类型直接存储原始字节流即可,不需要做base64或Hex编码操作,操作步骤如下:
- 读取图片的原始Uint8List字节:
final image = await ImagePicker().pickImage(source: ImageSource.camera, imageQuality: 25); // 直接读取XFile的原始字节即可,无需额外转File处理 Uint8List imageRawBytes = await image.readAsBytes();
- 调整数据模型与传参逻辑:
将你Attachment类中attachmentData字段的类型从String改为Uint8List,构造对象时直接传入原始字节:
Attachment( attachmentData: imageRawBytes, attachmentName: image.path.split('/').last, attachmentSize: imageRawBytes.lengthInBytes, attachmentType: image.path.split(".").last, )
- 数据库交互时确保参数类型正确:
调用数据库接口写入数据时,必须将attachmentData标记为二进制类型参数传入,不要做任何字符串编码转换。
修改后存入SQL Server的VARBINARY字段开头会变为0xFFD8FF,符合JPG格式的标准文件头,ArcGIS即可正常识别读取图片。
内容的提问来源于stack exchange,提问作者Ramy Gomaa
相关产品推荐
相关产品推荐

