Мне нужно загрузить файл сберегательной книжки, созданный с помощью php-скрипта в js (угловое приложение) im, пытающегося использовать этот lib http://danml.com/download.html
im используя этот код на стороне сервера:
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);
readfile($this->pass_outputfile);
вместо того, чтобы выводить поток base64, все, что вам нужно.