package com.akjava.gwt.lib.client; import com.akjava.gwt.html5.client.file.Uint8Array; import com.google.common.io.BaseEncoding; /** * @author aki * */ public class Base64Utils { private Base64Utils(){} public static final String DATA_BASE64_KEY=";base64,"; public static String getDataUrlHeader(String mimeType){ return "data:"+mimeType+DATA_BASE64_KEY; } public static String toDataUrl(String mimeType,String base64){ return getDataUrlHeader(mimeType)+base64; } public static String toDataUrl(String mimeType,byte[] data){ return getDataUrlHeader(mimeType)+encode(data); } public static String toDataUrl(String mimeType,Uint8Array array){ return getDataUrlHeader(mimeType)+encodeBase64(array); } public static String encode(byte[] data){ return BaseEncoding.base64().encode(data); } /** * don't use dataurl that contain header,use fromDataUrl(); * @param data * @return */ public static byte[] decode(String data){ return BaseEncoding.base64().decode(data); } //TODO be careful public static byte[] fromDataUrl(String url){ int index=url.indexOf(DATA_BASE64_KEY); if(index!=-1){ return BaseEncoding.base64Url().decode(url.substring(DATA_BASE64_KEY.length())); }else{ return BaseEncoding.base64Url().decode(url); } } public static String cutHeader(String url){ int index=url.indexOf(DATA_BASE64_KEY); if(index!=-1){ return url.substring(index+DATA_BASE64_KEY.length()); }else{ return url; } } /** * based http://stackoverflow.com/questions/12710001/how-to-convert-uint8-array-to-base64-encoded-string * @param u8Arr * @return */ public static native final String encodeBase64(Uint8Array u8Arr)/*-{ var CHUNK_SIZE = 0x8000; //arbitrary number var index = 0; var length = u8Arr.length; var result = ''; var slice; while (index < length) { slice = u8Arr.subarray(index, Math.min(index + CHUNK_SIZE, length)); result += String.fromCharCode.apply(null, slice); index += CHUNK_SIZE; } return btoa(result); }-*/; }