2016-04-29 80 views
-1

在我的JavaScript我有一個base64編碼的pkcs12對象,我想提供作爲下載鏈接。要下載的Pkcs12(pfx)文件是二進制數據。createObjectUrl二進制數據失敗

所以我解碼的對象,並試圖從它創建的ObjectURL:

var bin = atob(pkcs12); 
var blob = new Blob([bin], 
     { type : 'application/x-pkcs12' }); 
$scope.pkcs12Blob = (window.URL || window.webkitURL).createObjectURL(blob); 

的問題是,下載的文件比原始二進制數據更大,沒有被識別爲PKCS12。它看起來好像一些utf-8/unicode的東西被引入到文件中。

如果我將原始base64編碼數據提供給createObjectURL並下載base64編碼文件,我可以解碼下載的文件並獲取有效的p12文件。

所以我想知道:createObjectURL如何工作的二進制數據?

+0

我發現這一點,這完美地工作:http://stackoverflow.com/questions/16245767/creating-a-blob-from-a-base64-string-in-javascript – cornelinux

+0

如果你已經想通了,你可以回答你自己的問題http://stackoverflow.com/help/self-answer – Lesley

回答

0

由於某些原因,createObjectURL不接受二進制字符串,但需要一個字節數組。此代碼工作就像一個魅力:

var bytechars = atob($scope.enrolledToken.pkcs12); 
var byteNumbers = new Array(bytechars.length); 
for (var i = 0; i < bytechars.length; i++) { 
    byteNumbers[i] = bytechars.charCodeAt(i); 
} 
var byteArray = new Uint8Array(byteNumbers); 
var blob = new Blob([byteArray], {type: 'application/x-pkcs12'}); 
$scope.pkcs12Blob = (window.URL || window.webkitURL).createObjectURL(blob);