简体   繁体   English

如何使用 WebSocket 从前端 Javascript 发送图像到后端 Flask?

[英]How to send and image from Javascript front-end to Flask back-end with WebSocket?

I'm trying to send an image with WebSocket but it won't work.我正在尝试发送带有 WebSocket 的图像,但它不起作用。

As I send plain text or json it works like a charm, but not with an image.当我发送纯文本或 json 时,它就像一个魅力,但不是图像。 It seems Flask can't map the request with files.似乎 Flask 不能 map 带文件的请求。

In addition, it works just fine in reverse.此外,它反向工作得很好。 The image from server, which encoded with cv2 was sent and received successfully.来自服务器的用 cv2 编码的图像已成功发送和接收。

Client (Sender)客户(发件人)

socket.on('socket_respond', (result) => {
    const blob = new Blob([result])
    const url = URL.createObjectURL(blob, 'image/png');
    const image = document.createElement('img');

    image.className = 'result';
    image.src = url;
    app.append(image);
});

async function handleSubmit (event) {
    event.preventDefault();

    if (!file.value.length)
        return;

    let reader = new FileReader();
    reader.onload = (event) => {
        # I have tried the method with reader.readAsDataURL and reader.readAsArrayBuffer as well.
    };
    reader.readAsDataURL(file.files[0]);

    # This does work. plain text (string)
    socket.emit('socket_request', 'test');

    # This does work. json
    socket.emit('socket_request', { test: 'test' });

    # This does not work.
    socket.emit('socket_request', files.files[0]);
}

Server (Receiver)服务器(接收方)

@socket_io.on('socket_request')
def foo(arg):
    print(arg)

    image = cv2.imencode('.png', cv2.imread(f'{INPUT_PATH}/images/pic.png'))[1].tobytes()

    emit('socket_respond', image, broadcast=False)

It was problem with server-side, notice that from flask to client was worked.这是服务器端的问题,注意从 flask 到客户端是有效的。 That's because the client-side has no size limit of socket request.那是因为客户端没有套接字请求的大小限制。 But server has size limit of 1 MB, so with large iamge file the request was ignored.但是服务器有 1 MB 的大小限制,所以对于大的 iamge 文件,请求被忽略了。

All I had to do was is follwing.我所要做的就是跟随。

socket_io = SocketIO(app, max_http_buffer_size=10000000)

Create socket.io with desired max_http_buffer_size argument.使用所需的 max_http_buffer_size 参数创建 socket.io。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM