Quelle est la sortie d’un stream de fichiers piped?

Peut-être que la question n’est pas formulée de la meilleure façon mais voici un peu plus de contexte. En utilisant GridFSBucket, je peux stocker un fichier dans Mongo et obtenir un stream de téléchargement pour ce fichier. Voici ma question. Disons que je voulais renvoyer ce fichier en réponse à ma requête http.

Je fais:

downloadStream.pipe(res); 

Du côté client maintenant, lorsque j’imprime le responseText, je reçois une longue chaîne de caractères géniaux qui semblent cryptés. Quel est le format / type de cette chaîne / stream? Comment configurer ma réponse de manière à pouvoir obtenir les données diffusées en tant que ArrayBuffer côté client?

Merci

METTRE À JOUR:

Je n’ai pas encore résolu le problème, mais la suggestion de @Jekrb donne exactement le même résultat que de faire console.log(this.responseText) . Il semble que la chaîne ne soit pas un tampon. Voici le résultat de ces 2 lignes:

console.log(this.responseText.toSsortingng('utf8'))

var byteArray = new Uint8Array(arrayBuffer);

entrez la description de l'image ici

MISE À JOUR 2 – LES SNIPPETS DE CODE

L’extrémité avant:

  var savePDF = function(blob){ //fs.writeFile("test.pdf",blob); var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function() { if (this.readyState === XMLHttpRequest.DONE && this.status === 200){ //TO DO: Handle the file in the response which we will be displayed. console.log(this.responseText.toSsortingng('utf8')); var arrayBuffer = this.responseText; if (arrayBuffer) { var byteArray = new Uint8Array(arrayBuffer); } console.log(arrayBuffer); } }; xhr.open("POST","/pdf",true); xhr.responseType = 'arrayBuffer'; xhr.send(blob); }; 

BACKEND:

 app.post('/pdf',function(req,res){ MongoClient.connect("mongodb://localhost:27017/test", function(err, db) { if(err) return console.dir(err); console.log("Connected to Database"); var bucket = new GridFSBucket(db, { bucketName: 'pdfs' }); var CHUNKS_COLL = 'pdfs.chunks'; var FILES_COLL = 'pdfs.files'; // insert file var uploadStream = bucket.openUploadStream('test.pdf'); var id = uploadStream.id; uploadStream.once('finish', function() { console.log("upload finished!") var downloadStream = bucket.openDownloadStream(id); downloadStream.pipe(res); }); // This pipes the POST data to the file req.pipe(uploadStream); }); }); 

Mon hypothèse est que la réponse est générée sous forme de fichier binary simple qui n’est pas codé en base64 (il s’agit toujours d’un tampon) ou qu’il s’agit d’une réponse compressée (gzip) qui doit d’abord être décompressée.

Difficile de cerner le problème sans voir le code.

METTRE À JOUR:

On dirait que vous manquez les en-têtes de réponse appropriés.

Essayez de définir ces en-têtes avant downloadStream.pipe(res) :

 res.setHeader('Content-disposition', 'attachment; filename=test.pdf'); res.set('Content-Type', 'application/pdf'); 

Votre stream est probablement déjà un tampon. Vous pourrez peut-être appeler responseText.toSsortingng('utf8') pour convertir les données diffusées en stream en chaîne lisible.

Je l’ai résolu !!!

En gros, prédéfinissez le type de réponse sur “arraybuffer” avant de faire la demande à l’aide de req.responseType = "arraybuffer"

Maintenant, une fois que vous recevez la réponse, n’utilisez pas responseText , utilisez plutôt la response . response contient le tableau contenant les données du fichier.