业务场景:使用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()函数写入文件,不知社区大侠们有没有遇到这样的情况,忘指点迷津,多谢。