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
0
投稿
猜你喜欢
- Mybatis typeAlias配置1.定义别名<typeAliases> <ty
- 由于 Spring 拥有对象的管理权,所以我们也需要拥有较为高效的对象存储和取出的手段,下面我们来分别总结一下:存对象配置文件在存储对象之前
- Java基础将Bean属性值放入Map中的实例利用发射将Java对象的属性值以属性名称为键,存储到Map中的简单实现。包括自身属性及从父类继
- <html> <head> &nb
- JAVA并发总览核心问题并不是程序的漏洞导致的,而是操作系统底层机制导致的原子性:可见性问题:改的是缓存,但是缓存对另一个线程不可见有序性问
- 1、通过注解ModelAttribute直接映射表单中的参数到POJO。在from中的action写提交的路径,在input的name写参数
- Windows系统启动Java程序会弹出黑窗口。黑窗口有几点不好。首先它不美观;其次容易误点导致程序关闭;但最让我匪夷所思的是:将鼠标光标选
- 稳定度(稳定性)一个排序算法是稳定的,就是当有两个相等记录的关键字R和S,且在原本的列表中R出现在S之前,在排序过的列表中R也将会是在S之前
- 算法简介迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学迪家迪杰斯特拉于1959年提出的,因此又叫狄克斯特拉算法。是从一个顶点到其余各顶
- 1. 什么是JWTJSON Web Token(JWT)是一个轻量级的认证规范,这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信
- 为什么需要 StreamStream 作为 Java 8 的一大亮点,它与 java.io 包里的 InputStream 和 Output
- 一.线程不安全多线程的执行环境中,程序的执行结果和预期的结果不符合,这就称为发生了线程不安全现象二.那些情况导致了线程不安全?大致分为以下5
- 本文介绍了最好的Java5种遍历HashMap数据的写法,分享给大家,也给自己留一个笔记,具体如下:通过EntrySet的迭代器遍历Iter
- springBoot是java开发中会经常用到的框架,那么在实际项目中项目配置了springBoot框架,应该如何在项目中读取配置文件中的参
- 前言好久没写 linphone-sdk-android 相关的文章了,本文记录下笔者分析 linphone-sdk 版本号生成的过程。分析注
- Java集合框架集合概念:对象的容器,定义了对多个对象进行操作的常用方法。可实现数组的功能。集合和数组的区别:数组长度固定,集合长度不固定数
- 我计划在后续的一段时间内,写一系列关于java 9的文章,虽然java 9 不像Java 8或者Java 11那样的核心java版本,但是还
- 1、在build.gradle(Module)里引入依赖,然后重构(sync Now):android { ...
- 规则1(无继承情况下):对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序依次是(静态变量、静态初始化块)>(变量、
- 引言C#应用通过 Microsoft.Toolkit.Uwp.Notifications NuGet包可以很方便的发送本地通知(Window