google-drive-api - 尝试使用nodejs和curl(alt = media)从驱动器下载jpg但没有成功
问题描述
我使用了 nodejs,然后 curl 使用了files/{fileid}?alt=media
.
我得到数据,那不是问题。但是当我使用浏览器从驱动器下载并且我下载的文件绝对不是JPG时,我得到的数据不足文件大小。我检查了十六进制的第一个字节,起始字符是错误的。但是很多后续的字符都是正确的。我假设这是一个编码问题,但我已经花了大约 4 个小时来尝试我能想到的一切。
我使用 nodejs API 下载的文件如下所示
00000000: fdfd fdfd 0010 4a46 4946 0001 0100 0001 ......JFIF......
真实文件如下所示:
00000000: ffd8 ffe0 0010 4a46 4946 0001 0100 0001 ......JFIF......
ffd8 是 JPEG 的正确起始字节,因此真实文件是正确的。
有任何想法吗?
我使用 CURL 下载的那些看起来更加不同,所以我可能在那里做错了什么。
最后我剥离了代码并执行了一个从节点到 api 的纯 https 函数:
var params = "";
const options = {
hostname: "www.googleapis.com",
headers : {
'Content-Type' : 'application/x-www-form-urlencoded',
'Authorization' : 'Bearer '+file_token.access_token,
},
port: 443,
path: "/drive/v3/files/"+file_id+"/?alt=media",
method: 'GET'
};
var req = https.request(options, function(res) {
const statusCode = res.statusCode;
const contentType = res.headers['content-type'];
res.setEncoding('binary');
var rawData = '';
let rdata = [ ];
res.on('data', function (chunk) { rdata.push(Buffer.from(chunk, 'binary')); rawData += chunk; });
res.on('end', function () {
try {
var rbinary = Buffer.concat(rdata);
fs.writeFileSync("/tmp/xxx.jpg", rdata);
} catch (E) {
console.log(E);
}
})
});
req.write(params);
req.end();
有了这个,我得到了更糟糕的结果:
0000000: efbf bdef bfbd efbf bdef bfbd 0010 4a46 ..............JF
解决方案
我认为您的脚本几乎是正确的。但是有一个修改点。那么可以修改如下吗?
从 :
fs.writeFileSync("/tmp/xxx.jpg", rdata);
至 :
fs.writeFileSync("/tmp/xxx.jpg", rbinary);
笔记 :
- 这假设您的访问令牌可用于下载文件,并且在 API 控制台中启用了 Drive API。
如果这不起作用,请告诉我。我想修改它。
推荐阅读
- cordova - cordova create: TypeError: prompt.close 不是函数
- ios - 如何在收藏视图中显示从图库中选择的多个图像?
- python - 长/宽数据到宽/长
- excel - 如何通过excel VBA在IE11中浏览PDF时单击下载按钮
- powershell - 控制台中的 Remove-AppxPackage 嘈杂
- python - Sympy TypeError 使用solve以其他方式表达变量时
- html - Mailchimp - 如何在图像上方添加可变文本
- c# - 如何告诉 ASP.NET Core MVC 框架包含我的控制器的程序集?
- file - 在 NSIS 的 for 循环中将变量传递给 File 函数
- android - com.google.firebase.iid.zzf 无法转换为 com.google.android.gms.iid.zzi