2017-09-10 1 views
0

Mon application recevant un flux via socket.io-stream et je veux l'utiliser comme un objet "fs.createReadStream" (qui renvoie un objet fs.ReadStream selon doc NODE). Je veux télécharger des fichiers sur box.com (évidemment avec le contenu du flux entrant) en utilisant "box-node-sdk" qui nécessite un objet "stream" et ne fonctionne qu'avec "fs.createReadStream". Je ne peux donc pas diriger directement le flux entrant et je dois plutôt le convertir en un objet "fs.createReadStream" afin de l'utiliser avec la boîte api. Par exemple: Au lieu de fs.createReadStream ('chemin/vers/fichier'); // renvoie l'objet ReadStreamNodeJS - Comment créer un objet fs.ReadStream manuellement au lieu de fs.createReadStream?

Comment créer? myReadStream (flux);

Ou comment créer? fs.createReadStream (flux);

Pourriez-vous s'il vous plaît aide-moi?

ss(socket).on('file', (stream, data) => { 
 
     
 

 
     var streamFileName = './uploads/'+data.originalName; 
 
\t \t var streamDataSize = data.size;  
 

 

 
\t \t //Method 1 - Using incoming stream directly: 
 
\t \t //Cannot use the stream directly. Not working. No error shown given by box sdk. 
 
\t \t client.files.uploadFile('36155801746', data.originalName, stream, (err) => { 
 

 
\t \t if (err) { 
 
\t \t \t //done(err); 
 
\t \t } else { 
 
\t \t \t //done(null, {message: 'Uploading finished'}); 
 
\t \t \t console.log('Upload to box finished'); 
 
\t \t } 
 

 
\t \t }); 
 
\t \t 
 
\t 
 
\t \t //Alternative Method 2 - Save the incoming stream into a file and again read that file. This doesn't work either. Fails for larger file size over 10 mb. setTimeout is for 3 seconds and the "boxStream" is produced with the data for 3 seconds of incoming stream. 
 
\t \t 
 
\t \t stream.pipe(fs.createWriteStream(streamFileName); 
 
\t \t 
 
\t \t //read the file again after few seconds because data is being written by the incoming steram 
 
\t \t setTimeout(() => { 
 
\t \t 
 
      var boxStream = fs.createReadStream(streamFileName); 
 
      client.files.uploadFile('36155801746', data.originalName, boxStream, (err) => { 
 

 
       if (err) { 
 
       //done(err); 
 
       } else { 
 
       //done(null, {message: 'Uploading finished'}); 
 
       console.log('Upload to box finished'); 
 
       } 
 

 
      }); 
 
     }, 3000); 
 
\t \t 
 

 

 

 
    
 
});

+1

Vous pouvez simplement utiliser le flux que vous avez déjà ou vous pouvez faire un nouveau flux sur le même fichier. Un flux est un flux, à moins que le flux que vous avez n'est pas un flux node.js réel (un autre type de flux incompatible), vous devriez pouvoir utiliser le flux que vous avez déjà. Pourquoi ne montrez-vous pas le code que vous essayez d'utiliser afin que les gens puissent voir plus précisément quel est votre problème? – jfriend00

+0

Je suis nouveau sur le noeud, donc peut-être tort, mais je ne pense pas que cette déclaration est correcte - "Vous pouvez utiliser le flux que vous avez déjà ou vous pouvez créer un nouveau flux sur le même fichier." Le flux provenant de la socket est une donnée pure avec des morceaux alors que fs.createReadStream retourne un objet "ReadStream" qui contient les données avec des morceaux plus quelques informations supplémentaires comme path, filename etc – Aaman

+0

J'ai ajouté le code que j'ai. Pourriez-vous s'il vous plaît regarder dedans? Merci beaucoup! – Aaman

Répondre

0

Streams sont courants; il n'y a rien de spécial sur le type retourné par fs.createReadStream, et box-node-sdk fonctionne avec n'importe quel type de flux.

Cela devrait fonctionner:

socketstream(socket).on('my-file', function (stream, data) { 
    boxclient.files.uploadFile(parentFolderId, data.name, stream, doneCallback); 
}) 
+0

Merci d'avoir répondu, mais l'utilisation directe du flux ne fonctionne pas. J'ai posté le code que j'ai. Box SDK nécessite un fs.createReadStream. – Aaman