window.atob не может декодировать строку и выдает ошибку - PullRequest
0 голосов
/ 22 октября 2018
        function saveIMG(image) {
            var startIndex = image.indexOf("base64,") + 7;
            var b64 = image.substr(startIndex, image.indexOf(">") - startIndex - 2);
            var byteCharacters = atob(b64);
            var byteNumbers = new Array(byteCharacters.length);
            for (var i = 0; i < byteCharacters.length; i++) {
                byteNumbers[i] = byteCharacters.charCodeAt(i);
            }
            var byteArray = new Uint8Array(byteNumbers);
            var data = new Blob([byteArray], {type: 'image/jpeg'});
            return "<img src='" + window.URL.createObjectURL(data) + "' width='150'/>";
        }

Я хотел использовать этот код для кодирования изображения base64 в изображение с использованием URL.Однако в строке, где он использует atob, выдается эта ошибка:

Uncaught DOMException: Не удалось выполнить 'atob' в 'Window': строка, которая должна быть декодирована, неправильно закодирована.

Я могу только предположить, что это как-то связано с base64, или, возможно, он не может конвертировать изображения base64 с использованием atob.В любом случае, вот начало base64, которое было взято из подстроки:

/9j/4AAQSkZJRgABAQEASABIAAD/7RTuUGhvdG9zaG9wIDMuMAA4QklNBAQAAAAAAA8cAVoAAxslRxwCAAACAAAAOEJJTQQlAAAAAAAQzc/6fajHvgkFcHaurwXDTjhCSU0EOgAAAAAA5QAAABAAAAABAAAAAAALcHJpbnRPdXRwdXQAAAAFAAAAAFBzdFNib29sAQAAAABJbnRlZW51bQAAAABJbnRlAAAAAENscm0AAAAPcHJpbnRTaXh0ZWVuQml0Ym9vbAAA

1 Ответ

0 голосов
/ 22 октября 2018

Отсюда я бы сказал, что ваша проблема заключается во втором параметре substr:

 image.indexOf(">") - startIndex - 2

Хотя оставшаяся часть вашего кода указывает на нормальный dataURI, эта часть подразумевает наличие символа, который не будетдопустимо там (>).

Так что я сильно подозреваю, что значение этого второго параметра будет -1 -16 -2 => -19 и, таким образом, возможно, удалит слишком много данных, что сделает вашу строку base64 недопустимой (например, если его длина / 4 оставляет 1 остаток).

Так что, если у вас действительно есть действительный dataURI, все, что вам нужно, это удалить второй аргумент:

function saveIMG(image) {
var startIndex = image.indexOf("base64,") + 7;
var b64 = image.substr(startIndex);
var byteCharacters = atob(b64);
var byteNumbers = new Array(byteCharacters.length);
for (var i = 0; i < byteCharacters.length; i++) {
byteNumbers[i] = byteCharacters.charCodeAt(i);
}
var byteArray = new Uint8Array(byteNumbers);
var data = new Blob([byteArray], {type: 'image/jpeg'});
return "<img src='" + window.URL.createObjectURL(data) + "' width='150'/>";
}

// a black 300x150px JPEG image
var dataURI = document.createElement('canvas').toDataURL('image/jpeg');
var imgStr = saveIMG(dataURI);
document.body.innerHTML = imgStr;
...