【发布时间】:2020-10-15 18:02:13
【问题描述】:
- 列表项
我正在尝试通过带有 base64 编码的 HTTP POST 将 JPG 图像(由模拟器中的 ImagePicker 捕获)发送到 AWS REST API。但是 readAsBytesSync() 操作只读取图像的(头部)部分(我已经测试过它以字节的形式打印到字符串中),因此 base64 只能编码那一小部分。可能是什么原因,非常感谢您提前提供的帮助。
Future<void> captureImage(ImageSource imageSource) async {
try {
ImagePicker picker = ImagePicker();
final pickedFile = await picker.getImage(
source: ImageSource.camera,
preferredCameraDevice: CameraDevice.front);
String theimagepath = pickedFile.path.toString();
//_imageFile = imageFile;
print('theimagepath just below');
print(theimagepath);
String img64 = base64Encode(Io.File(theimagepath).readAsBytesSync());
//print('bytes'+bytes.toString());
print('img64: '+img64);
_imageFile = Io.File(pickedFile.path);
setState(() {
print('State here is ');
------------- DEBUG OUTPUT BELOW (base64 encoded string is incomplete) -------------
I/flutter (13629): theimagepath just below
I/flutter (13629): /storage/emulated/0/Android/data/com.example.blabla/files/Pictures/f8a0295e-9ce5-446c-91d2-41c938e49b7f5430316734413263510.jpg
I/flutter (13629): img64: /9j/4QGqRXhpZgAATU0AKgAAAAgABwEQAAIAAAAPAAAAYgEAAAQAAAABAAAFoAEBAAQAAAABAAAHgAEyAAIAAAAUAAAAcQESAAMAAAABAAEAAIdpAAQAAAABAAAAjAEPAAIAAAAHAAAAhQAAAABzZGtfZ3Bob25lX3g4NgAyMDIwOjA2OjI1IDExOjUzOjU0AEdvb2dsZQAAEIKdAAUAAAABAAABUoKaAAUAAAABAAABWpKSAAIAAAAENDE2AJKRAAIAAAAENDE2AJKQAAIAAAAENDE2AJIKAAUAAAABAAABYpIJAAMAAAABAAAAAIgnAAMAAAABAGQAAJAEAAIAAAAUAAABapADAAIAAAAUAAABfqADAAQAAAABAAAHgKQDAAMAAAABAAAAAKACAAQAAAABAAAFoJICAAUAAAABAAABkpIBAAoAAAABAAABmpAAAAcAAAAEMDIyMAAAAAAAAACtAAAAZAAgCBc7msoAAAARHAAAA+gyMDIwOjA2OjI1IDExOjUzOjU0ADIwMjA6MDY6MjUgMTE6NTM6NTQAAAAAngAAAGQAACK/AAAD6P/gABBKRklGAAEBAAABAAEAAP/bAEMAAgEBAQEBAgEBAQICAgICBAMCAgICBQQEAwQGBQYGBgUGBgYHCQgGBwkHBgYICwgJCgoKCgoGCAsMCwoMCQoKCv/bAEMBAgICAgICBQMDBQoHBgcKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCv/AABEIB4AFoAMBIgACEQEDEQH/xAAfAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgv/xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZ
I/flutter (13629): State here is
【问题讨论】:
-
您是否证明
readAsBytesSync()没有读取整个文件?您是否将File(theimagepath).readAsBytesSync().length与在文件系统上观察到的实际文件大小(File(theimagepath).lengthSync())进行了比较?文件有多大? -
两者都是 87590。文件是 JPG。通过Android Studio设备管理器导出到linux文件系统,也显示87590,但输出还是不完整。
-
如果
readAsBytesSync()返回了一个长度正确的Uint8List,它看起来肯定是读取了整个文件。你如何确定它是不完整的?您是否检查了文件本身以确保它包含您期望的所有数据? -
我将它发送到 AWS API,它说:“TypeError:不正确的填充”。正如您在上面的输出窗口屏幕中看到的,编码的字符串不完整(很短)。我手动生成了一个 base64 并与之进行了比较(它们的头部似乎相同),但这不完整。将字节打印到屏幕上也不完整。这真的很奇怪,到目前为止我尝试了几十种不同的方法,但没有结果。
-
很长的字符串在打印时可能会被截断,以避免向控制台发送垃圾邮件。再说一遍:您检查过您要读取的实际文件吗?您如何比较手动生成的 base64 输出?从根本上说,有什么证据支持您的结论,即
readAsBytesSync是问题所在,而不是其他问题?您确定文件本身是完整的吗?在不进行 base64 编码的情况下,您是否观察到readAsBytesSync返回的字节与文件中的不同?
标签: flutter asynchronous dart base64 imagepicker