代码之家  ›  专栏  ›  技术社区  ›  Jonathan Carter

尝试使用nodejs和curl(alt=media)从驱动器下载JPG,但未成功

  •  1
  • Jonathan Carter  · 技术社区  · 6 年前

    我用了点头,然后卷曲使用 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 回复  |  直到 6 年前
        1
  •  0
  •   Tanaike    6 年前

    我认为你的剧本几乎是正确的。但有一个修改点。那么你能修改如下吗?

    来自:

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

    到:

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

    注:

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

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

    推荐文章