ajax发送请求不能下载文件,浏览器输出乱码及解决方式

7 篇文章 0 订阅

最近做导出excel文件,怎么写下载的时候都是在浏览器输出的码,然后就想到是不是ajax请求不能直接请求下载文件,果然是这样。

ajax不能请求下载文件的原因:

因为response原因,一般请求浏览器是会处理服务器输出的response,例如生成图片、文件下载等,然而ajax
只是个“字符型”的请求,即请求的内容是以文本类型存放的。文件的下载是以二进制形式进行的,虽然可以读取到
返回的response,但只是读取而已,是无法执行的,ajax的返回值类型是json,text,html,xml类型,或者可以说ajax的接收类型只能是string字符串,不是流类型,所以无法实现文件下载,说白点就是js无法调用浏览器的下载处理机制和程序

解决方式:

第一种:window.location.href

使用window.location.href = path+ '/export/exportData?param='+$("#upDataHidden").val();
但是因为我传到后台的值包含json型数据,用这种方式json型数据如果不做处理拼接会有问题,所以没用

第二种:和第一种大同小异,用这种是为了把数据传递到后台,先用ajax把数据传到后台,然后后台生成excel文件存在相应路径下,将该路径返回到前台,再用window.location.href下载

$.ajax({
    		 url: requestPath + '/export/exportData',
    		 params : {
    			"param":$("#upDataHidden").val()
    		 },
    		 success: function(response) {
    			var path = response.getParameter("path");
    			path = path.replace(/\\/g,".,");
    			window.location.href = $$pageContextPath + '/export/download?path='+path;
    	        setTimeout(function() {   //下载成功后删除在改路径下生成的临时文件
    	                vm.delTempFile(path);
    	         }, 3000)
    		}
})

第三种:使用form表单(个人认为最完美的方式,不需要转存,也不会受传递数据的影响)

前台代码:
var form = $("<form>");
form.attr("style","display:none");
form.attr("target","");
form.attr("method","post");
form.attr("action",$$pageContextPath + '/export/exportData');
var inputText = $("<input>");
inputText.attr("type","hidden");
inputText.attr("name","param");
inputText.attr("value",$("#upDataHidden").val());
$("body").append(form);
form.append(inputText);
form.submit();
form.remove();

-------------------------------------------------------------------------------------------


后台在生成excel文件后,可以直接:
HSSFWorkbook wb = new HSSFWorkbook();
。。。。。。。。。。。//此处省略处理excel内容
OutputStream os = response.getOutputStream();// 取得输出流
response.setContentType("application/vnd.ms-excel");
response.setHeader("content-disposition", "attachment; filename=" + new String(fileName.getBytes("GBK"), "ISO-8859-1") + ".xlsx");
System.setProperty("org.apache.poi.util.POILogger", "org.apache.poi.util.POILogger");
wb.write(os);
os.flush();
os.close();

 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值