Java实现批量下载选中文件功能
作者:秋分中的雨 发布时间:2021-09-09 17:57:45
标签:java,下载文件
1.在action中定义变量
private List<String> downLoadPaths = new ArrayList<String>();//存储选中文件的下载地址
private OutputStream res;
private ZipOutputStream zos;
private String outPath;
private String lessionIdStr;// 选中文件ID拼接的字符串
private String fileName; //浏览器下载弹出框中显示的文件名
分别给出get和set方法
2. 主方法
/**
* 下载多个文件:压缩成zip
*
* @return
* @throws Exception
*/
public String downLoadLessionsZip() {
downLoadPaths.clear();
String firstFileName = "";// 第一个文件的文件名
List<DownLoadFileVo> fileVos = new LinkedList<DownLoadFileVo>();
if (StringUtils.isNotEmpty(lessionIdStr)) {
int end = lessionIdStr.lastIndexOf(",");
if (end > 0) {
if (end == lessionIdStr.length() - 1) {
lessionIdStr = lessionIdStr.substring(0, end);
}
String[] ids = lessionIdStr.split(",");
for (int i = 0; i < ids.length; i++) {
if (StringUtils.isNumeric(ids[i])) {
BkPersonLession lession = bkPersonLessionService.downLoadLession(Integer.parseInt(ids[i]));
if (lession != null) {
fileVos.add(new DownLoadFileVo(lession
.getLessionName(), getContextRealPath()
+ lession.getLessionSavePath()));
downLoadPaths.add(getContextRealPath()
+ lession.getLessionSavePath());
}
if (i == 0) {
firstFileName = lession.getLessionName();
}
}
}
}
}
// 有数据可以下载
if (downLoadPaths.size() != 0) {
// 进行预处理
preProcess(firstFileName);
} else {
// 没有文件可以下载,返回nodata
return "nodata";
}
// 处理
writeZip(fileVos);
// 后处理关闭流
afterProcess();
return null;
}
// 压缩处理
public void writeZip(List<DownLoadFileVo> fileVos) {
byte[] buf = new byte[8192];
int len;
for (DownLoadFileVo fileVo : fileVos) {
File file = new File(fileVo.getFileSavePath());
if (!file.isFile())
continue;
ZipEntry ze = new ZipEntry(fileVo.getFileName()
+ fileVo.getFileSavePath().substring(
fileVo.getFileSavePath().lastIndexOf(".")));
try {
zos.putNextEntry(ze);
BufferedInputStream bis = new BufferedInputStream(
new FileInputStream(file));
while ((len = bis.read(buf)) > 0) {
zos.write(buf, 0, len);
}
bis.close();
zos.closeEntry();
} catch (IOException e) {
e.printStackTrace();
}
}
}
// 预处理
public void preProcess(String firseFileName) {
String zipName = "【批量下载】" + firseFileName + "等.zip";
String filename = "";
try {
filename = new String(zipName.getBytes("GBK"), "8859_1");
} catch (UnsupportedEncodingException e1) {
e1.printStackTrace();
}
this.fileName = filename;
HttpServletResponse response = ServletActionContext.getResponse();
try {
res = response.getOutputStream();
// 清空输出流(在迅雷下载不会出现一长窜)
response.reset();
// 设定输出文件头
response.setHeader("Content-Disposition", "attachment;fileName="
+ filename);
response.setContentType("application/zip");
zos = new ZipOutputStream(res);
} catch (IOException e) {
e.printStackTrace();
}
}
// 后处理
public void afterProcess() {
try {
if (zos != null) {
zos.close();
}
if (res != null) {
res.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
3. 在struts.xml中配置
<action name="downLoadBkPersonLessionsZip" class="bkPersonLessionAction"
method="downLoadLessionsZip">//class值为bean.xml中配置的bean
<result name="nodata" type="httpheader">
<param name="status">204</param>//表示响应执行成功,但没有数据返回,浏览器不用刷新,不用导向新页面
</result>
</action>
用到的jar包
总结
以上所述是小编给大家介绍的Java实现批量下载选中文件功能网站的支持!
来源:http://blog.csdn.net/kosum/article/details/47394321


猜你喜欢
- Broadcast Receiver简介 Broadcast Receiver是Android的五大组件之一,使用频率也很高。 用于异步接收
- 公钥与私钥公钥与私钥是成对的,一般的,我们认为的是公钥加密、私钥解密、私钥签名、公钥验证,有人说成私钥加密,公钥解密时不对的。公钥与私钥的生
- jQuery的方法连缀使用起来非常方便,可以简化语句,让代码变得清晰简洁。那C#的类方法能不能也实现类似的功能呢?基于这样的疑惑,研究了一下
- 注:作者使用IDEA + Gradle注:需要有一定的java SpringBoot and SSM+Springcloud基础程序测试错误
- 概述基于java + swing + JFrame 的图书馆管理系统,租车,还车,管理员管理用户,付款等。部分代码public class
- 项目常常需要有访问共享文件夹的需求,例如共享文件夹存储照片、文件等。那么如何使用Java读写Windows共享文件夹呢?Java可以使用JC
- 每一个基于java的应用程序都有一个共同工作来展示给用户看到的内容作为工作的应用几个对象。当编写一个复杂的Java应用程序,应用程序类应该尽
- 一、泛型的概念1.1 基础案例泛型在Java中的应用非常广泛,最常见则是在集合容器中,先看下基础用法:public class Generi
- 本文实例为大家分享了java实现简单快递系统的具体代码,供大家参考,具体内容如下创建四个类Express,Locker, User, Adm
- for循环语句重复执行语句,直到条件变为 false。语法for ( init-expression ; cond-expression ;
- 您可以通过为LINQ库不提供的操作添加新运算符,或者通过创建自己的标准查询运算符实现来提高可读性和性能,从而扩展Rx。 编写自定义版本的标准
- using System.IO;using System.IO.Compression;using System.Web;using Sys
- 很多人都知道:浮点数值不适用于无法接受舍入误差的金融计算中,即:我们常说的丢失精度问题。这是为什么呢?很多人还知道这样一句话:这种舍入误差的
- System中的out,error都是final类型的,不能做改动。但通过setOut()可以设置新的输出流,从而实现写日志的功能。impo
- 在之前讨论 ListView 滚动相关需求的文章中(UWP: ListView 中与滚动有关的两个需求的实现)曾经提到了获取元素相对位置的方
- rabbitMQ是一个在AMQP协议标准基础上完整的,可服用的企业消息系统。它遵循Mozilla Public License开源协议,采用
- CoordinatorLayout 实现了多种Material Design中提到的滚动效果。目前这个框架提供了几种不用写动画代码就能工作的
- eclipse运行tomcat提示端口被占用今天碰到一个问题,在eclipse中运行一个程序,eclipse里面的tomcat一启动就报错说
- 我想到使用Redis的订阅发布模式是用来解决推送问题的~。对于概念性的叙述,多多少少还是要提一下的:什么是Redis发布订阅?Redis发布
- 本文实例为大家分享了Android ViewPager指示器的制作方法,供大家参考,具体内容如下1.概述ViewPageIndicator这