1

クライアントからサーバーにファイルを送信するときに、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);
    }
4

1 に答える 1