【问题标题】:Download with js a passbook generated from php用js下载php生成的存折
【发布时间】:2015-09-18 15:29:12
【问题描述】:

我需要下载一个用 js(角度应用程序)中的 php 脚本创建的存折文件,我试图使用这个库 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 次...有人可以告诉我为什么吗?

【问题讨论】:

    标签: javascript php angularjs passbook


    【解决方案1】:

    好吧,我终于用这个函数将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-&gt;pass_outputfile); 而不是回显 base64 流应该是你所需要的。
    • 好的,但我需要从 js 下载它作为 http 响应而不在下载之前保存文件.... pass_outputfile 不是文件路径
    • 您可以暂时将其写入磁盘并读回,但如果上述方法适合您并且您不需要扩展到每秒数百次传递,那么您应该可以这样做在记忆中。
    猜你喜欢
    • 1970-01-01
    • 2015-11-15
    • 1970-01-01
    • 2020-09-11
    • 1970-01-01
    • 2015-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多