java思路是什么(java新手代码大全)

今天在一个群里扯了半天的给一个初入职场的新手解释文件下载的问题,在此来所以下。

文件下载有两种方式:

静态文件下载

静态文件直接下载,设置下响应头即可。

//请求路径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文件,因此这个文件名需要固定写死。

派优网部分新闻资讯、展示的图片素材等内容均为用户自发上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习交流。用户通过本站上传、发布任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们一经核实,立即删除。并对发布账号进行封禁。
(0)
发布专员的头像发布专员

相关推荐

返回顶部