网站首页 > 精选教程 正文
今天在一个群里扯了半天的给一个初入职场的新手解释文件下载的问题,在此来总结下。
文件下载有两种方式:
静态文件下载
静态文件直接下载,设置下响应头即可。
//请求路径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文件,因此这个文件名需要固定写死。
猜你喜欢
- 2024-11-01 electron 实现文件下载管理器 electron download
- 2024-11-01 Java客户端操作FastDFS实现文件上传下载替换删除
- 2024-11-01 JAVA实现大文件的分片上传与下载(SPRINGBOOT+VUE3
- 2024-11-01 Java,操作HDFS文件系统,文件的上传、下载和删除完成,代码案例
- 2024-11-01 java 多文件下载(不打包) java多个文件打包到zip包
- 2024-11-01 Java SFTP 上传、下载等操作 java ftp文件上传
- 2024-11-01 JAVA大文件(百M以上)的上传下载思路
- 2024-11-01 Java:实现文件批量导入导出实践(兼容xls,xlsx)
- 2024-11-01 Java 实现 FastDFS 实现文件的上传、下载、删除
- 2024-11-01 JAVA如何做大体积的文件上传和下载
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)