在Node.js中用fs.createReadStreamreplacefs.readFile

我有从目录中读取图像并将其发送到index.html的代码。

我想用fs.createReadStreamreplacefs.readFile,但我不知道如何实现这一点,因为我找不到一个很好的例子。

这是我得到(index.js)

var app = require('express')(); var http = require('http').Server(app); var io = require('socket.io')(http); var fs = require('fs'); http.listen(3000, function () { console.log('listening on *:3000'); }); app.get('/', function (req, res) { res.sendFile(__dirname + '/public/views/index.html'); }); io.on('connection', function (socket) { fs.readFile(__dirname + '/public/images/image.png', function (err, buf){ socket.emit('image', { image: true, buffer: buf.toString('base64') }); }); }); 

的index.html

 <!DOCTYPE html> <html> <body> <canvas id="canvas" width="200" height="100"> Your browser does not support the HTML5 canvas tag. </canvas> <script src="https://cdn.socket.io/socket.io-1.2.0.js"></script> <script> var socket = io(); var ctx = document.getElementById('canvas').getContext('2d'); socket.on("image", function (info) { if (info.image) { var img = new Image(); img.src = 'data:image/jpeg;base64,' + info.buffer; ctx.drawImage(img, 0, 0); } }); </script> </body > </html > 

下面的方法只使用核心模块,并从stream中读取块。从fs.createReadStream()返回的fs.createReadStream()实例,并将这些块作为Buffer返回。 如果你不打算把数据块传回去,这种方法并不是那么好。 你将把文件保存在驻留在内存中的Buffer中,所以它只是适当大小的文件的一个很好的解决scheme。

 io.on('connection', function (socket) { fileToBuffer(__dirname + '/public/images/image.png', (err, imageBuffer) => { if (err) { socket.emit('error', err) } else { socket.emit('image', { image: true, buffer: imageBuffer.toString('base64') }); } }); }); const fileToBuffer = (filename, cb) => { let readStream = fs.createReadStream(filename); let chunks = []; // Handle any errors while reading readStream.on('error', err => { // handle error // File could not be read return cb(err); }); // Listen for data readStream.on('data', chunk => { chunks.push(chunk); }); // File is done being read readStream.on('close', () => { // Create a buffer of the image from the stream return cb(null, Buffer.concat(chunks)); }); } 

HTTP响应stream示例

自从构build到协议中之后,使用HTTP传输数据几乎总是一个更好的主意,您不需要一次将数据加载到内存中,因为您可以将文件stream直接传送到响应。

这是一个非常基本的例子,没有花里胡哨的东西,只是演示如何pipe() http.ServerResponse 。可以http.ServerResponse 。 该示例使用Express,但是使用来自Node.js Core API的httphttps完全相同的方式。

 const express = require('express'); const fs = require('fs'); const server = express(); const port = process.env.PORT || 1337; server.get ('/image', (req, res) => { let readStream = fs.createReadStream(__dirname + '/public/images/image.png') // When the stream is done being read, end the response readStream.on('close', () => { res.end() }) // Stream chunks to response readStream.pipe(res) }); server.listen(port, () => { console.log(`Listening on ${port}`); });