Флаттер загружает видео с прогрессом, без многочастных запросов

#flutter #post #video #upload

Вопрос:

Я хочу публиковать необработанные байты видео без использования многочастотных запросов и без сохранения полных данных в оперативной памяти (только буфер). Я также хочу показать индикатор выполнения процесса.

То, что я уже пробовал до сих пор:

1.

   final client = HttpClient();
  final req = await client.post("10.0.2.2", 8080, url);
  req.contentLength = xfile.length();
  req.addStream(xfile.openRead());
 

Но:

  • Не работает для chrome: Ошибка: Неподдерживаемая операция: Платформа._version
  • Я не вижу способа, как следить за прогрессом
   var dio = Dio();
  var res = await dio.post(
    url,
    options: Options(
      headers: {
        Headers.contentLengthHeader: xfile.length();,
      },
    ),
    data: xfile.openRead(),
    onSendProgress: (int sent, int total) {
      print('Sent $sent $total');
    },
  );
 

Но когда я пытаюсь его использовать — появляется следующая ошибка:

Ошибка: Ошибка DioError [DioErrorType.other]: Ожидалось значение типа ‘StreamTransformer<Uint8List, Uint8List>’, но получено значение типа ‘_StreamHandlerTransformer<Uint8List, Uint8List><Список, Uint8List>’

Кроме того, я не уверен, как на самом деле работает этот файл.OpenRead (). Я пытаюсь предотвратить загрузку всех данных в память. Может кто — нибудь прояснить, как все делать правильно?

Заранее спасибо.

ОБНОВЛЕНИЕ 1: Я смог отправить данные в обоих случаях, но мне не повезло с отслеживанием прогресса:

1.

 Future<void> send(XFile file) async {
  var http = (Platform.isAndroid || Platform.isIOS) ? HttpClient() : BrowserHttpClient();
  final req = await http.post(host(), port(), path());
  await req.addStream(file.openRead());
  req.done.then((value) => print("done"));
}
 

Я попытался использовать широковещательный поток для открытия файла, а затем прослушать его следующим образом:

   var stream = await file.openRead();
  var broadcastStream = stream.asBroadcastStream();
  ...
  var total = await stream.length;
  broadcastStream.listen((event) { 
    print("${event.length} of $total");
  })
  await req.addStream(broadcastStream);
 

But receive the following error:
Error: Bad state: StreamSink is bound to a stream

2.

 Future<void> send(XFile file) async {
  final stream = http.ByteStream(file.openRead());
  var dio = Dio();
  var res = await dio.post(url, data: stream,
      onSendProgress:
          (int sent, int total) {
          print('$sent of $total');
        }
      );
}
 

But onSendProgress method is never called. So, I can’t monitor progress.