Декодирование 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...")
Другие вопросы по тегам