我遇到了使用API从云端硬盘获取二进制文件的问题,我一直在圈子里。
以下是相关的代码位:
// Load client secrets from a local file.
fs.readFile('client_secret.json', function processClientSecrets(err, content) {
if (err) {
console.log('Error loading client secret file: ' + err);
return;
}
// Authorize a client with the loaded credentials, then call the
// Drive API.
oauth.authorize(JSON.parse(content), dasm.init, driveapi.getFile)
});
driveapi.getFile:
function getFile(auth, cb) {
var service = google.drive('v3');
service.files.get({
auth: auth,
pageSize: 20,
fileId: "0B2h-dgPh8_5CZE9WZVM4a3BxV00",
alt: 'media'
}, function(err, response) {
if (err) {
console.log('The API returned an error: ' + err);
return;
}
cb(response)
});
}
现在,response
似乎以字符串形式返回。当我尝试转换为十六进制时,它会疯狂。有没有办法把response
带进Buffer
?或者它是从service.files.get
得到它的第二个被破坏了吗?
坚果,我的意思是
console.log(
arrData[0].charCodeAt(0).toString(2),
'-',
arrData[1].charCodeAt(0).toString(2),
'-',
arrData[2].charCodeAt(0).toString(2),
'-',
arrData[3].charCodeAt(0).toString(2),
'-',
arrData[4].charCodeAt(0).toString(2)
)
= 1001101 - 1011010 - 1111111111111101 - 0 - 11(我正在使用二进制文件来尝试查看损坏的内容)
正确的十六进制是4D 5A 90 00 03
编辑:对于那些感到困惑的人,就像我一样,90
如何成为fffd
,当值未映射到ASCII字符时,显示Unicode replacement character。< / p>
答案 0 :(得分:4)
终于能够解决这个问题了。 Google API使用请求模块,您可以apply any options接受它。作为参考,您需要设置[encoding: null]
2,因为任何其他选项都会通过toString传递响应,因此如果您正在使用二进制数据则会破坏它。
工作代码位于:
function getFile(auth, cb) {
var service = google.drive({
version: 'v3',
encoding: null
});
service.files.get({
auth: auth,
fileId: "0B2h-dgPh8_5CZE9WZVM4a3BxV00",
alt: 'media'
}, function(err, response) {
if (err) {
console.log('The API returned an error: ' + err);
return;
}
cb(response)
});
}
答案 1 :(得分:0)
此答案基于MDN about sending and receiving binary data
中的文章function getFile(auth, cb) {
var service = google.drive('v3');
service.files.get({
auth: auth,
pageSize: 20,
fileId: "0B2h-dgPh8_5CZE9WZVM4a3BxV00",
alt: 'media'
}, function(err, response) {
if (err) {
console.log('The API returned an error: ' + err);
return;
}
var arrayBuffer = response;
if (arrayBuffer) {
var byteArray = new Uint8Array(arrayBuffer);
for (var i = 0; i < byteArray.byteLength; i++) {
// do something with each byte in the array
}
}
}
如果没有得到字节数组,则必须使用下面的代码将字符串转换为bytearray。
var bytes = [];
for (var i = 0, len = response.length; i < len; ++i) {
bytes.push(str.charCodeAt(i));
}
var byteArray = new Uint8Array(bytes);
for (var i = 0; i < byteArray.byteLength; i++) {
// do something with each byte in the array
}