AES*_*ICS 14 javascript image stream node.js express
我有从目录中读取图像并将其发送到index.html的代码.
我试图用fs.createReadStream替换fs.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') });
});
});
Run Code Online (Sandbox Code Playgroud)
的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 >
Run Code Online (Sandbox Code Playgroud)
pet*_*teb 23
以下方法仅使用核心模块并从stream.Readable返回的实例中读取块fs.createReadStream(),并将这些块作为a返回Buffer.如果你不打算回流块,这不是一个很好的方法.您将把文件保存Buffer在内存中的文件中,因此它对于合理大小的文件来说只是一个很好的解决方案.
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));
});
}
Run Code Online (Sandbox Code Playgroud)
HTTP因为它内置到协议中,所以几乎总是更好地使用流数据,因为您可以pipe()将文件直接加载到响应中,所以您永远不需要一次将数据加载到内存中.
这是一个没有花俏一个非常简单的例子,只是是如何展示给pipe()一个stream.Readable到http.ServerResponse.该示例使用快递,但它的工作原理采用完全相同的方式http或https从Node.js的核心API.
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}`);
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
34383 次 |
| 最近记录: |