2013-02-04 10 views
19

Próbuję odszyfrować ciąg base64 dla obrazu z powrotem do pliku binarnego, aby można go było pobrać i wyświetlić lokalnie przez system operacyjny.Wyjątek DOM 5 Nieprawidłowy błąd CHARACTER na poprawnym łańcuchu obrazów base64 w javascript

Ciąg, który z powodzeniem wyrenderowałem po umieszczeniu jako src elementu HTML IMG z prefiksem URI danych (dane: img/png; base64,), ale gdy używa się funkcji atob lub funkcji zamknięcia goog, zawodzi.

Jednakże dekodowanie powiedzie kiedy umieścić tu: http://www.base64decode.org/

pomysłów?

EDYTOWANIE: Udało mi się go zdekodować z inną biblioteką inną niż wbudowana funkcja JS. Ale nadal nie otwiera się lokalnie - na komputerze Mac mówi, że jest uszkodzony lub w nieznanym formacie i nie można go otworzyć.

Kod jest tylko coś takiego:

imgEl.src = 'data:img/png;base64,' + contentStr; //this displays successfully 
decodedStr = window.atob(contentStr); //this throws the invalid char exception but i just 
//used a different script to get it decode successfully but still won't display locally 

sam ciąg base64 jest zbyt długi, aby wyświetlić tutaj (limit wynosi 30.000 znaków)

Odpowiedz

36

właśnie walić głową w ścianę na ten jeden przez chwilę.

Istnieje kilka możliwych przyczyn tego problemu. 1) Problemy z Utf-8. Tutaj jest dobre rozwiązanie do pisania + rozwiązanie. http://monsur.hossa.in/2012/07/20/utf-8-in-javascript.html

W moim przypadku musiałem również upewnić się, że wszystkie spacje były poza ciągiem przed przekazaniem go do atob. na przykład

function decodeFromBase64(input) { 
    input = input.replace(/\s/g, ''); 
    return atob(input); 
} 

Co było naprawdę frustrujące było to, że base64 analizowany poprawnie przy użyciu biblioteki base64 w Pythonie, ale nie w JS.

+0

Dzięki! To jest ratownik. W Base64 miałem absurdalnie długi plik PDF, który powodował błąd w aplikacji mobilnej, ale działał w przeglądarce. Usunięcie spacji działało. – Amod

+0

Dziękuję za to. Miałem podobny problem, ale był to końcowy powrót karetki, który pojawiał się tylko w Safari. Ta sama metodologia to naprawiła. – echappy

+0

Rails pozornie bardzo często przestaje base64, a Chrome zignoruje białe spacje, podczas gdy Safari tego nie zrobi. Twoja sugestia "zamień" spowodowała, że ​​moja aplikacja ponownie działa w Safari. Dzięki za to! – Alex

3

Musiałem usunąć data:audio/wav;base64, przed b64, ponieważ zostało to podane jako część b64.

var data = b64Data.substring(b64Data.indexOf(',')+1);

var processed = atob(data);