Flutter: Как получить прогресс загрузки / выгрузки для http-запросов - PullRequest
0 голосов
/ 21 мая 2018

Я пишу приложение, которое загружает изображение на сервер, и вместо того, чтобы просто показывать счетчик, я хотел бы получить возможность отслеживать состояние этой загрузки.

Кроме того, я хочу сделать это без использования данных формы Multipart.Это код, который я сейчас использую - но, похоже, он зависает из-за разорванного канала, и у меня нет нулевой обратной связи относительно того, отправляются ли данные на сервер:

Future<String> _uploadFile(File assetFile) async {
  final url = <removed>;

  final stream = await assetFile.openRead();
  int length = assetFile.lengthSync();

  final client = new HttpClient();

  final request = await client.postUrl(Uri.parse(url));
request.headers.add(HttpHeaders.CONTENT_TYPE,  "application/octet-stream");
  request.contentLength = length;

  await request.addStream(stream);
  final response = await request.close();
  // response prociessing.
}

Возможно ли этоотправлять большие данные в виде потока, не считывая их в память, и могу ли я получить прогресс в этой загрузке с текущими API дротика / флаттера?

1 Ответ

0 голосов
/ 21 мая 2018

То, как вы уже используете Stream, означает, что вы не читаете весь файл в память.Он читается как, вероятно, куски 64 тыс.

Вы можете перехватить поток между производителем (Файл) и потребителем (HttpClient) с помощью StreamTransformer, например:

  int byteCount = 0;
  Stream<List<int>> stream2 = stream.transform(
    new StreamTransformer.fromHandlers(
      handleData: (data, sink) {
        byteCount += data.length;
        print(byteCount);
        sink.add(data);
      },
      handleError: (error, stack, sink) {},
      handleDone: (sink) {
        sink.close();
      },
    ),
  );
....
  await request.addStream(stream2);

Выдолжно видеть byteCount увеличение в кусках 64 КБ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...