#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.