使用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')
一切都匹配。
地狱般的过山车之旅。谢啦。 @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");
});
});