【问题标题】:Dart/Flutter HTTP response is incomplete when downloading large files下载大文件时 Dart/Flutter HTTP 响应不完整
【发布时间】:2021-08-06 11:44:25
【问题描述】:

我有一个 Dart/Flutter 移动应用程序,它通过从服务器下载文件来进行自我配置。这些文件是 ZLib 压缩的,无头,并且这个过程一直运行良好 - 直到现在。这是相关代码

static Future<String> fileFetch(String url) async
{
 final HttpClientRequest request = await HttpClient().getUrl(Uri.parse(url));
 final HttpClientResponse response = await request.close();
 return await response.pipe(Accumulator());
}

Acccumulator 类处理实际文件下载 + ZLib 解码的位置

import 'dart:io';
import 'dart:async';


class Accumulator extends StreamConsumer<List<int>>
{
 List<int> accu = List.empty(growable:true);

 String originalText()
 {
  ZLibCodec zlc = ZLibCodec(raw:true);
  print('Accu ${accu.length}');
  List<int> uncompd = zlc.decode(accu);
  String text = String.fromCharCodes(uncompd); 
  return text;
 }

 void whenData(List<int> data){accu.addAll(data);}

 void whenErr(e){XLog.e('Accu',e.toString());}

 @override
 Future<void> addStream(Stream<List<int>> s) async
 {
  s.listen(whenData);
  return; 
 }

 @override 
 Future<dynamic> close() async
 {
  return Future.value(originalText());
 }
}

大多数情况下,返回的orignalText 是 JSON。现在开始导致文件下载不完整的违规文件长度为 132Kb,我发现仅下载了 42894 字节的原始(压缩)文件。

为什么会发生这种情况 - 累加器可以处理多少的内在限制?

【问题讨论】:

    标签: android flutter dart stream


    【解决方案1】:

    我想知道原因是因为http连接超时。
    你会尝试给一个长时间的超时吗?

    static Future<String> fileFetch(String url) async
    {
     try {
        final HttpClientRequest request = await 
        HttpClient().getUrl(Uri.parse(url));
        final HttpClientResponse response = await request.close().timeout(const 
          Duration(seconds: 100));;
        return await response.pipe(Accumulator());
      } on TimeoutException catch (e) {
        // handle timeout
      }
    }
    
    

    【讨论】:

    • 这很有效,所以我想这很可能是个问题。在任何情况下,谢谢你 - 在没有定义超时和超时处理程序的情况下启动 HTTP 请求是一种不好的做法。
    猜你喜欢
    • 2019-11-21
    • 2017-07-27
    • 1970-01-01
    • 2021-04-15
    • 2022-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多