今天在一个群里扯了半天的给一个初入职场的新手解释文件下载的问题,在此来总结下。
文件下载有两种方式:
静态文件直接下载,设置下响应头即可。
//请求路径dowload@requestmapping("dowload") public void download(httprvletrespon rep,string路边鼓掌的人 filename){ //设置响应头的content-disposition属性为attachment(附件) rep.theader("content-disposition","attachment;filename="+filename);}
需要在下载的业务代码里面动态生成文件对象,然后将文件对象输出到网络输出流中。
比如创建一个xls文件并下载,使用的是easyexcel:
先封装一个私有的方法,将list数据封装在excelwriter对象中,写出到网络输出流中。
private void createxls(list<contract> list, rvletoutputstream os) throws ioexception{ excelwriter writer = new excelwriter(os, exceltypeenum.xlsx); sheet sheet1 = new sheet(1, 0); sheet1.tsheetname("合同列表"); list<list<string>> data = new arraylist<>(); list.foreach(l -> { list<string> item = new arraylist<>(); optional<string> contractname= optional.ofnullable(l.getcontractname()); item.add(contractname.orel("")); data.add(item); }); list<list<string>> head = new arraylist<list<string>>(); list<string> headcoulumn1 = new arraylist<string>(); headco苹果怎么设置动态壁纸ulumn1.add("合同名称"); head.add(headcoulumn1); table table = new table(1); table.thead(head); writer.write0(data, sheet1, table); writer.finish();}
调用方法
public void getxls(string name, string from, string to, httprvletrespon respon){ if ( "".equals(from)) { from = "2020-01-01"; } if ( "".equals(to)) { to = localdate.now().tostring(); } li一起来跳舞吧st<contract> list = contractmapper.lectcontractlist(wrappers.<contract>lambdaquery().like(contract::getcontractname, name) .between(contract::getcreatedate, locald自我约束力ate.par(from), localdate.par(to)).orderbydesc(contract::getcreatedate)); string xlsname = from + "至" +to + "-合同列表"; try { respon.ret(); // 重点突出 respon.tcharacterencoding("utf-8"); // 重点突出 respon.tcontenttype("application/x-msdownload"); // 不同类型的文件对应不同的mime类型 // 重点突出 // 对文件名进行编码处理中文问题 xlsname = new string((xlsname + ".xlsx").getbytes("gb2312"), "iso-8859-1"); // inline在浏览器中直接显示,不提示用户下载,默认 // attachment弹出对话框,提示用户进行下载保存本地 respon.theader("content-disposition", "attachment;filename=" + xlsname); // 通过respon流输出,直接输出到客户端浏览器中。 rvletoutputstream os = respon.getoutputstream(); createxls(list,os); os.flush(); 籍何以至此翻译 os.clo(); } catch (ioexception e) { e.printstacktrace(); } }
另外:
静态文件下载需要服务端保存有下载名称的的磁盘文件,必须是真实存在的,文件的生成、删除需要手动处理。
而动态文件下载我们直接将文件对象流写入到网络输出流中,不必保存文件对象到磁盘中,它存在于内存中,会自动被回收处理。
文件的下载不论是动态还是静态都需要传入服务端一定的参数,参数获取我们通常采用get方式传参(url传参)。
群里扯了半天的需要是这样的:管理员端生成一个特定条件的xls文件供多用户下载。
1.管理员端生成文件的操作是这样的,选择生成条件,post传递给服务端生成xls文件,在保存前先查询当前是否有此文件存在,如果有则删除后再保存。
2.用户端点击的是一个xxx.xx/getxls?filename=xxx的链接,获取的就是服务端保存的那个最新的文件。
每当管理员端重新设置条件生成xls文件后,用户端获取的都是最新的xls文件,因此这个文件名需要固定写死。
本文发布于:2023-04-05 03:08:52,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/fbb986750e5da113a7dbe100d786c662.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:java思路是什么(java新手代码大全).doc
本文 PDF 下载地址:java思路是什么(java新手代码大全).pdf
留言与评论(共有 0 条评论) |