NodeJ,从远程.jpeg块中获取b64

时间:2018-06-20 12:04:01

标签: node.js base64 fs

我正在使用一个API,该API在DMS中搜索图片并允许我们下载它。我看起来像这样:

var file = fs.createWriteStream(fileName);

var httpsRequest = https.request({
  method: 'GET',
  ...
  }, function (response) {

    response.on('data', function (chunk) {
      file.write(chunk);
    });

    response.on('end', function () {
      file.end();  
      res.download(...);
    });
});

我现在需要显示图像,而不仅仅是“下载”它。例如,对于jpeg图像,我尝试在b64中对缓冲区进行编码:

  

console.log(file._writableState.bufferedRequest.chunk.toString());

然后仅在网页中使用它。但是我得到这样的东西:

来自:

  

块:* <*缓冲区a0 02 8a 28 a0 02 8a 28 a0 02 8a 28 a0 02 8a 28 a0 02   8a 28 a0 02 8a 28 a0 02 8a 28 a0 02 8a 28 a0 02 8a 28 a0 02 8a 28 a0   04 a2 96 8a 00 6e 29 08 a7 ...>

  

8Vupis7dLZUHzyrhnH1qKMxsoMasjMPl3DJPqeelKRAhVlhVShysS5Jz / eI9aQxcMz7z5hbqpkbp7n0pzZk ... TA08GoRUgNS0BIDTxUYp4qWNDqWg ==

但是当我尝试通过一些在线b64解码取回图片时,它不起作用。

如果已经有人要解决这个问题并找到解决方案。

PS完整代码:

collection.findOne({}, function(document){

var fileUrl = url.parse(encodeURI(document.toObject().__metadata.media_src));
var fileName = fileUrl.pathname;

var mimetype = mime.lookup(fileName);
res.setHeader('Accept',mimetype);
res.setHeader('Content-type', mimetype);
res.setHeader('Content-disposition', 'attachment; filename=' + fileName);
var file = fs.createWriteStream(fileName);

var httpsRequest = https.request({
    method: 'GET',
    host: fileUrl.hostname,
    path: fileUrl.pathname,
    headers: sharepoint.headers(mimetype, fileName)
}, function (response) {

    response.on('data', function (chunk) {
        file.write(chunk);
    });

    response.on('end', function () {
        file.end();
     console.log(file._writableState.bufferedRequest.chunk.toString('base64'));
        setTimeout(function () {

            res.download(fileName, decodeURI(fileName), function (err) {
                if (err) {
                    res.status(err.status).end();
                }

                 fs.unlink(fileName);
             });
         }, 300);
     });
 });

 httpsRequest.end();
 });

1 个答案:

答案 0 :(得分:0)

尝试转换为base64时面临的问题是您使用的流错误。

console.log(file._writableState.bufferedRequest.chunk.toString());

file._writableState.bufferedRequest仅包含当前缓冲区,如果缓冲区已被刷新(很可能是这种情况),则会得到整个图像的一部分base64,这就是为什么无法显示它的原因。默认情况下,fs.createWritableStream每隔16kb刷新一次缓冲区,该值来自highWaterMark选项。 (不要更改该值)

除非您真的知道自己在做什么,否则应该访问流的那些“私有”属性。

相反,如果只想将图像返回为base64,请使用:

response.setEncoding('base64');

并通过管道将其表达为响应对象。

const httpsRequest = https.request({
    method: 'GET',
    host: fileUrl.hostname,
    path: fileUrl.pathname,
    headers: sharepoint.headers(mimetype, fileName)
}, response => {
    response.setEncoding('base64');
    response.pipe(res);
});

httpsRequest.end();

无需将其保存到临时文件中。

现在您可以使用以下方式显示它:

<!-- Get the image via AJAX, and add `src` -->
<img src="data:image/jpeg;base64,{base64-from-api}" />

如果您想直接以image/jpeg而不是base64的形式显示图像,请删除response.setEncoding('base64')并仅离开response.pipe,那么您将能够:

<img src="/path/to/image/route" />