在 Flask 后端接收的 SocketIO 空 FormData

SocketIO empty FormData received at Flask backend

提问人:qwezxc789 提问时间:9/23/2023 最后编辑:qwezxc789 更新时间:9/24/2023 访问量:24

问:

我正在尝试通过 SocketIO 发送一些表单值,包括文件

    const handleSubmit = () => {
    const formData = new FormData();

    formData.append('num1', numbers.num1);
    formData.append('num2', numbers.num2);
    formData.append('file', file);

    socket.emit('submit', {payload: formData});
};

在我明白了console.log()

numbers.num1, numbers.num2, file: 1 1 File { name: "data.zip", lastModified: 1691230842633, webkitRelativePath: "", size: 1196056, type: "application/x-zip-compressed" }

后端接收事件

{'payload': {}}

app = Flask(__name__)
socketio = SocketIO(app)
CORS(app)

socketio.init_app(
app,
cors_allowed_origins="*",
logger=True,
engineio_logger=True)


@socketio.on('submit')
def handle_submit(data):
...


if __name__ == '__main__':
socketio.run(app, debug=True)

为什么事件处理程序中缺少有效负载?

更新:

在Chrome中,我只收到,在Firefox中{}{'payload': {}}

UPD2:数据为空的原因是 FE 上的 FormData,它是空的。是什么导致了这种行为?append()

reactjs flask 事件 socket.io form-data

评论

0赞 Detlef 9/23/2023
在这里使用 FormData 对象没有意义,因为您不想发送表单。要上传文件,请查看本教程。也可以使用包含有关文件的其他数据和信息的嵌套结构。
0赞 qwezxc789 9/24/2023
@Detlef如果我需要发送文件和几个数字值,我是否应该发出 2 个单独的事件来发送 json 中的值,并将文件作为 socket.emit(“upload”, files[0).我使用 FormData 将它们传递在一起

答:

0赞 Detlef 9/24/2023 #1

要通过套接字发送多个数据,包括文件,您可以使用嵌套结构。

以下示例显示了一个可能的变体,其中 ,如上面提到的教程所示,对应于从输入元素的 FileList 中获取的第一个元素的文件。file

socket.emit('submit', 
    { 
        num1: numbers.num1, 
        num2: numbers.num2, 
        file: { 
            name: file.name, 
            type: file.type, 
            size: file.size, 
            data: file 
        }
    }
);

在服务器端,您将获得一个字典,其中包含以字节形式包含文件的数据。