从 URL 下载文件并上传到云端硬盘而不保存

Download file from URL and upload to Drive without saving

如标题所述,我正在尝试从 url 获取文件,然后将其上传到 Google 驱动器。我遇到的问题是我的请求 returns 一个包含二进制数据而不是文件的字符串。

到目前为止,我的代码是:

function uploadFile(auth, url){
    var drive = google.drive('v2');
    request.get(url, function(err, res){
        if(err) {
            //Handles error.
        } else {
            drive.files.insert({
                auth: auth,
                uploadType: 'multipart',
                convert: true,
                media: {
                    body: res.body
                }
            });
        }
    });
}

我尝试将响应通过管道传输到缓冲区,然后将其上传到云端硬盘,但仍然只将二进制文件转换为字符串。有人知道如何解决这个问题吗?

res 实际上是可传输的,因此您可以将其传入,即

...,
media: {
    body: res,
}

我通过检查 Google Node.js API 得出了这个结论,它们有一个函数 isReadableStream

下面的代码示例应该对此进行测试,以向您展示如何处理 res:

const request = require('request');
const stream  = require('stream');

request.get('https://www.drive.google.com', function(err, res) {
    if (err) {
        console.log(err);
        process.exit(-1);
    }

    console.log('is res streamable ? %s\nis res.body streamable ? %s\n',
        isReadableStream(res), isReadableStream(res.body));
});

function isReadableStream(obj) {
    return obj instanceof stream.Stream &&
       typeof obj._read === 'function' &&
       typeof obj._readableState === 'object';
}

然后里面:

// https://github.com/google/google-api-nodejs-client/blob/cc9e138b0e3e507f585d9e38ba3f06ec4da58d1b/lib/apirequest.js#L183-L188
if (body) {
    body.pipe(req);
}

那时他们将通过管道传输响应的内容。

希望对您有所帮助!