ajaxfiledownload java_Ajax方式文件下载(后台返回为json或文件流)

本文介绍了两种在Java应用中通过Ajax进行文件下载的方法,特别是在Spring环境下。方法一是通过Ajax响应头区分文本和流,利用Blob处理返回数据;方法二是通过两个接口,先生成文件再下载。文章提供了详细的后台Java代码示例和前台JQuery处理方法,强调了防止SQL注入的安全措施。
摘要由CSDN通过智能技术生成

在应用开发中,经常需要下载文件(如导出Excel),调用后台接口时,如果后台报错需要弹出错误信息,如果没有报错正常下载文件。本文主要介绍前台及后台(基于java)的处理方法,文中使用到的软件版本:Spring 4.3.9、Java 1.8.0_191、Jquery 1.12.4、Chrome 85.0.4183.121。

1、实现思路

方法一:通过原生Ajax响应头来区分是文本还是流,然后通过blob来处理返回数据

方法二:分成两个接口,先调用生成文件的接口,如果文件成功生成则再调用文件下载的接口;如果文件生成失败则弹出失败信息

2、方法一(Ajax响应头区分文本还是流)

2.1、后台

/*** 根据sql导成csv;成功返回文件流,失败返回错误信息

*@paramsql 导出sql

*@paramcol 字段信息,以逗号分隔

*@paramtitle 文件头信息,以逗号分隔

*@paramseparator csv文件的分隔符*@paramrequest

*@paramresponse*/@RequestMapping("exportForCsv.do")

@ResponseBodypublic CallResultexportForCsv(String sql, String col, String title, String separator, String fileName, HttpServletRequest request, HttpServletResponse response) {

logger.info("sql={}", sql);

logger.info("title={}", title);

logger.info("separator={}", separator);

logger.info("fileName={}", fileName);

logger.info("baseServiceName={}", baseServiceName);

CallResult result = null;

ByteArrayOutputStream baos= null;

InputStream in= null;try{if(Util.isNull(separator)) {

separator= ",";

}if(Util.isNull(fileName)) {

fileName= "data.csv";

}

baos= newByteArrayOutputStream();getService().exportForCsv(baos, sql, col, title, separator);//这边调用service把文件写入输入流,请自行实现

in= newByteArrayInputStream(baos.toByteArray());

writeStream(in, fileName, request, response);

}catch(Exception e) {

result= new CallResult<>(-1, "发生异常");

e.printStackTrace();

}finally{

FileUtil.close(baos);

FileUtil.close(in);

}returnresult;

}private void writeStream(InputStream in, String fileName, HttpServletRequest request, HttpServletResponse response) throwsIOException {

OutputStream out= null;try{

String urlFileName= "";if (request.getHeader("User-Agent").toLowerCase().indexOf("firefox") > 0) {

urlFileName= new String(fileName.getBytes("UTF-8"), "ISO8859-1");

}else{

urlFileName= java.net.URLEncoder.encode(fileName, "

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值