用js下载一个从php生成的存折


Download with js a passbook generated from php

我需要下载一个PHP脚本创建的存折文件在js (angular应用程序)我试图使用这个库http://danml.com/download.html

我在服务器端使用这个代码:

header('Pragma: no-cache');
header('Content-type: application/vnd.apple.pkpass');
header('Content-Disposition: attachment; filename="card.pkpass"');
echo base64_encode($this->pass_outputfile);

在客户端:

var filename = responseInfo.headers["content-disposition"].indexOf("filename=");
filename = responseInfo.headers["content-disposition"].substring(filename+9);
var mime = responseInfo.headers["content-type"];
download(window.atob(response), filename.replace(/'"/g,''), mime);

下载开始正常,但pkpass文件无效…似乎文件被压缩了2次…谁能告诉我为什么?

好了,我终于得到它解码base64作为一个blob与这个函数,

function base64toBlob(base64Data, contentType) {
    contentType = contentType || '';
    var sliceSize = 1024;
    var byteCharacters = atob(base64Data);
    var bytesLength = byteCharacters.length;
    var slicesCount = Math.ceil(bytesLength / sliceSize);
    var byteArrays = new Array(slicesCount);
    for (var sliceIndex = 0; sliceIndex < slicesCount; ++sliceIndex) {
        var begin = sliceIndex * sliceSize;
        var end = Math.min(begin + sliceSize, bytesLength);
        var bytes = new Array(end - begin);
        for (var offset = begin, i = 0 ; offset < end; ++i, ++offset) {
            bytes[i] = byteCharacters[offset].charCodeAt(0);
        }
        byteArrays[sliceIndex] = new Uint8Array(bytes);
    }
    return new Blob(byteArrays, { type: contentType });
}

然后直接使用下载函数

download(base64toBlob(response,"application/vnd.apple.pkpass"), filename.replace(/'"/g,''), mime);