使用GitHub API下载文件时解码base64

时间:2016-11-23 15:45:33

标签: base64 github-api node-github

我正在使用GitHub API从GitHub下载文件。我已经能够成功进行身份验证以及从github获取响应,并查看表示文件内容的base64编码字符串。

不幸的是,在解码base64字符串时,我收到一个异常错误(字符串长度不是4的倍数)。

HTTP请求如下所示:

GET /repos/:owner/:repo/contents/:path

(部分)响应如下所示:

{
    "name":....,
    "download_url":...",
    "type":"file",
    "content":"ewogICAgInN3YWdnZXIiOiAiM...
}

我遇到的问题是字符串的长度是15263字节,我在解码字符串时遇到错误(字符串长度不是4的倍数)。我正在使用node.js和'base64-js'npm模块来解码字符串。执行解码的代码如下所示:

var base64 = require('base64-js');
var contents = base64.toByteArray(fileContent);

解码会导致异常:

Error: Invalid string. Length must be a multiple of 4
    at placeHoldersCount (.../node_modules/base64-js/index.js:23:11)
    at Object.toByteArray (...node_modules/base64-js/index.js:42:18)
    :
    :

我认为GitHub API正在向我发送正确的数据,所以我认为这不是问题。

我是不正确地执行解码还是我还有其他问题?

感谢任何帮助。

3 个答案:

答案 0 :(得分:6)

我试验了一下,通过使用不同的base64解码库找到了解决方案,如下所示:

var base64 = require('js-base64').Base64;
var contents = base64.decode(res.content);

我不确定是否必须将编码的字符串长度整除4(显然我的15263字符长度字符串不能被4整除),但备用库正确解码了字符串。

我发现工作的第二个解决方案特定于如何使用GitHub API。通过将以下内容添加到GitHub API调用标头,我还能够获得解码的文件内容:

'accept': 'application/vnd.github.VERSION.raw'

答案 1 :(得分:1)

经过大量的实验,我认为我确定了base64解码工作与破译之间的区别。

似乎GitHub Base-64的编码为:

  • UTF-8字符集
  • Base 64 MIME编码器(RFC2045)

与“基本”(RFC4648)Base64编码器相反。几种语言似乎默认使用基本编码器(包括我使用的Java)。当我切换到MIME编码器时,我得到了文件的全部内容,没有乱码。这可以解释为什么在某些情况下切换库可以解决此问题。

我会注意到content字段包含换行符-解码器应该忽略它们,但并非全部忽略,因此,如果仍然出现错误,则可能需要尝试删除它们。

media-type头会做得更好,但是在我的情况下,我试图通过GitHub App使用API​​-在撰写本文时,GitHub要求使用特定的媒体类型,并且返回JSON响应。

答案 2 :(得分:0)

出于某种原因,Github API base64编码的内容无法在我从谷歌首页尝试的所有在线base64解码器中正确解码。

然而,

Python可以工作:

import base64
base64.b64decode("ewogICAgInN3YWdnZXIiOiAiM...")