👨🎓作者:bug菌 ✏️博客:CSDN、掘金等 💌公众号:猿圈奇妙屋 🚫特别声明:原创不易,转载请附上原文出处链接和本文声明,谢谢配合。 🙏版权声明:文章里可能部分文字或者图片来源于互联网或者百度百科,如有侵权请联系bug菌处理。
一、概述🔥
接下来的这几期,bug菌想跟大家分享一下自己昨天刚接到一个临时的需求,热乎着呢,想分享一下自己是如何面对临时需求并制定整个开发周期,其中包括从梳理业务到创建业务表再到实现业务逻辑形成闭环再到与前端对接,其中会穿插一些业务拓展及功能性拓展,这一条龙流程在线与大家一起见证,分享给刚入门的小伙伴,希望对你们有所帮助。
环境说明:idea2019.3 + springboot2.3.1.REALSE + mybati-plus3.2.0 + mysql5.6 + jdk1.8
二、正文🔥
时光荏苒,本模块开发任务也即将接近尾声。带着大家做了将近快20期的模块全业务开发,不知道你们收获大不大,反正对于自己,我是察觉到了自己还有很多知识点掌握的不够熟练,需要好好恶补呀,路还很长,咱们一起努力。
对于这期,我要带着大家手把手教学,如何实现excel模板文件如何从服务器中下载到本地?就对于这么个业务场景,想必大家并不陌生,那么来吧,八仙过海各显神通。看看大家都对此有何不同的实现方法。
那么,请大家都放马过来吧。
三、如何代码实现excel模板下载🔥
1️⃣定义Controller请求
既然确定了业务场景为下载excel模板,也就是从服务器下载资源,那好吧,还是老样子,先确定请求格式。比如请求入参,返回参类型,请求路径等。
具体请求定义如下:
/**
* 问题反馈excel模板下载
*/
@GetMapping("/download-model")
@ApiOperation(value = "问题反馈excel模板下载", notes = "问题反馈excel模板下载")
public void download()
2️⃣定义接口方法downLoad()
由于没有返回值,所以直接void即可。
/**
* excel模板下载
*/
void download();
3️⃣实现downLoad()方法
我是将该template路径配置于yaml配置文件中了,也方便日后测试环境、正式环境修改其保存路径即可。
//获取template绝对路径
@Value("${review.file.template}")
private String templatePath;
/**
* excel模板下载
*/
@Override
public void download() {
//绝对目录地址
String target = templatePath + "问题反馈导入模板.xlsx";
uploader.downloadExcel(target);
}
由于我是直接放在了当前本地项目的template文件夹下,你们也可以随意指定路径。我为了给大家演示,我就指定了本地excel的存放路径了。
给大家看一眼我演示项目excel模板存放位置:仅供参考。
具体excel下载核心代码实现如下:
/**
* excel下载
*/
public void downloadExcel(String targetPath) {
FileInputStream inputStream = null;
HttpServletResponse response = SpringServletContextUtils.getResponse();
try {
//设置文件头,最后一个参数是设置下载文件名
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(FilenameUtils.getName(targetPath), StandardCharsets.UTF_8.name()));
File file = new File(targetPath);
inputStream = new FileInputStream(file);
OutputStream outputStream = response.getOutputStream();
IOUtils.copyLarge(inputStream, outputStream);
outputStream.flush();
} catch (IOException e) {
log.error(e.getMessage(), e);
} finally {
//关流
而且我注意到如果用浏览器请求,肯定是无法设置请求头的,所以我将该接口加到了我的common模块中,该模块有做白名单免token鉴权处理,在其模块下的所有接口都不会被token登录鉴权器所拦截,所以对于我接口模板导出测试就非常方便了。因为我注意到如果通过postman测试导出,下载到本地会是一个.zip的文件,所以暂时放弃了用postman做测试工具。
如下我是直接选择用浏览器进行接口请求测试。直接访问浏览器输入请求地址即可。
接着我们来debug一下,看看我们所传入的target目标路径是否正确且存在?
如下截图我确定是真实存在且确定是excel模板存放位置。你们也要检查一下,路径有问题也肯定不会实现文件下载成功的。
去掉断点,直接运行结束,可以看下,浏览器直接弹出下载,我检查了下,虽文件内容格式等都是对的,但是其文件名乱码,这肯定不行。到底是啥原因导致?那又该如何解决呢?
分析问题得出,对于中文读取的时候不给编码,它可能就用别的编码(不一定适合中文),就会导致中文乱码。所以想读取中文,你就得写明编码格式。
所以给出的解决方案就是在对设置写入excel文件名时,明确编码格式。如何指定呢?这就用到了这个函数:URLEncoder.encode(String s, String enc),该方法能将使用指定的编码机制将字符串转换为 application/x-www-form-urlencoded 格式,其格式也
是浏览器默认的编码格式。那在上述代码中,你只需要这么改就行。
具体修改代码如下:
// response.setHeader("Content-Disposition", "attachment;fileName=" + FilenameUtils.getName(targetPath));
response.setHeader("Content-Disposition", "attachment;filename="
4️⃣接口测试
指定编码后我们重启项目,我们再来试一下。经测试,导出的文件名是中文展示了。我们再来检查一下导出的excel文件内容是否也存在乱码问题?经检查一切正常。
说明上述代码已ok!可供业务使用。也供小伙伴们一键copy。
附上,postman测试导出功能,却文件名依旧乱码!
大家请看:
我是选择该【Send and Download】选项,一般是用于对接口有文件下载导出功能所用。
我选择保存到本地桌面后,打开文件,内容格式都没问题,但是就是文件名乱码了。
至于这个问题,我暂时没有想到好的解决方案,这儿先放着,等我想到了解决方案再来修复这一块的bug。你们就暂时按浏览器的方式进行文件下载测试导出就好了。
5️⃣总结
对于越简单的逻辑接口而言,我们都要百分百用心写。