尝试使用Node.js和curl(alt = media)从驱动器下载jpg而没有成功

时间:2018-08-17 17:08:32

标签: google-drive-api

我使用过nodejs,然后卷曲以使用files/{fileid}?alt=media

我得到数据,那不是问题。但是当我使用浏览器从驱动器下载时,获得的数据不足文件大小,并且下载的文件绝对不是JPG。我检查了十六进制的第一个字节,起始字符错误。但是许多后续字符都是正确的。我以为这是一个编码问题,但是我花了大约4个小时来尝试我能想到的一切。

我使用nodejs API下载的文件如下所示

00000000: fdfd fdfd 0010 4a46 4946 0001 0100 0001  ......JFIF......

真实文件如下:

00000000: ffd8 ffe0 0010 4a46 4946 0001 0100 0001  ......JFIF......

ffd8是JPEG的正确起始字节,因此真实文件是正确的。

有什么想法吗?

我使用CURL下载的内容看起来更加不同,所以我可能在这里做错了。

最后,我剥离了代码并执行了从节点到api的纯https函数:

        var  params = "";

        const options = {
          hostname: "www.googleapis.com",
          headers : {
            'Content-Type'      : 'application/x-www-form-urlencoded',
            'Authorization'     : 'Bearer '+file_token.access_token,
          },
          port: 443,
          path: "/drive/v3/files/"+file_id+"/?alt=media",
          method: 'GET'
        };


        var req = https.request(options, function(res) {
            const statusCode = res.statusCode;
            const contentType = res.headers['content-type'];
            res.setEncoding('binary');
            var rawData = '';
            let rdata = [ ];
            res.on('data', function (chunk) { rdata.push(Buffer.from(chunk, 'binary')); rawData += chunk; });
            res.on('end', function () {
                try {
                    var rbinary = Buffer.concat(rdata);
                    fs.writeFileSync("/tmp/xxx.jpg", rdata);

                } catch (E) {
                    console.log(E);
                }
            })
        });
        req.write(params);
        req.end();

有了这个,我得到的结果甚至更糟:

0000000: efbf bdef bfbd efbf bdef bfbd 0010 4a46  ..............JF

1 个答案:

答案 0 :(得分:0)

我认为您的脚本几乎是正确的。但是有一个修改点。那么您可以进行以下修改吗?

发件人:

fs.writeFileSync("/tmp/xxx.jpg", rdata);

收件人:

fs.writeFileSync("/tmp/xxx.jpg", rbinary);

注意:

  • 这假定您的访问令牌可用于下载文件,并且已在API控制台上启用了Drive API。

如果这不起作用,请告诉我。我想修改它。