对不起,在这篇文章中缺少链接:这是我在stackoverflow上的第一篇文章,正如错误消息所说,“[我]需要至少10个声望才能发布2个以上的链接。”
下载PDF(或任何二进制文件),你可以使用xhr.responseType = "arraybuffer"来获取原始内容(警告:这不会在IE 6-9的工作,更对下文)。你不能使用jQuery来做到这一点(但请参阅github.com/jquery/jquery/pull/1525),但是原始xhr查询或处理二进制数据的任何ajax库都可以使用。例如jszip-utils在github.com/Stuk/jszip-utils(免责声明:我是该库的贡献者)。
下面是代码:
此功能使用JSZipUtils,结果包装成能够返回一个ArrayBuffer或Uint8Array将工作jQuery.Deferred但任何图书馆。
/**
* Fetch the content, add it to the JSZip object
* and use a jQuery deferred to hold the result.
* @param {String} url the url of the content to fetch.
* @param {String} filename the filename to use in the JSZip object.
* @param {JSZip} zip the JSZip instance.
* @return {jQuery.Deferred} the deferred containing the data.
*/
function deferredAddZip(url, filename, zip) {
var deferred = $.Deferred();
JSZipUtils.getBinaryContent(url, function (err, data) {
if(err) {
deferred.reject(err);
} else {
zip.file(filename, data, {binary:true});
deferred.resolve(data);
}
});
return deferred;
}
这是主要的功能,它采用FileSaver.js为saveAs一个填充工具:
var $form = $("#download_form").on("submit", function() {
var zip = new JSZip();
var deferreds = [];
// find every checked item
$(this).find(":checked").each(function() {
var url = $(this).data("url");
var filename = url.replace(/.*\//g, "");
deferreds.push(deferredAddZip(url, filename, zip));
});
// when everything has been downloaded, we can trigger the dl
$.when.apply($, deferreds).done(function() {
var blob = zip.generate({type:"blob"});
// see FileSaver.js
saveAs(blob, "example.zip");
}).fail(function (err) {
// handle the error here
});
return false;
});
注意对IE 6-9:jszip和jszip-utils的支持IE 6-9,但没有ArrayBuffer/Uint8Array,你会得到糟糕的表演。