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

Decoding base64 while using GitHub API to Download a File

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

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

HTTP请求如下图所示:

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

(部分)响应如下图所示:

1
2
3
4
5
6
{
   "name":....,
   "download_url":...",
   "type":"file",
   "content":"ewogICAgInN3YWdnZXIiOiAiM...
}

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

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

解码导致异常:

1
2
3
4
5
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)
    :
    :

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

我是否执行解码不正确,或者我忽略了另一个问题?

感谢您的帮助。


我做了一点实验,找到了一个解决方案,使用不同的base64解码库,如下所示:

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

我不确定是否强制要求编码的字符串长度可以被4整除(显然,我的15263个字符长度的字符串不能被4整除),但是备用库正确地解码了该字符串。

第二个解决方案是如何使用GitHub API,我也发现它是有效的。通过将以下内容添加到Github API调用头中,我还可以获得解码后的文件内容:

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


经过大量的试验,我认为我确定了工作和坏base64解码之间的区别。

似乎Github Base-64编码为:

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

与"基本"(RFC4648)base64编码器不同。一些语言似乎默认为基本的编码器(包括Java,我使用的)。当我切换到一个mime编码器时,我得到了文件的完整内容。这可以解释为什么在某些情况下切换库可以解决这个问题。

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

media-type头将更好地完成这项工作,但是在我的例子中,我正试图通过GitHub应用程序使用API——在编写时,GitHub要求使用特定的媒体类型,并返回JSON响应。


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

但是,python可以工作:

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