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

时间:2015-11-17 17:03:56

标签: node.js request google-drive-api

正如标题所示,我正在尝试从网址获取文件,然后将其上传到Google云端硬盘。我得到的问题是我的请求返回一个包含二进制数据而不是文件的字符串。

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

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
                }
            });
        }
    });
}

我试图将响应传递给缓冲区,然后将其上传到云端硬盘,但仍然只将二进制文件转换为字符串。有没有人提示如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

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);
}

当他们管道响应的内容时。

希望这有帮助!