响应一个图像(通过pipe道和response.end())导致奇怪的行为
我使用这个代码来pipe道图像给我的客户:
req.pipe(fs.createReadStream(__dirname+'/imgen/cached_images/' + link).pipe(res))
它确实有效, 但有时图像不能完全传输。 但是在客户端(浏览器)和服务器端(node.js)都不会抛出任何错误。
我第二次尝试是
var img = fs.readFileSync(__dirname+'/imgen/cached_images/' + link); res.writeHead(200, { 'Content-Type' : 'image/png' }); res.end(img, 'binary');
但它导致了同样的奇怪的行为…
有人知道我的线索吗?
问候!
(抽象代码…)
var http = require('http'); http.createServer(function (req, res) { Imgen.generateNew( 'virtualtwins/www_leonardocampus_de/overview/28', 'www.leonardocampus.de', 'overview', '28', null, [], [], function (link) { fs.stat(__dirname+'/imgen/cached_images/' + link, function(err, file_info) { if (err) { console.log('err', err); } console.log('file info', file_info.size); res.writeHead(200, 'image/png'); fs.createReadStream(__dirname+'/imgen/cached_images/' + link).pipe(res); }); } ); }).listen(13337, '127.0.0.1');
Imgen.generateNew
只是创build一个新文件,将其保存到磁盘并返回path(链接)
我以前用过这个,所有需要的是在function (req, res) {
:
var path = ...; res.writeHead(200, { 'Content-Type' : 'image/png' }); fs.createReadStream(path).pipe(res);
其中path
是要发送的文件的计算path。 .pipe()
将读取stream中的数据传输到写入stream,并在读取stream结束时调用结束,因此不需要使用res.end()
。
问题是什么:
我有2个不同的writeStreams! 如果WriteStram#1closures,第二个也应该closures,然后它应该都是pipe道…
但节点是asynchronous的,所以当一个已经closures,另一个没有。 即使stream.end()被称为…以及你总是应该等待closures事件!
thx家伙的帮助!