簡體   English   中英

socket.io-stream將文件寫入磁盤,然后在完成時發出文件路徑

[英]socket.io-stream write file to disc then when finished emit file path

將文件從客戶端發送到服務器時,使用socket.io-stream時出現問題。 我將文件路徑推送到mongodb,然后將文件保存到文件文件夾。 問題在於,當光盤正在寫入文件時,文件路徑會在寫入完成之前返回到客戶端,然后img元素paht是正確的,但是圖像不會在頁面上呈現。

下面的代碼按預期工作,但我手動等待100毫秒,然后將路徑返回給客戶端。 如果圖像太大,這100ms不會起作用。 還有其他解決方案嗎?

服務器端:

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

您可以在要寫入的流上檢查完成事件。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM