Swoole接收二进制数据并保存文件后文件会变大?

场景:使用websocket上传和保存文件。
业务描述:客户端使用H5 websocket上传二进制文件,服务端使用Swoole WS服务接收文件并保存。
问题:服务端保存后的文件size为何变大了?

客户端代码:

ws.onmessage = function(e) {
        console.log(e.data);
        log("收到服务器消息:" + e.data + "'\n");
        if (e.data == 'connect ok') {
            //开始上传文件
            log('开始上传文件');
        } 


            var file = document.getElementById("myFile").files[0];
            var obj = {
                "name": file.name,
                "size": file.size,
                "type": file.type
            }

            var reader = new FileReader(); 

           //将文件读取为二进制字符串
            reader.readAsBinaryString(file);

            reader.onload = function(e) {
                obj.data = e.target.result;
                var data = JSON.stringify(obj);
                ws.send(data);
                log('正在上传数据...');
            }
    }

服务端:

public function onMessage(swoole_websocket_server $ws, $frame)
    {
        $data = json_decode($frame->data, true);

        $ext = pathinfo($data['name'], PATHINFO_EXTENSION);

        $filename = './files/'.time().'.'. $ext;

        $tmp = $data['data'];

        file_put_contents($filename, $tmp); //保存文件
        echo "file path : {$filename}\n";
        //$ws->push($frame->fd, 'upload success');
    }

启动服务端,然后在客户端选择图片文件后,websocket连接正常,发送文件,服务端接收数据,但是保存数据的时候,我将接收到的数据保存为图片文件,发现图片size变大了,源图片5.4KB,上传到服务器上保存的图片有8KB了,就是size变了,保存的图片就不正常打不开了。

我尝试上传了一个文本文件,发现大小正常,保存的文件也正常。不知何故。。。

阅读 2.3k
1 个回答
 var data = JSON.stringify(obj);

你把二进制数据有转化成字符串了..., 你客户端还是把使用 base64 编码吧传输二进制吧. 服务器端收到后 base64 解码在存储

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进