Декодирование base64 при использовании GitHub API для загрузки файла
Я использую GitHub API для загрузки файла с GitHub. Я был в состоянии успешно пройти аутентификацию, а также получить ответ от github и увидеть строку в кодировке base64, представляющую содержимое файла.
К сожалению, я получаю необычную ошибку (длина строки не кратна 4) при декодировании строки base64.
Запрос HTTP показан ниже:
GET /repos/:owner/:repo/contents/:path
(Частичный) ответ иллюстрируется ниже:
{
"name":....,
"download_url":...",
"type":"file",
"content":"ewogICAgInN3YWdnZXIiOiAiM...
}
Проблема, с которой я сталкиваюсь, состоит в том, что длина строки составляет 15263 байта, и я получаю ошибку при декодировании строки (длина строки не кратна 4). Я использую node.js и модуль npm base64-js для декодирования строки. Код для выполнения декодирования иллюстрируется ниже:
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 отправляет мне правильные данные, поэтому я считаю, что это не проблема.
Я неправильно выполняю декодирование или есть другая проблема, которую я пропускаю?
Любая помощь приветствуется.
2 ответа
Я немного поэкспериментировал и нашел решение с помощью другой библиотеки декодирования base64 следующим образом:
var base64 = require('js-base64').Base64;
var contents = base64.decode(res.content);
Я не уверен, обязательно ли иметь кодированную длину строки, кратную 4 (ясно, что моя строка длиной 15263 символа не делится на 4), но альтернативная библиотека правильно декодировала строку.
Второе решение, которое я также нашел работающим, относится к тому, как использовать GitHub API. Добавив следующее в заголовок вызова API GitHub, я также смог получить содержимое декодированного файла:
'accept': 'application/vnd.github.VERSION.raw'
После долгих экспериментов, я думаю, я разобрал разницу между рабочим и неработающим декодированием base64.
Похоже, GitHub Base-64 кодирует с помощью:
- Кодировка UTF-8
- MIME-кодер Base 64 (RFC2045)
В отличие от "базового" (RFC4648) кодера Base64. По-видимому, несколько языков по умолчанию используются в базовом кодировщике (включая Java, который я использовал). Когда я переключился на кодировщик MIME, я получил полное содержимое файла без искажений. Это объясняет, почему переключение библиотек в некоторых случаях решало проблему.
Я отмечу, что поле содержимого содержит символы новой строки - предполагается, что декодеры их игнорируют, но не все это делают, поэтому, если вы все равно получаете ошибки, вам, возможно, придется попробовать их удалить.
Заголовок медиа-типа сделает эту работу лучше, однако в моем случае я пытаюсь использовать API через приложение GitHub - во время написания GitHub требует, чтобы при этом использовался определенный тип медиа, и он возвращает ответ JSON,
По какой-то причине контент в кодировке Base64 API Github не декодируется должным образом во всех онлайн-декодерах base64, которые я пробовал с первой страницы Google.
Python работает однако:
import base64
base64.b64decode("ewogICAgInN3YWdnZXIiOiAiM...")