2014-06-13 41 views
0

我試圖從BASE64這樣對其進行解碼後上傳在Amazon S3上的圖像:JavaScript的上載圖像從基對其進行解碼後64

var data = url.replace(/^data:image\/\w+;base64,/,""); 
         var decodedData = window.atob(data); 

         var params = { 
          Key : 'phonegap/' + i, 
          Body : decodedData, 
          ContentType : 'image/jpeg', 
          ACL : 'public-read', 
          StorageClass : 'REDUCED_REDUNDANCY', 
         }; 

         bucket.putObject(params, function(err, data) { 
          //some code 
         }); 

代碼工作正常,並且圖像上傳到s3中所需的桶中。但是我覺得圖像在這個圖像處理之間被破壞了。但是我檢查了Base64字符串,它看起來很好,因爲我上傳了上的base64字符串,它給了我相同的圖像。另外,我再次編碼的decodedData這樣的:

var encodedData=window.btoa(decodedData); 

,我用這個base64編碼字符串,它是完全一樣的,就如我再次檢查它askapache轉換器相同。但是,仍然在s3上傳的圖像對我來說似乎是腐敗的,因爲我無法查看它。請幫忙。

回答

0

我想出了究竟是什麼問題。問題是我使用phonegap api,它使用ISO-8859-1字符集生成base64代碼,當我使用atob()方法解碼它時,默認情況下它使用utf-8字符集,因此在此過程中圖像受損作爲兩個字符集是不同的,所以我跟着這個鏈接​​和使用從有這些方法的代碼:

function base64DecToArr (sBase64, nBlocksSize) { 

    var 
    sB64Enc = sBase64.replace(/[^A-Za-z0-9\+\/]/g, ""), nInLen = sB64Enc.length, 
    nOutLen = nBlocksSize ? Math.ceil((nInLen * 3 + 1 >> 2)/nBlocksSize) * nBlocksSize : nInLen * 3 + 1 >> 2, taBytes = new Uint8Array(nOutLen); 

    for (var nMod3, nMod4, nUint24 = 0, nOutIdx = 0, nInIdx = 0; nInIdx < nInLen; nInIdx++) { 
    nMod4 = nInIdx & 3; 
    nUint24 |= b64ToUint6(sB64Enc.charCodeAt(nInIdx)) << 18 - 6 * nMod4; 
    if (nMod4 === 3 || nInLen - nInIdx === 1) { 
     for (nMod3 = 0; nMod3 < 3 && nOutIdx < nOutLen; nMod3++, nOutIdx++) { 
     taBytes[nOutIdx] = nUint24 >>> (16 >>> nMod3 & 24) & 255; 
     } 
     nUint24 = 0; 

    } 
    } 

    return taBytes; 
} 


function b64ToUint6 (nChr) { 

    return nChr > 64 && nChr < 91 ? 
     nChr - 65 
    : nChr > 96 && nChr < 123 ? 
     nChr - 71 
    : nChr > 47 && nChr < 58 ? 
     nChr + 4 
    : nChr === 43 ? 
     62 
    : nChr === 47 ? 
     63 
    : 
     0; 

} 

,並在身體的params變量叫base64DecToArr(data,'1')屬性是這樣的:

var params = { 
          Key : 'phonegap/' + i, 
          Body : base64DecToArr(data,'1'), 
          ContentType : 'image/jpeg', 
          ACL : 'public-read', 
          StorageClass : 'REDUCED_REDUNDANCY', 
         }; 

並移除了atob()方法來解碼data。希望這可以幫助某人。

相關問題