2017-02-02 17 views
1

クライアントからサーバにファイルを送信するときにsocket.io-streamを使用する際に問題があります。ファイルパスをmongodbにプッシュし、そのファイルをファイルフォルダに保存します。問題は、ディスクがファイルを書き込んでいる間に、書き込みが完了してからimg要素が正しくなるが、イメージがページ上にレンダリングされないうちに、ファイルパスがクライアントに返されることです。socket.io-stream終了時にディスクにファイルを書き出すファイルのパスを出力する

以下のコードは期待どおり動作しますが、手動で100ms待ってからクライアントにパスを返します。画像が大きすぎる場合は、この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); 
    } 

答えて

2

あなたはあなたが書いているストリーム上finishイベントを確認することができます。

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

私は "start"と "finish"はsocketstreamでdefiendなのでしょうか? –

+0

これらは[書き込み可能なストリーム](https://nodejs.org/api/stream.html#stream_writable_streams)APIの一部です。 –

関連する問題