今天在一个群里扯了半天的给一个初入职场的新手解释文件下载的问题,在此来总结下。
文件下载有两种方式:
静态文件直接下载,设置下响应头即可。
//请求路径dowload@RequestMapping("dowload") public void download(HttpServletResponse rep,String filename){ //设置响应头的Content-Disposition属性为attachment(附件) rep.setHeader("Content-Disposition","attachment;filename="+filename);}
需要在下载的业务代码里面动态生成文件对象,然后将文件对象输出到网络输出流中。
比如创建一个xls文件并下载,使用的是easyexcel:
先封装一个私有的方法,将list数据封装在ExcelWriter对象中,写出到网络输出流中。
private void createXls(List<Contract> list, ServletOutputStream os) throws IOException{ ExcelWriter writer = new ExcelWriter(os, ExcelTypeEnum.XLSX); Sheet sheet1 = new Sheet(1, 0); sheet1.setSheetName("合同列表"); List<List<String>> data = new ArrayList<>(); list.forEach(l -> { List<String> item = new ArrayList<>(); Optional<String> contractName= Optional.ofNullable(l.getContractName()); item.add(contractName.orElse("")); data.add(item); }); List<List<String>> head = new ArrayList<List<String>>(); List<String> headCoulumn1 = new ArrayList<String>(); headCoulumn1.add("合同名称"); head.add(headCoulumn1); Table table = new Table(1); table.setHead(head); writer.write0(data, sheet1, table); writer.finish();}
调用方法
public void getxls(String name, String from, String to, HttpServletResponse response){ if ( "".equals(from)) { from = "2020-01-01"; } if ( "".equals(to)) { to = LocalDate.now().toString(); } List<Contract> list = contractMapper.selectContractList(Wrappers.<Contract>lambdaQuery().like(Contract::getContractName, name) .between(Contract::getCreateDate, LocalDate.parse(from), LocalDate.parse(to)).orderByDesc(Contract::getCreateDate)); String xlsName = from + "至" +to + "-合同列表"; try { response.reset(); // 重点突出 response.setCharacterEncoding("UTF-8"); // 重点突出 response.setContentType("application/x-msdownload"); // 不同类型的文件对应不同的MIME类型 // 重点突出 // 对文件名进行编码处理中文问题 xlsName = new String((xlsName + ".xlsx").getBytes("GB2312"), "ISO-8859-1"); // inline在浏览器中直接显示,不提示用户下载,默认 // attachment弹出对话框,提示用户进行下载保存本地 response.setHeader("Content-Disposition", "attachment;filename=" + xlsName); // 通过response流输出,直接输出到客户端浏览器中。 ServletOutputStream os = response.getOutputStream(); createXls(list,os); os.flush(); os.close(); } catch (IOException e) { e.printStackTrace(); } }
另外:
静态文件下载需要服务端保存有下载名称的的磁盘文件,必须是真实存在的,文件的生成、删除需要手动处理。
而动态文件下载我们直接将文件对象流写入到网络输出流中,不必保存文件对象到磁盘中,它存在于内存中,会自动被回收处理。
文件的下载不论是动态还是静态都需要传入服务端一定的参数,参数获取我们通常采用get方式传参(URL传参)。
群里扯了半天的需要是这样的:管理员端生成一个特定条件的xls文件供多用户下载。
1.管理员端生成文件的操作是这样的,选择生成条件,post传递给服务端生成xls文件,在保存前先查询当前是否有此文件存在,如果有则删除后再保存。
2.用户端点击的是一个xxx.xx/getxls?filename=xxx的链接,获取的就是服务端保存的那个最新的文件。
每当管理员端重新设置条件生成xls文件后,用户端获取的都是最新的xls文件,因此这个文件名需要固定写死。
ps:【项目】淘宝项目邀请用户即可获取收益
ps:【活动】支付宝大额红包点击扫码领取
ps:【本站主题】自适应资讯类的网站主题
政策性银行(政策性银行是什么意思)
国有银行分为国有商业银行和国有政策性银行,蓝胖上篇介绍了国有商业银行的情况,本篇主要介绍国有政策性银行,侧重工作情况、收入待遇等方面,供各位小伙伴参考。在我国,主要有三家政策性银行,分别为国家开发银行(0)人阅读时间:2024-01-24抖音直播有回放记录吗(抖音直播有回放记录吗怎么删除)
继接二连三的电商政策后,抖音再发“连环招”——一口气发布6个新功能1. 直播回放功能2. 抖音PC端3. 抖音横屏功能4. 带货榜与小时榜并列5. 新增抖音云游戏功能6. 限时可见其中,内测中的【直播(0)人阅读时间:2024-01-24穷人没本钱怎么创业 农村创业的好项目
如今都愿意去拿点钱做生意,虽然生意苦点累点,但是好在比较自由,赚钱也赚的比较开心,但是目前生意并不好做,因为市场竞争太激烈了,所以选择项目之前最好要考虑清楚,这里推荐几个靠谱创业项目。1、婴幼儿用品我(0)人阅读时间:2024-01-24涉水险包含在车损险里面吗(车险必买的哪几种险)
今年雨水比往年都要多,七月份的一场大雨把我们新买的雷凌给泡了。我和老公出门,一坐上车我俩说咋这湿啊!仔细一看,我天! 车里面都湿了,车门那块还在滋滋往车里冒水渣。我俩傻了吧唧还不知道咋回事呢,后来才知(0)人阅读时间:2024-01-24java新手代码大全 小程序开发一个多少钱啊
今天在一个群里扯了半天的给一个初入职场的新手解释文件下载的问题,在此来总结下。文件下载有两种方式:静态文件下载静态文件直接下载,设置下响应头即可。//请求路径dowload@RequestMappin..2024-01-24菠萝蜜放多久才会熟 菠萝菠萝蜜放多久会熟
最佳答案1、把苹果和菠萝蜜放一起进行催熟,能够加快菠萝蜜的成熟速度,通常3天左右就能够使菠萝蜜成熟。2、将没成熟的菠萝蜜放在阳光底下晒一天,之后放入纸箱,2天后即可成熟。3、常温下自身催熟需要4天左右。..2024-01-24政策性银行(政策性银行是什么意思)
国有银行分为国有商业银行和国有政策性银行,蓝胖上篇介绍了国有商业银行的情况,本篇主要介绍国有政策性银行,侧重工作情况、收入待遇等方面,供各位小伙伴参考。在我国,主要有三家政策性银行,分别为国家开发银行..2024-01-24抖音直播有回放记录吗(抖音直播有回放记录吗怎么删除)
继接二连三的电商政策后,抖音再发“连环招”——一口气发布6个新功能1. 直播回放功能2. 抖音PC端3. 抖音横屏功能4. 带货榜与小时榜并列5. 新增抖音云游戏功能6. 限时可见其中,内测中的【直播..2024-01-24