node.js在被覆盖时无法提供图像

时间:2013-12-16 09:22:47

标签: javascript image node.js

我有一个node.js应用程序,可定期轮询图像并将其存储到文件系统中。

问题是,当node.js覆盖图像时,那时访问网站的人将到处看到空白图像(因为此时图像被覆盖)。

只有在轮询图像时才会发生这几秒钟,但这很烦人。无论如何,在我们覆盖它的时候仍然可以提供图像吗?

保存/覆盖图片的代码:

// This method saves a remote path into a file name.
// It will first check if the path has something to download
function saveRemoteImage(path, fileName)
{
    isImagePathAvailable(path, function(isAvailable)
    {
        if(isAvailable)
        {
            console.log("image path %s is valid. download now...", path);   
            console.log("Downloading image file from %s -> %s", path, fileName);
            var ws = fs.createWriteStream(fileName);
            ws.on('error', function(err) { console.log("ERROR DOWNLOADIN IMAGE FILE: " + err); });
            request(path).pipe(ws);         
        }
        else
        {
            console.log("image path %s is invalid. do not download.");
        }
    });
}

提供图片的代码:

fs.exists(filePath, function(exists) 
    {
        if (exists) 
        {
            // serve file
            var stat = fs.statSync(filePath);
            res.writeHead(200, {
                'Content-Type': 'image/png',
                'Content-Length': stat.size
            });

            var readStream = fs.createReadStream(filePath);
            readStream.pipe(res);
            return;
        } 

2 个答案:

答案 0 :(得分:2)

我建议将新版本的图像写入临时文件:

var ws = fs.createWriteStream(fileName + '.tmp');
var temp = request(path).pipe(ws);         
完全下载文件时

renaming it

temp.on('finish', function() {
    fs.rename(fileName + '.tmp', fileName);
});

我们使用'finish' event,当所有数据都写入底层系统时被触发,即。文件系统。

答案 1 :(得分:1)

可能是

更好
  • 在下载时提供旧版本的文件;
  • 将新文件下载到临时文件(例如说_fileName);
  • 下载后重命名文件,从而重写原始文件;