2013-07-28 7 views
1

Je suis en train de lire un fichier en utilisant Node et en essayant de l'envoyer en tant que message MIME en plusieurs parties, mais j'ai des problèmes avec le fichier qui semble corrompu à la réception.Node.js Buffers et fichiers binaires

J'ai lu le fichier et de le préparer pour l'envoi comme ceci:

fs.readFile("before.png", function(err,data) { 
    // Snip 
    content += data.slice(0,data.length); 

Le problème est que quelque chose semble padding le flux. Voir les images ci-dessous comparant le fichier source before.png avec le fichier tel qu'il est reçu à la destination. Les séquences de EF BF BD indiquent que .slice() ne me donne pas les octets sous-jacents, probablement quelque chose de forcé à l'encodage UTF-8. J'ai aussi essayé

enter image description here

obtenir les octets via toString(), mais pas les haricots là-bas. Je vois toujours la corruption dans le fichier téléchargé.

// content += data.toString() // UTF-8 default 
content += data.toString('binary') 

Je soupçonne que toString() par défaut est également exerce des pressions sur le fichier binaire à l'UTF-8, mais aurait attendu « binaire » pour me donner le flux d'octets sous-jacent?


Editer en réponse à Brad. J'ai essayé de concaténer, mais j'ai encore besoin de traduire mon objet en une chaîne, à quel point les caractères UTF-8 semblent réapparaître dans le flux.

contentToSend = Buffer.concat([ header, data, footer ]); 
this.oauth.post(endpoint, accessToken, accessTokenSecret, contentToSend.toString(), contentType, function(x, y, z) { 

Répondre

3

Ce que je pense qui se passe est que vous utilisez en fait un opérateur de concaténation, forçant Node.js à traiter content et data comme des chaînes avec l'encodage par défaut UTF-8. Essayez ceci à la place:

content = Buffer.concat(content, data); 

De même, il n'y a aucune raison d'obtenir une tranche pour toute la longueur des données. Vous pouvez utiliser le tampon entrant entier tel quel.

+0

Merci beaucoup pour votre suggestion créative. À un moment donné, j'ai besoin de le convertir en chaîne pour envoyer mon message HTTP. Même après avoir concaténé et toString() tout ce que je vois la même corruption. Je vais attacher le code que j'utilise maintenant au message ci-dessus afin que je puisse le formater. –

+0

TBC - Je me demande si je souffre de la même chose que ce gars - http://stackoverflow.com/questions/14855015/getting-binary-content-in-node-js-using-request –

+0

@BenjaminWootton, Votre problème alors n'a rien à voir avec votre tampon, mais avec le codage des données source. Utilisez n'importe quel encodage dans lequel se trouve le fichier et votre problème devrait disparaître. Si vous voulez quelque chose où ce qui arrive est comme ce qui sort, alors vous devrez traiter le fichier comme binaire. Vous pouvez essayer le codage «none» de ce type en premier. – Brad