【问题标题】:Flutter readAsBytesSync file read incomplete to encode base64Flutter readAsBytesSync文件读取不完整以编码base64
【发布时间】:2020-10-15 18:02:13
【问题描述】:
  1. 列表项

我正在尝试通过带有 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


【解决方案1】:

这也发生在我身上here

起初我以为它是在前端(颤振),但经过数小时的检查和研究,后端(go lang)接收器的缓冲区读取器在通过 API 发送整个 base64 之前将其关闭打电话。

【讨论】:

    猜你喜欢
    • 2019-06-08
    • 2021-11-23
    • 1970-01-01
    • 2022-10-19
    • 1970-01-01
    • 2017-11-12
    • 2022-11-15
    • 2021-02-23
    • 1970-01-01
    相关资源
    最近更新 更多