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

Nodejs - Download a PDF with Dropbox Core API and save to disk

在使用 Python 和来自 Dropbox 的 Python SDK 之前,我成功地做到了这一点,但现在我正在使用 Nodejs 和 Dropbox HTTP API错误的。当我在本地保存 PDF 文件时,我只能看到原始 PDF 的部分内容,当我使用 WinMerge 将其与原始文件进行比较时,我发现文件不相等且大小不同。我能想到的唯一区别是它可能使用与原始编码不同的编码保存,但我已经用 iconv-lite 尝试了其中的大部分,其中 none 给出了很好的结果。

我也尝试过使用 https://github.com/dropbox/dropbox-js to see if it gave a different result, and also 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) {});
}

我认为 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