Как отменить текущую загрузку файлов, отправленных с помощью http.MultipartRequest () во Flutter? - PullRequest
0 голосов
/ 03 января 2019

Я пытаюсь добавить функцию отмены загрузки файлов в моем приложении Flutter. Я сейчас использую http.MultipartRequest() из http package для загрузки файла. Я попытался обернуть загрузку с помощью CancelableOperation, но это только отменяет внутренний процесс в моем приложении Flutter, и файл все еще успешно загружается на мой сервер хранения Firebase.

Я прочитал README.md в пакете http об использовании http.Client() и закрыл его после завершения http-запроса. Я подумываю об использовании http.Client() для загрузки файла, а затем закрываю его с помощью http.Client().close(), чтобы отменить запрос http.

Но я еще не нашел правильный способ загрузки файла с помощью http.Client. Я просмотрел об этом в Google и stackoverflow, но все сообщения рекомендуют использовать http.MultipartRequest(). Один из постов

Итак, мои вопросы: 1. Можно ли отменить загрузку файла, отправленного с http.MultipartRequest() из пакета http во Flutter? 2. Я на правильном пути, пытаясь использовать http.Client()? Или есть ли лучший способ сделать это? 3. Если использование http.Client() является единственным способом, то не могли бы вы показать мне, как загрузить файл с http.Client()? поскольку он имеет только post() и multipartrequest().

Извините за длинный текст. Пожалуйста помоги. Спасибо!

1 Ответ

0 голосов
/ 03 января 2019

Пакет http использует HTTPClient под капотом. Это оборачивает этот основной клиент в IOClient. Большинство методов http (например, get и post) позволяют передавать свой собственный клиент, а MultipartRequest - нет (он создает один для каждого запроса).

Кажется, самое простое решение - создать подкласс.

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

import 'package:http/http.dart' as http;

class CloseableMultipartRequest extends http.MultipartRequest {
  http.IOClient client = http.IOClient(HttpClient());

  CloseableMultipartRequest(String method, Uri uri) : super(method, uri);

  void close() => client.close();

  @override
  Future<http.StreamedResponse> send() async {
    try {
      var response = await client.send(this);
      var stream = onDone(response.stream, client.close);
      return new http.StreamedResponse(
        new http.ByteStream(stream),
        response.statusCode,
        contentLength: response.contentLength,
        request: response.request,
        headers: response.headers,
        isRedirect: response.isRedirect,
        persistentConnection: response.persistentConnection,
        reasonPhrase: response.reasonPhrase,
      );
    } catch (_) {
      client.close();
      rethrow;
    }
  }

  Stream<T> onDone<T>(Stream<T> stream, void onDone()) =>
      stream.transform(new StreamTransformer.fromHandlers(handleDone: (sink) {
        sink.close();
        onDone();
      }));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...