如何在节点中保存来自http请求的二进制图像

问题描述 投票:0回答:1

使用nodejs,我使用以下代码通过摘要身份验证连接到相机并下载图像数据。

var request = require('request')

var options = {
    'url': uri,
    'auth': {
        'user': user,
        'pass': pass,
        'sendImmediately': false
    }
};

var request = request.get(options, function (error, response, body) {
    if (!error && response.statusCode == 200) {

        console.log('response :>> ', response);
        const filename = "picture.jpg"
        // const fileContents = Buffer.from(resp.body._readableState.buffer.head, 'base64')
        const fileContents = Buffer.from(body)
        // fs.writeFile(filename, fileContents, (err) => {
        fs.writeFileSync(filename, fileContents, (err) => {
            if (err) return console.error(err)
            console.log('file saved to ', filename)
            return body
        })
    }
    else {
        console.log('Code : ' + response.statusCode)
        console.log('error : ' + error)
        console.log('body : ' + body)
    }
});

这会创建一个约 360kb 的文件,大约是通过浏览器下载时图像预期大小的 2 倍。它也无法在图像编辑软件或任何其他软件中打开——它不会创建有效的 jpg。

body
写入控制台时,它看起来像这样的一堆:

我不确定如何将这些数据转换为可以写入文件系统的图像文件。帮忙吗?

更新:我已经更改了

buffer.from
来尝试'binary','utf-8','utf8','base64url'和'base64'...但无济于事。

响应返回的内容类型为

'image/jpeg; charset="UTF-8"'
,但创建的文件仍然无效。

更新#2: 这个问题:nodejs在缓冲区和字符串之间转换图像告诉我,一旦将jpg发送到UTF8,你就无法返回到有效的jpg....所以然后我开始想知道是否可以以不同的编码请求。事实证明,Request允许可选的

encoding
参数。 (很遗憾看到它被不必要地废弃了……但是每周有 2000 万次下载,我认为它不会有任何发展)

因此将我的选项更改为:

var options = {
    'url': uri,
    'encoding': 'binary',
    'auth': {
        'user': user,
        'pass': pass,
        'sendImmediately': false
    }
};

以及我的缓冲区创建:

const fileContents = Buffer.from(body, 'binary')

一切都匹配。

node.js buffer fs digest-authentication
1个回答
0
投票

地狱般的过山车之旅。谢啦。 @lowcrawler

我必须使用 NodeJS 将 REST API 响应保存到 vRO 包文件中,但我就是做不到,这让我很挠头。但在阅读了你的评论和点击和追踪后,我终于成功了。再次感谢。

var request = require('request');
var fs = require('fs');
process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = 0;
var options = {
  'method': 'GET',
  'encoding': 'binary',
  'url': 'https://vro_fqdn/vco/api/packages/gitlab_vro_credential_store_confs?exportConfigurationAttributeValues=true&exportGlobalTags=true&exportVersionHistory=true&exportConfigSecureStringAttributeValues=false&allowedOperations=vef&exportExtensionData=false',
  'headers': {
    'Accept': 'application/zip',
    'Authorization': 'Basic eDIxMzxxxxxxxxxxxx5sb2NhbDpBdWcjMjAyMw=='
  }
};
request(options, function (error, response, body) {
  if (error) throw new Error(error);
  console.log(response.body);
  fs.writeFile("packageName.package",  Buffer.from(body, 'binary'), function(err){
    if (err) throw err;
    console.log("success");
    });
});
© www.soinside.com 2019 - 2024. All rights reserved.