Nodejs - 使用Dropbox Core API下载PDF并保存到磁盘

时间:2015-04-10 11:34:12

标签: node.js pdf encoding dropbox-api

我已经设法在使用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) {});
}

1 个答案:

答案 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