post方式下载文件有很多种方法,其中blob对象方法不兼容ie9,所以我选择iframe+form post方法,可以解决兼容性问题
var url = serverConfig.product.productListExport;
var options = {
url: url,
data: {
json: JSON.stringify(params)
}
};
var config = $.extend(true, { method: 'post' }, options);
var $iframe = $('<iframe id="down-file-iframe" />');
var $form = $('<form target="down-file-iframe" method="' + config.method + '" />');
$form.attr('action', config.url);
for (var key in config.data) {
$form.append("<input type='hidden' name='" + key + "' value='" + config.data[key] + "' />");
}
$iframe.append($form);
$(document.body).append($iframe);
$form[0].submit();
$iframe.remove();
测试后发现,以上写法不支持Firefox和Safari,然后发现不用iframe就都好使了,直接post默认会阻塞页面,但是实际测试并没有发现什么问题,最终写法如下:
var vm = this.vm;
var url = serverConfig.product.productListExport;
var params = utils.deepCopy({}, vm.productParam);
var options = {
url: url,
data: {
json: JSON.stringify(params)
}
};
var config = $.extend(true, { method: 'post' }, options);
var $form = $('<form target="down-file-iframe" method="' + config.method + '" />');
$form.attr('action', config.url);
$.each(config.data, function (key, value) {
var $input = $('<input type="hidden"/>').attr({
'name': key,
'value': value
});
$form.append($input)
});
$(document.body).append($form[0]);
$form[0].submit();