2013-02-04 5 views
19

イメージ用のbase64文字列をデコードしてバイナリに戻そうとしているため、OSによってローカルにダウンロードして表示できます。DOM例外5 javascriptの有効なbase64イメージ文字列でINVALID CHARACTERエラーが発生しました

データURIの前置詞(data:img/png; base64)を持つHTML IMG要素のsrcとして配置すると、文字列が正常に描画されますが、atob関数またはgoog closure関数を使用すると失敗します。ここに入れたときに

しかしデコードが成功します。http://www.base64decode.org/

任意のアイデア?

EDIT: 組み込みJS関数以外の別のライブラリでデコードすることに成功しました。しかし、それはまだローカルに開かれません - Macでは、それが壊れているか、または未知の形式であり、開けられないと言います。

コードのようなだけで何かです:

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 

base64文字列自体は、ここで表示するにはあまりにも長いです

答えて

36

私はこの1つだけで壁に頭を叩いた(上限は30,000文字です)しばらくの間。

問題の原因はいくつか考えられます。 1)Utf-8の問題。ここには良い書き方+解決策があります。 http://monsur.hossa.in/2012/07/20/utf-8-in-javascript.html

私の場合は、すべての空白がatobに渡す前に文字列から抜けていなければなりませんでした。例えば

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

実際に不快なことは、base64がPythonではbase64ライブラリを使用して正しく解析されたが、JSでは認識されないということでした。

+0

ありがとう!それは命の恩人です。私は、Base64で非常に長いPDFを持っていましたが、モバイルアプリケーションでエラーが発生していましたが、Webブラウザで作業していました。スペースを削除すると機能しました。 – Amod

+0

ありがとうございます。私も同様の問題がありましたが、それはSafariにしか現れなかった後続のキャリッジリターンでした。これと同じ方法で修正されました。 – echappy

+0

Railsはbase64をかなり頻繁にチョップし、Safariは空白を無視しますが、Chromeは空白を無視します。あなたの 'replace'提案は私のアプリを再びSafariで動かすことになった。ありがとう! – Alex

3

これはb64の前にあるdata:audio/wav;base64,を削除する必要がありました。これはb64の一部として行われました。

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

var processed = atob(data);