http - 如何取消在 Flutter 中使用 http.MultipartRequest() 发送的正在进行的文件上传?

标签 http file-upload dart flutter

我正在尝试在我的 Flutter 应用中添加取消文件上传功能。我目前正在使用 http package 中的 http.MultipartRequest() 来上传文件。我已尝试使用 CancelableOperation 包装上传,但它只会取消我的 Flutter 应用程序中的内部进程,文件仍会成功上传到我的 Firebase 存储服务器。

我阅读了关于使用 http.Client() 并在 http 请求完成后关闭它的 http 包上的 README.md。我正在考虑使用 http.Client() 上传文件,然后使用 http.Client().close() 关闭它以取消 http 请求。

但是,我还没有找到使用 http.Client 上传文件的正确方法。我在 Google 和 stackoverflow 上浏览了它,但所有帖子都推荐使用 http.MultipartRequest()One of the posts

所以,我的问题是: 1. Flutter中的http包是否可以取消使用http.MultipartRequest()发送的上传文件? 2. 我尝试使用 http.Client() 是否正确?还是有更好的方法来做到这一点? 3. 如果使用http.Client() 是唯一的方法,那么你能告诉我如何使用http.Client() 上传文件吗?因为它只有 post() 而没有 multipartrequest()

抱歉,文字太长了。请帮忙。谢谢!

最佳答案

Package http 在底层使用了 HTTPClient。它将底层客户端包装在 IOClient 中。 http 的大多数方法(如 getpost)都允许您传入自己的客户端,但是 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();
      }));
}

关于http - 如何取消在 Flutter 中使用 http.MultipartRequest() 发送的正在进行的文件上传?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54018383/

相关文章:

firebase - FLUTTER:如何使用云 Firestore 中的 where 子句删除多个文档?

python-3.x - 使用 Robobrowser 登录亚马逊音乐

c++ - 获取 FastCGI 中的所有客户端 header (C/C++)

flutter - Riverpod:有没有正确的方法来读取另一个StreamProvider中的StreamProvider?

java - 通过多线程同时上传多个文件到 S3 抛出 java.nio.channels.ClosedChannelException : null

wcf - 是否有用于非双工 WCF 分块的库或示例?

dart - dart- “There is no such getter '函数中的“问题”

node.js - 从 0.10.40 升级后 Node HTTP 删除请求不再有效

http - Golang http 服务器实现

java - Android 中的可恢复文件下载/上传