当我将文件从客户端发送到服务器时,我在使用 socket.io-stream 时遇到问题。我将文件路径推送到 mongodb,然后将文件保存到文件夹中。问题是,当磁盘正在写入文件时,文件路径在写入完成之前返回给客户端,然后img
元素路径是正确的,但图像不会在页面上呈现。
下面的代码按预期工作,但我手动等待 100 毫秒,然后将路径返回给客户端。如果图像太大,这 100 毫秒不能保证可以解决问题。还有其他解决方案吗?
服务器端:
ss(socket).on('fileUpload', function(stream, data) {
Chat.findByIdAndUpdate(data.roomId, {
$push: {
"messages": {
author: data.author,
date: Date.now(),
isFile: true,
extension: data.extension
}
}
},{safe: true, new: true, upsert: true}, (err, message) => {
if(err){
console.log(err);
}
let msg = message.messages[message.messages.length - 1];
let filename = path.join(__dirname, 'public/files' , `${msg._id}.${msg.extension}`);
stream.pipe(fs.createWriteStream(filename));
setTimeout(() => {
io.sockets.to(data.roomId).emit('chat-connection', msg);
},100);
});
});
客户端:
function fileUpload(file) {
let fileExtension = file.name.split('.').pop();
let stream = ss.createStream();
// upload a file to the server.
ss(vm.socket).emit('fileUpload', stream,
{
size: file.size,
extension: fileExtension,
roomId:vm.chatInstance._id,
author:$scope.user.fullName,
});
ss.createBlobReadStream(file).pipe(stream);
}