首页 > 解决方案 > 尝试使用nodejs和curl(alt = media)从驱动器下载jpg但没有成功

问题描述

我使用了 nodejs,然后 curl 使用了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

标签: google-drive-api

解决方案


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

从 :

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

至 :

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

笔记 :

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

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


推荐阅读