2013-02-04 18 views
19

Tôi đang cố gắng giải mã chuỗi base64 cho hình ảnh trở thành nhị phân để có thể tải xuống và hiển thị cục bộ bằng hệ điều hành.Lỗi ngoại lệ DOM 5 CHARALID CHARACTER trên chuỗi hình ảnh base64 hợp lệ trong javascript

Chuỗi tôi đã hiển thị thành công khi được đặt dưới dạng src của phần tử HTML IMG với dữ liệu URI lời nói đầu (dữ liệu: img/png; base64,) nhưng khi sử dụng hàm atob hoặc hàm đóng goog không thành công.

Tuy nhiên giải mã thành công khi đặt tại đây: http://www.base64decode.org/

Bất kỳ ý tưởng?

EDIT: Tôi đã thành công để giải mã với một thư viện khác với hàm JS tích hợp sẵn. Tuy nhiên, nó vẫn sẽ không mở cục bộ - trên một máy Mac cho biết nó bị hỏng hoặc ở định dạng không xác định và không thể mở được.

Mã này chỉ là một cái gì đó như:

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 

chuỗi base64 chính nó là quá dài để hiển thị tại đây (giới hạn là 30.000 ký tự)

Trả lời

36

tôi chỉ đập đầu tôi vào tường trên một này trong một thời gian.

Có một số nguyên nhân có thể gây ra sự cố. 1) Các vấn đề về Utf-8. Có một cách viết hay + giải pháp cho điều đó ở đây. http://monsur.hossa.in/2012/07/20/utf-8-in-javascript.html

Trong trường hợp của tôi, tôi cũng phải đảm bảo rằng tất cả khoảng trắng đã hết chuỗi trước khi chuyển nó sang chế độ atob. ví dụ.

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

Điều thực sự bực bội là cơ sở phân tích cú pháp chính xác bằng thư viện base64 trong python, chứ không phải trong JS.

+0

Cảm ơn! Nó là một cuộc sống tiết kiệm. Tôi đã có một PDF dài gọn gàng trong Base64, và nó đã tạo ra lỗi trong ứng dụng di động nhưng đã làm việc trong trình duyệt web. Xóa không gian đã hoạt động. – Amod

+0

Cảm ơn bạn vì điều này. Tôi đã có một vấn đề tương tự nhưng nó là một trở về vận chuyển dấu vết mà chỉ hiển thị trong Safari. Phương pháp tương tự này đã sửa nó. – echappy

+0

Rails dường như đã băm base64 khá thường xuyên và Chrome sẽ bỏ qua khoảng trắng trong khi Safari thì không. Đề xuất 'replace' của bạn khiến ứng dụng của tôi hoạt động trên Safari một lần nữa. Cám ơn vì cái này! – Alex

3

Tôi phải xóa data:audio/wav;base64, trước mặt b64, vì điều này đã được đưa ra như một phần của b64.

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

var processed = atob(data);

Các vấn đề liên quan