在应用开发中,经常需要下载文件(如导出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, "