使用 GitHub API 下载文件时解码 base64
Decoding base64 while using GitHub API to Download a File
我正在使用 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 向我发送了正确的数据,所以我认为这不是问题所在。
是我解码不当还是我忽略了其他问题?
感谢任何帮助。
我做了一些实验,找到了使用不同的 base64 解码库的解决方案,如下所示:
var base64 = require('js-base64').Base64;
var contents = base64.decode(res.content);
我不确定编码后的字符串长度是否必须被 4 整除(显然我的 15263 字符长度的字符串不能被 4 整除)但是备用库正确解码了字符串。
我还发现第二个解决方案是特定于如何使用 GitHub API 的。通过将以下内容添加到 GitHub API 调用 header,我还能够获取解码后的文件内容:
'accept': 'application/vnd.github.VERSION.raw'
出于某种原因,Github API base64 编码内容在我从 google.
的首页尝试过的所有在线 base64 解码器中都无法正确解码
Python 然而有效:
import base64
base64.b64decode("ewogICAgInN3YWdnZXIiOiAiM...")
经过多次试验,我想我确定了 base64 解码正常工作和损坏的区别。
看起来 GitHub Base-64 编码为:
- UTF-8 字符集
- Base 64 MIME 编码器 (RFC2045)
相对于 "basic" (RFC4648) Base64 编码器。有几种语言似乎默认使用基本编码器(包括我正在使用的 Java)。当我切换到 MIME 编码器时,我得到了文件的全部内容 un-garbled。这可以解释为什么在某些情况下切换库可以解决问题。
我会注意到内容字段包含换行符 - 解码器应该会忽略它们,但并不是所有的解码器都会忽略它们,所以如果您仍然遇到错误,您可能需要尝试删除它们。
media-type header 会做得更好,但在我的情况下,我正在尝试通过 GitHub 应用程序使用 API - 在撰写本文时,GitHub 要求在执行此操作时使用特定的媒体类型,并且 returns JSON 响应。
我正在使用 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 向我发送了正确的数据,所以我认为这不是问题所在。
是我解码不当还是我忽略了其他问题?
感谢任何帮助。
我做了一些实验,找到了使用不同的 base64 解码库的解决方案,如下所示:
var base64 = require('js-base64').Base64;
var contents = base64.decode(res.content);
我不确定编码后的字符串长度是否必须被 4 整除(显然我的 15263 字符长度的字符串不能被 4 整除)但是备用库正确解码了字符串。
我还发现第二个解决方案是特定于如何使用 GitHub API 的。通过将以下内容添加到 GitHub API 调用 header,我还能够获取解码后的文件内容:
'accept': 'application/vnd.github.VERSION.raw'
出于某种原因,Github API base64 编码内容在我从 google.
的首页尝试过的所有在线 base64 解码器中都无法正确解码Python 然而有效:
import base64
base64.b64decode("ewogICAgInN3YWdnZXIiOiAiM...")
经过多次试验,我想我确定了 base64 解码正常工作和损坏的区别。
看起来 GitHub Base-64 编码为:
- UTF-8 字符集
- Base 64 MIME 编码器 (RFC2045)
相对于 "basic" (RFC4648) Base64 编码器。有几种语言似乎默认使用基本编码器(包括我正在使用的 Java)。当我切换到 MIME 编码器时,我得到了文件的全部内容 un-garbled。这可以解释为什么在某些情况下切换库可以解决问题。
我会注意到内容字段包含换行符 - 解码器应该会忽略它们,但并不是所有的解码器都会忽略它们,所以如果您仍然遇到错误,您可能需要尝试删除它们。
media-type header 会做得更好,但在我的情况下,我正在尝试通过 GitHub 应用程序使用 API - 在撰写本文时,GitHub 要求在执行此操作时使用特定的媒体类型,并且 returns JSON 响应。