场景:使用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变了,保存的图片就不正常打不开了。
我尝试上传了一个文本文件,发现大小正常,保存的文件也正常。不知何故。。。
你把二进制数据有转化成字符串了..., 你客户端还是把使用 base64 编码吧传输二进制吧. 服务器端收到后 base64 解码在存储