2017-09-24 1 views
0

Lors de la lecture d'un fichier image, quel encodage dois-je utiliser? Je construis un serveur de base pour servir un fichier html avec une image et quand je lis le fichier image avec l'encodage de 'utf-8' et envoie les données au navigateur, le navigateur ne reçoit pas l'image. Cependant, si je mets l'encodage à une chaîne vide (c'est-à-dire {encoding: ''}), le navigateur reçoit l'image. Aussi, quand je regarde l'objet de flux de lecture, il dit que le codage par défaut est 'utf-8', ce qui me fait me demander pourquoi le réglage de l'encodage à 'utf-8' ne fonctionne pas?Comment savoir quel encodage utiliser lors de la lecture de fichiers?

Voici le morceau de code qui ne fonctionne pas:

let readStream = fs.createReadStream('./static/002.jpg', {flags: 'r', encoding: 'utf8'}) 
    console.log('ReadStream: ', readStream) 
    res.setHeader('Content-Type', 'image/jpeg') 
    readStream.on('data', (chunk) => { 
     res.write(chunk) 
    }) 

    readStream.on('error', (err) => { 
     console.log(err) 
    }) 

    readStream.on('end',() => { 
     console.log('Image stream ended') 
     res.end() 
    }) 

    readStream.on('close', function(){ 
     console.log("Image Stream closed") 
    }) 

Et voici le morceau de code qui fonctionne:

let readStream = fs.createReadStream('./static/002.jpg', {flags: 'r', encoding: ''}) 
     console.log('ReadStream: ', readStream) 
     res.setHeader('Content-Type', 'image/jpeg') 
     readStream.on('data', (chunk) => { 
      res.write(chunk) 
     }) 

    readStream.on('error', (err) => { 
     console.log(err) 
    }) 

    readStream.on('end',() => { 
     console.log('Image stream ended') 
     res.end() 
    }) 

    readStream.on('close', function(){ 
     console.log("Image Stream closed") 
    }) 

Répondre

2

La raison est que l'image JPEG est un binaire fichier, ce qui signifie qu'il s'agit d'une séquence d'octets simples. Le paramètre encoding est utilisé lors de la lecture de fichiers text. Si vous ne spécifiez pas encoding ou passez null, vous obtiendrez un flux d'octets brut, c'est exactement ce dont vous avez besoin pour transférer des données binaires.

Documentation for a Readable Stream indique que si aucun codage n'est fourni, l'objet Buffer est renvoyé à la place de la chaîne. C'est la raison pour laquelle le codage par défaut du tampon utf8 n'est pas appliqué.

Voir pour plus d'info:

  1. Node.js v8.5.0 Documentation: Buffers and Character Encodings