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

业务场景:使用websocket上传和保存文件。

客户端使用H5的websocket方式提交上传文件,我

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('正在上传数据...');
            }
    }

服务端采用Swoole的websocket服务接收客户端上传的文件:

    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');
    }

启动服务端,然后在客户端选择图片文件后,客户端提示

已连接上! 收到服务器消息:connect ok' 开始上传文件 正在上传数据...

服务端成功接收数据并保存了图片。

但是问题来了:保存后的图片比原始上传的图片size要大,原始图片5.6KB,上传后保存成图片大小变成8K了,这样保存图片有问题,无法正常打开。问题可能出现在Swoole保存二进制处理上,我直接使用了file_put_contents()函数写入文件,不知社区大侠们有没有遇到这样的情况,忘指点迷津,多谢。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值