You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Socket.io客户端传文件服务端接收空对象问题求助

问题原因

浏览器中的File对象是特殊的Blob子类,其大部分属性无法被JSON序列化(Socket.io默认采用JSON序列化传输数据),直接通过socket.emit发送会导致服务端收到空对象。

解决方案

需要先将File对象转换为可序列化的数据格式(如ArrayBuffer或Base64字符串),同时携带文件元信息,再进行传输:

客户端修改代码

function uploadFileRequest(){
    const file = arguments[0].files[0];
    console.log(file);
    const reader = new FileReader();
    reader.onload = function(e) {
        // 封装文件元信息和二进制数据
        socket.emit('uploadFile', {
            name: file.name,
            type: file.type,
            size: file.size,
            data: e.target.result
        });
    };
    // 读取为ArrayBuffer(适合大文件,传输体积更小)
    reader.readAsArrayBuffer(file);
    // 若需要Base64格式,替换为下面的代码
    // reader.readAsDataURL(file);
}

服务端接收处理

根据客户端发送的数据格式,将数据还原为文件:

const fs = require('fs');
socket.on('uploadFile', (filePayload) => {
    console.log(filePayload); // 现在能获取完整的文件信息和数据
    let buffer;
    if (filePayload.data instanceof ArrayBuffer) {
        // 处理ArrayBuffer格式
        buffer = Buffer.from(filePayload.data);
    } else if (typeof filePayload.data === 'string' && filePayload.data.startsWith('data:')) {
        // 处理Base64格式
        const base64Str = filePayload.data.split(',')[1];
        buffer = Buffer.from(base64Str, 'base64');
    }
    // 保存文件到本地
    if (buffer) {
        fs.writeFileSync(filePayload.name, buffer);
    }
});

如果是大文件,建议采用分块传输的方式,避免单次传输过大数据导致性能问题。

内容的提问来源于stack exchange,提问作者Genkora

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 20:32:37