二进制数据的createObjectUrl失败

createObjectUrl for binary data fails

本文关键字:失败 createObjectUrl 数据 二进制      更新时间:2023-09-26

在我的javascript中,我有一个base64编码的pkcs12对象,我想将其作为下载链接提供。要下载的Pkcs12(pfx)文件是二进制数据。

所以我解码了这个对象,并试图从中创建一个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是如何为二进制数据工作的?

由于某些原因,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 );