【问题标题】:socket.io-stream write file to disc then when finished emit file pathsocket.io-stream 将文件写入光盘,然后在完成后发出文件路径
【发布时间】:2017-02-02 15:08:15
【问题描述】:

当我将文件从客户端发送到服务器时,我在使用 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);
    }

【问题讨论】:

    标签: node.js sockets socketstream


    【解决方案1】:

    您可以在要写入的流上检查finish 事件。

    stream.on('finish', () => {
        io.sockets.to(data.roomId).emit('chat-connection', msg);
    });
    stream.pipe(fs.createWriteStream(filename));
    

    【讨论】:

    • 所以我猜“开始”和“结束”在 socketstream 中是被拒绝的?
    • 它们是Writable Stream API 的一部分。
    猜你喜欢
    • 1970-01-01
    • 2011-12-06
    • 1970-01-01
    • 2015-12-27
    • 2018-04-22
    • 2017-09-08
    • 2020-11-30
    • 1970-01-01
    • 2013-07-11
    相关资源
    最近更新 更多