我已经设法在使用Dropbox的Python和Python SDK之前没有遇到任何问题,但现在我正在使用Nodejs和Dropbox HTTP API出错了。当我在本地保存PDF文件时,我只能看到原始PDF的部分内容,当我将它与原始文件进行比较时,例如WinMerge,我看到文件不相等且大小不同。我能想到的唯一区别是,它可能会使用与原始编码不同的编码进行保存,但我已尝试使用iconv-lite进行大部分编码,但没有一个能够提供良好的结果。
我还尝试使用https://github.com/dropbox/dropbox-js来查看它是否给出了不同的结果,还使用了https://www.npmjs.com/package/request而不是node-rest-client,但没有成功。
有没有人实现这个并使其有效?
这是我的代码:
var fs = require('fs'),
RestClient = require('node-rest-client').Client;
var args = {
headers: {
'Content-Type': 'application/json',
'Accept': 'application/pdf',
'Authorization': 'Bearer xxx'
}
};
var restClient = new RestClient();
var url = 'https://api-content.dropbox.com/1/files/auto/' + dropboxPath;
var filePath = '/var/temp/' + fileName;
restClient.get(url, arguments, function(body, response) {
fs.writeFile(filePath, response, function (error, written, buffer) {});
}
使用不同的编码进行测试时,它看起来像这样:
var fs = require('fs'),
RestClient = require('node-rest-client').Client,
iconvlite = require('iconv-lite');
iconvlite.extendNodeEncodings();
var args = {
headers: {
'Content-Type': 'application/json',
'Accept': 'application/pdf',
'Authorization': 'Bearer xxx'
}
};
var restClient = new RestClient();
var url = 'https://api-content.dropbox.com/1/files/auto/' + dropboxPath;
var filePath = '/var/temp/' + fileName;
var options = { encoding: 'UTF-8' };
restClient.get(url, arguments, function(body, response) {
fs.writeFile(filePath, response, options, function (error, written, buffer) {});
}
答案 0 :(得分:4)
我认为node-rest-client总是将返回的数据转换为字符串,因此最终会破坏二进制数据。请参阅https://github.com/aacerox/node-rest-client/blob/master/lib/node-rest-client.js#L396。
使用回调时,请求库似乎有类似的问题,但你可以通过直接管道到文件来绕过它:
var fs = require('fs'),
request = require('request');
var accessToken = '123xyz456';
var filename = 'myfile.pdf';
request('https://api-content.dropbox.com/1/files/auto/' + filename, {
auth: { bearer: accessToken }
}).pipe(fs.createWriteStream(filename));
编辑:我在GitHub上提出了一个针对node-rest-client问题的问题,看起来这个库维护者已经准备好了一个修复程序(在分支中)。请参阅https://github.com/aacerox/node-rest-client/issues/72。