【问题标题】:How to send files to node.js server using flutter?如何使用颤振将文件发送到 node.js 服务器?
【发布时间】:2020-04-30 16:47:41
【问题描述】:

我正在使用socket_io_client 包与nodejs 套接字服务器进行通信。 这是我的颤振套接字配置:

socket = IO.io(SocketUrl.url, <String, dynamic>{
      'transports': ["websocket"],
      "autoConnect": false
    });
    socket.connect();
    socket.on('connect', (_) {
      print('socket connected to server');
    });
    socket.on('newMessage', (message) {
      print(message);
    });
    socket.on('event', (data) => print(data));
    socket.on('disconnect', (_) => print('disconnect'));
  }

这是文件发送的逻辑:

const data = {
            userId: currentUser.id,
            file: file.name
          };
          const stream = ss.createStream();
          ss(socket).emit("send-file", stream, data);
          ss.createBlobReadStream(file).pipe(stream);

这是从节点客户端完成的。我需要编写上述代码的飞镖版本。我看到 quiver 包具有创建流缓冲区的异步函数,但我不知道如何为这个特定的应用程序实现它。

已编辑:

 void onSendFile(file, data) async {
    final isFile = File(file);
    var buffer = isFile.openRead();
    //socket.emit("send-file",[buffer,data]);
    socket.emitWithBinary("send-file", [buffer, data]);
  }

【问题讨论】:

    标签: flutter dart socket.io


    【解决方案1】:

    阅读socket_io_client 的repo 上的API 参考和问题,您应该能够使用socket.emitWithBinary 发送二进制文件。

    假设您已经有办法获得File,您很可能能够做到这一点

    final myFile = File('file.txt');
    final bytes = await myFile.readAsBytes();
    
    socket.emitWithBinary('send-file', bytes);
    

    更新

    从 JS 版本的 socket-io 客户端,emit 函数可以接受多个参数,最终是converted to an array,所以我假设你可以通过将数组传递给emitWithBinaryemit

    注意

    看到您的 JS 版本不包含任何 binary 标志,您可能想尝试使用 emit

    socket.emit(
      'send-file',
      [
        123,
        {
          'userId': currentUser.id,
          'file': file.name,
        },
      ],
    );
    

    【讨论】:

    • 即使我这样做了,也要传递三个参数。我仍然需要发送数据。这样做,我也许可以发送文件,但它不需要第三个参数,即数据。并且 json Encoding 第三个参数尤其是字节不起作用。
    • 更新了答案。请注意,我实际上并没有对其进行测试,我只是在浏览 JS 和 Dart 版本的 socket-io 实现的源代码
    • 感谢您完成这一切。我尝试了上述解决方案,但对我没有用。我只是试图通过使用节点 js 在 web 上创建的聊天平台来完成文件共享。我被告知数据将是“缓冲区”类型,并且使用的流是双工流。
    • 只要确定你是否在 emitWithBinary 上测试过。如果它是您想要的流/缓冲区,请尝试使用 openRead 读取文件
    • 我已将我的代码添加到问题中。这就是我到目前为止所尝试的。
    【解决方案2】:

    你可以使用包https://pub.dev/packages/web_socket_channel
    查看官方示例https://flutter.dev/docs/cookbook/networking/web-sockets
    将文件转换为字节并接收到流中

    final bytes = await myFile.readAsBytes();
    
    main() async {
      var channel = IOWebSocketChannel.connect("ws://localhost:1234");
      channel.stream.listen((message) {
        channel.sink.add(bytes);
        channel.sink.close(status.goingAway);
      });
    }
    

    【讨论】:

    • 感谢您的建议,但我尝试了所有套接字库,只有 socket_io_client 为我工作。使用其他库,由于某种原因,我什至无法连接到套接字 url。
    猜你喜欢
    • 2020-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-18
    • 2019-11-04
    • 1970-01-01
    • 2022-10-20
    • 1970-01-01
    相关资源
    最近更新 更多