【问题标题】:Flutter/Dart SocketException Uploading Video File to URLFlutter/Dart SocketException 将视频文件上传到 URL
【发布时间】:2021-03-03 19:34:09
【问题描述】:

我在尝试将视频文件上传到指定的 URL 时收到此错误消息:

DioError (DioError [DioErrorType.DEFAULT]: SocketException: OS Error: Connection reset by peer, errno = 54, address = storage.googleapis.com, port = 64995)

注意:这是一个 DioError,因为我正在使用 dio Dart/Flutter 包:https://pub.dev/packages/dio 我使用等效 API(例如 http 库)收到错误。

上传从存储中选择的视频文件的代码:

        //File videoFile...

        FormData data = FormData.fromMap({
          "videoFile": await MultipartFile.fromFile(videoFile.path),
        });
    
        Response response = await Dio().post(
          directUpload.url,
          data: data,
          onSendProgress: (int sent, int total) {
            print("$sent $total");
          },
        );

网址 (directUpload.url) 是由 Mux API 生成并提供给他们的 Google Cloud Storage 的。

https://storage.googleapis.com/video-storage-us-east1-uploads/...

调用post时,上传少量(如655524 / 17840042),然后报错。测试视频大小为 17.8 Mb。

在 iOS 设备或 iOS 模拟器上运行它会产生相同的结果/错误。


我试过:flutter cleanflutter upgrade、删除Podfilepod repo update,从设备中删除应用程序。一切都无济于事。

【问题讨论】:

  • 查看 URL 所需的标头,您提供的标头可能缺少 keep-alive 标头!
  • @Yadu 添加connection: keep-alive 标头没有变化。
  • Keep-Alive,看看帽子!
  • 仍然得到错误。我的理解是标题无论如何都不区分大小写。
  • 今天是我了解到:),我宁愿使用默认流和 HttpClient 而不是 http 和 dio,因为错误表明它可能是服务器内部错误,操作系统错误!

标签: ios flutter dart upload mux


【解决方案1】:

从 POST 更改为 PUT 请求可以解决问题。

【讨论】:

    【解决方案2】:

    是的,我对 Dio 也有同样的问题。

    当前无法上传数据类型Uint8List

    我的临时解决方案: 使用http lib http: ^0.12.1

    import 'package:http/http.dart' as http;
    
    Future uploadData(Uint8List imageData) async {
        await http.put(preData.url, headers: getHeader(), body: imageData);
    }
    
    use:
    List<int> imageData = File(filePath).readAsBytesSync();
    await uploadData(imageData);
    

    希望能帮到你

    【讨论】:

    • 更改为 http 库不是解决方案。但是,使用任一库从 POST 更改为 PUT 请求。
    【解决方案3】:

    如果 Web 服务客户端正在等待来自远程 Web 服务提供者的 SOAP 响应并且连接过早关闭,则会出现错误消息“对等方重置连接”。

    导致此错误的最常见原因之一是中间的防火墙关闭了连接。在这种情况下,您可以增加防火墙中的连接超时时间。您可以通过捕获和分析 IP 跟踪找到关闭连接的组件。

    其他可能的原因例如:

    • 服务器端的资源限制,例如内存不足的服务器

    • 进程被杀死

    • 由于大量流量导致服务器超载

    也试试这个..

    cd ~/flutter
    git checkout -b max-in-flight
    code packages/flutter_tools/lib/src/devfs.dart # edit kMaxInFlight from 6 to 1
    rm bin/cache/flutter_tools*
    

    还有这个

    flutter clean
    flutter channel stable
    

    【讨论】:

      【解决方案4】:

      您是否尝试过使用http.MultipartRequest 方法? 由于它可用于传输大文件,您也可以尝试使用 DIO 替代方案(如果存在于 dio 中) 以及如何使用http.MultipartRequest这里是一篇文章https://dev.to/carminezacc/advanced-flutter-networking-part-1-uploading-a-file-to-a-rest-api-from-flutter-using-a-multi-part-form-data-post-request-2ekm

      让我知道它是否有效。

      【讨论】:

      • http.MultipartRequest 产生相同的结果。
      【解决方案5】:

      调用post时,上传少量(例如655524 / 17840042)然后出现错误。测试视频大小为 17.8 Mb。

      回答-

      转到您的 cpanel MultiPHP INI 编辑器文件并增加 post_max_size

      你的flutter代码不用改,就对了

      【讨论】:

        猜你喜欢
        • 2011-05-12
        • 2020-08-26
        • 2023-03-31
        • 2019-10-24
        • 2019-02-03
        • 1970-01-01
        • 2022-01-12
        • 2016-10-30
        • 1970-01-01
        相关资源
        最近更新 更多