最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

nodejs从数据库到浏览器的最佳图像处理方法

运维笔记admin11浏览0评论

nodejs从数据库到浏览器的最佳图像处理方法

nodejs从数据库到浏览器的最佳图像处理方法

我需要的最终结果是从数据库向Web浏览器发送多个图像。

图像存储为blob。

我知道我可以将它们从数据库中流出并传输到文件中,然后我可以将URL提供给文件。

我也知道我可以将base64字符串移交给浏览器,以便它可以渲染图像。

我的问题是哪个选项是最优的?还是最佳实践?请记住,如果我使用流方法,我将不得不检查自上次显示以来图像是否已更改...如果它已更改,那么我必须将其重新引出数据库。

我一直在使用节点js的oracldb,并且能够成功地将一个blob提取到一个文件中,但我也无法流式传输多个文件。

这是一个两个问题的帖子:

哪个是最优的:1。发送Base64字符串 - 我有点像这种方法,因为我不必担心流出文件并检查它是否已经改变,因为它直接来自数据库。我担心的是浏览器/ nodejs可以处理吗?我知道那些字符串可能非常大。我也可以一次发送多个图像。

  1. 将blob流式传输到文件中。

第二部分问题是如何在下面获取多个blob是我的代码只传输一个文件,我从github lobstream1.js找到了这个例子

.js

专注于代码:

// Stream a LOB to a file
var  dostream = function(lob, cb) {
  if (lob.type === oracledb.CLOB) {
    console.log('Writing a CLOB to ' + outFileName);
    lob.setEncoding('utf8');  // set the encoding so we get a 'string' not a 'buffer'
  } else {
    console.log('Writing a BLOB to ' + outFileName);
  }

  var errorHandled = false;

  lob.on(
    'error',
    function(err) {
      console.log("lob.on 'error' event");
      if (!errorHandled) {
        errorHandled = true;
        lob.close(function() {
          return cb(err);
        });
      }
    });
  lob.on(
    'end',
    function() {
      console.log("lob.on 'end' event");
    });
  lob.on(
    'close',
    function() {
      // console.log("lob.on 'close' event");
      if (!errorHandled) {
        return cb(null);
      }
    });

  var outStream = fs.createWriteStream(outFileName);
  outStream.on(
    'error',
    function(err) {
      console.log("outStream.on 'error' event");
      if (!errorHandled) {
        errorHandled = true;
        lob.close(function() {
          return cb(err);
        });
      }
    });

  // Switch into flowing mode and push the LOB to the file
  lob.pipe(outStream);
};

用这种方法修复了假脱机图像,我确实稍微改变了dostream。

for(var x = 0; x<result.rows.length;x++)
        {
          outputFileName = x + '.jpg';
          console.log(outputFileName);
          console.log(x);

          var lob = result.rows[x][0];
          dostream(lob,outputFileName);
//        cb(null,lob);
        }

感谢您的任何帮助。

回答如下:

鉴于您在后续评论中提供的所有细节,包括平均图像大小,不同图像的数量,Node.js可用的内存,并发用户的数量,以及“使图像保持最新非常关键”的事实,这里是我最初的看法......

对于第一个实施,坚持KISS原则,避免过度工程。禁用browser caching并且不在Node.js中缓存图像。相反,依靠驱动程序和Oracle数据库为您做繁重的工作。

对于存储图像的表,如果可能的话,尝试在BasicFile LOB上使用SecureFile LOB(已知它们表现更好)。另外,查看两者可用的缓存选项(CACHE,CACHE READS和NOCACHE)。考虑根据您指定的工作负载启用CACHE READS选项,但与DBA一起使用以确保缓冲区缓存的大小适当,这样您就不会影响其他人。

您可以依赖连接池的连接请求队列来帮助控制有多少人同时获取文件。实际上,您可能希望仅为此目的创建一个单独的池,以便获取LOB的人不会阻止人们在应用程序中执行其他操作。例如,假设您通常有一个具有10个连接的连接池。您可以创建两个连接池,每个连接池有5个连接(使用connection pool cache可以轻松实现)。然后,在获取lobs的代码路径中,使用lob池并将其他池用于其他所有内容。

鉴于此设置,我还建议不要流式传输LOB。使用驱动程序缓冲Node.js中LOB的能力将大大简化代码,并且在给定如此少量并发用户/文件提取的情况下应该有足够的内存。

这种情况的最大问题是图像非常大,它们总是从数据库通过Node.js流向浏览器。但由于你将在一个内部网络上,这可能不是一个大问题。如果它确实是一个问题,您可以根据最有意义的内容开始在浏览器或Node.js中添加缓存。

发布评论

评论列表(0)

  1. 暂无评论