gpt4 book ai didi

javascript - 无法使用 API 从 Google 云端硬盘下载文件 - node.js

转载 作者:数据小太阳 更新时间:2023-10-29 05:01:10 25 4
gpt4 key购买 nike

我正在尝试使用 Google SDK API 和 node.js 从谷歌驱动器下载一个文件。

但我无法在服务器端写入/保存文件 - node.js

代码:-

var GoogleTokenProvider = require("refresh-token").GoogleTokenProvider,
async = require('async'),
fs = require("fs"),
request = require('request'),
_accessToken;

var _XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;
var https = require('https');

const CLIENT_ID = "";
const CLIENT_SECRET = "";
const REFRESH_TOKEN = '';
const ENDPOINT_OF_GDRIVE = 'https://www.googleapis.com/drive/v2';

async.waterfall([
//-----------------------------
// Obtain a new access token
//-----------------------------
function(callback) {
var tokenProvider = new GoogleTokenProvider({
'refresh_token': REFRESH_TOKEN,
'client_id': CLIENT_ID,
'client_secret': CLIENT_SECRET
});
tokenProvider.getToken(callback);
},

//--------------------------------------------
// Retrieve the children in a specified folder
//
// ref: https://developers.google.com/drive/v2/reference/files/children/list
//-------------------------------------------
function(accessToken, callback) {
_accessToken = accessToken;
request.get({
'url': ENDPOINT_OF_GDRIVE + '/files?' + "q='root' in parents and (mimeType = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document')",
'qs': {
'access_token': accessToken
}
}, callback);
},

//----------------------------
// Parse the response
//----------------------------
function(response, body, callback) {
var list = JSON.parse(body);
if (list.error) {
return callback(list.error);
}
callback(null, list.items[0]);
},

//-------------------------------------------
// Get the file information of the children.
//
// ref: https://developers.google.com/drive/v2/reference/files/get
//-------------------------------------------
function(children, callback) {

var xhr = new _XMLHttpRequest();
xhr.open('GET', children.downloadUrl);
xhr.setRequestHeader('Authorization', 'Bearer ' + _accessToken);
xhr.onload = function() {
console.log("xhr.responseText", xhr.responseText)
fs.writeFile("download.docx", xhr.responseText)
callback(xhr.responseText);
};
xhr.onerror = function() {
callback(null);
};
xhr.send();
}
],
function(err, results) {
if (!err) {
console.log(results);
}
});

我在控制台中得到这个:- xhr.responseText 的内容是这样的

��▬h��↕E6M��~��3�3∟�9�� � �►��/2�:���♂�4��]�♀I�R���►
$SB6Q���c↔��H�=;+
���►q�3Tdכ��@!T��hEl_�|�I�↨��h(�^:▬�[h̓D♠��f���♠*���ݾ��M→
�1⌂♦"N�↑�o�]�7U$��A6����♠�W��k`�f▬♫��K�Z�^‼�0{<Z�▼�]F�����

���J♥A♀��♣�a�}7�
"���H�w"�♥���☺w♫̤ھ�� �P�^����O֛���;�<♠�aYՠ؛`G�kxm��PY�[��g
Gΰino�/<���<�1��ⳆA$>"f3��\�ȾT��∟I S�������W♥����Y

请帮助我了解我从 Drive Api 获取的数据是什么格式,并以何种格式写入,以便我得到一个完整的 .docx 文件

编辑

我愿意使用 xmlRequest 以外的任何方法,只要它能帮助我下载文件 (.docx)。

最佳答案

node-XMLHttpRequest ,似乎不支持二进制下载 - 请参阅 this issue .您看到的是文件的二进制内容转换为字符串,在 JavaScript 中,这是二进制数据的不可逆和破坏性过程(这意味着您无法将字符串转换回缓冲区并获得与原始内容相同的数据)。

使用 request ,您可以通过这种方式下载二进制文件:

var request = require('request')
, fs = require('fs')

request.get(
{ url: 'your-file-url'
, encoding: null // Force Request to return the data as Buffer
, headers:
{ Authorization: 'Bearer ' + accessTokenHere
}
}
, function done (err, res) {
// If all is well, the file will be at res.body (buffer)
fs.writeFile('./myfile.docx', res.body, function (err) {
// Handle err somehow
// Do other work necessary to finish the request
})
}
)

注意:这会将整个文件缓冲到内存中,然后才能保存到磁盘。对于小文件,这很好,但对于较大的文件,您可能需要考虑将其实现为流式下载。 This SO question已经回答了,我建议你看看。

有关如何授权您的请求的更多信息,请访问 Google Developers docs。 .

关于javascript - 无法使用 API 从 Google 云端硬盘下载文件 - node.js,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29276660/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com