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。
在使用 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。