本代码基于Vue项目(此处暂不做深入,仅对文件流下载做一个记录)
- HTML部分
<div><el-button @click="download">下载</el-button><div>
- javascript部分
download() { let _this = this; let fileName = `单位客户导入模板_${new Date().getTime()}.xlsx`; axios({ method: 'POST', url: `/download/${new Date().getTime()}`, data: {}, responseType: 'blob' }).then(response => { if (!response) { return } _this.$message({ type:'info', showClose:true, duration:3000, message:`已成功下载文件!${fileName}` }); const blob = new Blob([response.data]) debugger; if (window.navigator && window.navigator.msSaveOrOpenBlob) { navigator.msSaveBlob(blob, fileName) } else { let u = window.URL.createObjectURL(response.data) let aLink = document.createElement('a') aLink.style.display = 'none' aLink.href = u aLink.setAttribute('download', fileName) document.body.appendChild(aLink) aLink.click() document.body.removeChild(aLink) window.URL.revokeObjectURL(u) } }).catch(error=> { _this.$message({ type:'error', showClose:true, duration:3000, message:'请求失败! error:'+error }); }); }
- 后台Java代码
import org.springframework.core.io.ClassPathResource; import org.springframework.http.ResponseEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; /** * 单位客户Excel文件模板下载 * 获取模板文件的字节流,返回到前端页面,前端页面对字节流进行封装处理并执行下载操作 * @param time 时间戳 * @return blob * @throws IOException */ @RequestMapping(value="/download/{time}",method={RequestMethod.POST}) public @ResponseBody ResponseEntity<byte[]> download(@PathVariable("time")String time) throws IOException { // 注此处必须使用 ClassPathResource工具类获取文件,避免在打包为jar文件部署时,找不到文件路径的问题 ClassPathResource resource = new ClassPathResource("file/temp.xlsx"); String fileName = "temp_"+time; ResponseEntity<byte[]> responseEntity = buildResponseEntity(resource.getInputStream(), fileName); return responseEntity; } /** * 文件下载 * @param inputStream 传入文件流 * @param fileName 文件名 * @return 文件字节数据 * @throws IOException */ private ResponseEntity<byte[]> buildResponseEntity(InputStream inputStream, String fileName) throws IOException { //获取文件流 byte[] body = new byte[inputStream.available()]; inputStream.read(body); HttpHeaders headers = new HttpHeaders(); //设置文件类型 headers.add("Content-Disposition", "attchement;filename=" + fileName); //设置Http状态码 HttpStatus statusCode = HttpStatus.OK; //返回数据 ResponseEntity<byte[]> entity = new ResponseEntity<byte[]>(body, headers, statusCode); return entity; }