Jsp实现筛选并压缩文件批量下载

首先明确一下需求,网页端点击一下button,传递特定的参数到download.jsp网页,筛选文件,对过滤得到的文件进行压缩,然后返回前端一个压缩包下载。

以下的代码来源于网络,没找到源发地出处,经过了自定义的修改。

方法声明

<%@ page
language="java"
import="java.util.*"
%>
<%@ page import="java.io.BufferedInputStream" %>
<%@ page import="java.io.File" %>
<%@ page import="java.io.FileFilter" %>
<%@ page import="java.io.FileInputStream" %>
<%@ page import="java.io.FileOutputStream" %>
<%@ page import="java.io.IOException" %>
<%@ page import="java.io.InputStream" %>
<%@ page import="org.apache.tools.zip.*" %>
<%@ page import="javax.servlet.http.HttpServletResponse" %>
<%@ page import="java.util.zip.*" %>
<%@ page import="java.util.regex.Pattern" %>
<%@ page import="java.util.regex.Matcher" %> <%!
// 得到该文件夹,及其所有子文件夹下的所有目标文件
List<File> getAllFiles(File file, String regex) {
List<File> valueFiles = new ArrayList<File>();
File[] fs = file.listFiles();
for (int i = 0; i < fs.length; i++) {
if (fs[i].isDirectory()) {
// 递归得到每个子文件夹下的目标文件
valueFiles.addAll(getAllFiles(fs[i], regex));
}
}
// 把file文件夹下的目标文件放进去
valueFiles.addAll(Arrays.asList(getFiles(file, regex)));
return valueFiles;
} // 得到一个文件夹下的目标文件,不包括子文件夹
File[] getFiles(File file, String _regex) {
final String regexTemp = _regex;
// 图个方便,用匿名类了
FileFilter filter = new FileFilter() {
String regex = regexTemp; public boolean accept(File pathname) {
// return pathname.getName().matches(regex);// 文件后缀为.jsp
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(pathname.getName());
return matcher.find();
}
};
File[] fs = file.listFiles(filter);
return fs;
} String[] listToStringArray(List<File> listF) {
List<String> listS = new ArrayList<String>();
for (File f : listF) {
listS.add(f.getAbsolutePath());
}
int size = listS.size();
return (String[])listS.toArray(new String[size]);
} public class JspFileDownload {
/** request object */
private HttpServletResponse response = null; /** file type: -1 un-setting; 0 normal file; 1 zip file ;2 stream*/
private int fileType = -1; /** file name to be displayed */
private String disFileName = null; /** zip file path */
private String zipFilePath = null; /** file to be zipped */
private String[] zipFileNames = null; private boolean zipDelFlag = false; /** file to be downloaded */
private String downFileName = null; /** error code 0 */
private static final int PROCESS_OK = 0; /** error code 1 */
private static final int RESPONSE_IS_NULL = 1; /** error code 2 */
private static final int UNSET_DOWNLOADTYPE = 2; /** error code 3 */
private static final int UNSET_DIS_FILE_NAME = 3; /** error code 4 */
private static final int UNSET_DOWN_FILE_NAME = 4; /** error code 9 */
private static final int IO_EXCEPTION = 9; /**
* set response object
* @param response response Object
*/
public void setResponse(HttpServletResponse response){
this.response = response;
} /**
* set file type 0 normal file; 1 zip file ;2 stream
* @param fileType
*/
public void setDownType(int fileType){
this.fileType = fileType;
} /**
* set display file name
* @param fileName
*/
public void setDisFileName(String fileName){
this.disFileName = fileName;
} /**
* set zip file path
* @param fileNames
*/
public void setZipFilePath( String path ){
this.zipFilePath = path;
} public void setZipDelFlag(boolean b){
this.zipDelFlag = b;
} /**
* set zip file names
* @param fileNames
*/
public void setZipFileNames(String[] fileNames){
this.zipFileNames = fileNames;
} /**
* set download file name
* @param fileName
*/
public void setDownFileName(String fileName){
this.downFileName = fileName;
} /**
* set file content
* @param fileContent
*/
public int setFileContent(String fileContent){
try{
// byte[] buffs = fileContent.getBytes("GBK");
byte[] buffs = fileContent.getBytes("UTF-8");
response.getOutputStream().write(buffs);
}catch(IOException e){
return IO_EXCEPTION;
}
return PROCESS_OK;
} /**
* set file content
* @param fileContent
*/
public int setFileContent(byte[] fileContent){
try{
response.getOutputStream().write(fileContent);
}catch(IOException e){
return IO_EXCEPTION;
}
return PROCESS_OK;
} /**
* set file content end
*
*/
public int setFileContentEnd(){
try{
response.getOutputStream().close();
}catch(IOException e){
return IO_EXCEPTION;
}
return PROCESS_OK;
} /**
* main process
* @return
*/
public int process(){
int status = PROCESS_OK; status = preCheck();
if ( status != PROCESS_OK )
return status; String fileName = disFileName; response.setContentType("APPLICATION/OCTET-STREAM");
response.setHeader("Content-Disposition","attachment;filename=\"" + fileName + "\"");
int BUFSIZE = 1024 * 8;
int rtnPos = 0;
byte[] buffs = new byte[ BUFSIZE ];
FileInputStream inStream = null;
ZipOutputStream zos = null;
InputStream is = null;
String filepath = null;
try{ if ( fileType == 0 || fileType == 1){
if ( fileType == 0 ){
filepath = downFileName;
} else {
filepath = zipFilePath + fileName;
String[] fileToZip = zipFileNames;
zos=new ZipOutputStream(new FileOutputStream(filepath));
ZipEntry ze=null;
byte[] buf=new byte[BUFSIZE];
int readLen=0;
for (int i= 0;i<fileToZip.length;i++){
File f= new File(fileToZip[i]); ze=new ZipEntry(f.getName());
ze.setSize(f.length());
ze.setTime(f.lastModified()); zos.putNextEntry(ze);
is=new BufferedInputStream(new FileInputStream(f));
while ((readLen=is.read(buf, 0, BUFSIZE))!=-1) {
zos.write(buf, 0, readLen);
}
is.close();
}
zos.close();
} // 以下为输出文件
inStream =new FileInputStream(filepath);
while((rtnPos=inStream.read(buffs)) >0)
response.getOutputStream().write(buffs,0,rtnPos);
response.getOutputStream().close();
inStream.close();
}
if ( zipDelFlag ){
File fToDel = new File(filepath);
fToDel.delete();
} }catch(IOException e){
return IO_EXCEPTION;
}finally{
try{
if ( inStream != null ){
inStream.close();
inStream = null;
}
if ( zos != null ){
zos.close();
zos = null;
}
if ( is != null ){
is.close();
is = null;
}
}catch (IOException e){
}
}
return status;
} /**
* pre check.
* @return
*/
private int preCheck(){
if ( response == null )
return RESPONSE_IS_NULL; if ( disFileName == null || disFileName.trim().length() == 0 )
return UNSET_DIS_FILE_NAME;
if ( fileType == -1 )
return UNSET_DOWNLOADTYPE;
else if ( fileType == 0 ){
if ( downFileName == null || downFileName.trim().length() == 0 )
return UNSET_DOWN_FILE_NAME;
else{
if ( !isFile( downFileName ) )
return UNSET_DOWN_FILE_NAME;
} }else if ( fileType == 1 ){
if ( zipFilePath == null || zipFilePath.length() == 0 )
return UNSET_DOWN_FILE_NAME;
else{
if ( !isDirect(zipFilePath) )
return UNSET_DOWN_FILE_NAME;
}
if ( zipFileNames == null || zipFileNames.length == 0 )
return UNSET_DOWN_FILE_NAME;
else{
for ( int i=0;i<zipFileNames.length;i++ ){
if ( zipFileNames[i] == null || zipFileNames[i].trim().length() == 0 )
return UNSET_DOWN_FILE_NAME;
else{
if ( !isFile( zipFileNames[i] ) )
return UNSET_DOWN_FILE_NAME;
}
}
}
}else if ( fileType == 2 ){
//doing nothing
}else{
return UNSET_DOWNLOADTYPE;
}
return PROCESS_OK;
} private boolean isFile(String fileName){
File f = new File(fileName);
if (!f.exists() || !f.isFile())
return false;
return true;
} private boolean isDirect(String filePath){
File f = new File(filePath);
if (!f.exists() || !f.isDirectory())
return false;
return true;
}
}
%>

代码调用

<%@ include file="downloadFilesHelper.jsp" %>
<%
// 服务器路径
String filePath = request.getRealPath("/") + "homeworkUpload\\";
// 构建路径File
File path = new File(filePath);
// 正则表达式
String homeworkNamePrefix = request.getParameter("homeworkNamePrefix");
// String homeworkNamePrefix = "数据库第一周作业";
String regex = "^(" + homeworkNamePrefix + ")";
// String regex = "^(数据库第一周作业)";
// 获取文件List
List<File> listFiles = getAllFiles(path, regex);
// List转String[]
String[] files = listToStringArray(listFiles);
// 压缩文件名
// String outputFileName = "批量下载" + homeworkNamePrefix + ".zip";
String outputFileName = "Homework.zip";
// 准备压缩
JspFileDownload jspFileDownload = new JspFileDownload();
jspFileDownload.setResponse(response);
jspFileDownload.setDownType(1); // zip file
jspFileDownload.setDisFileName(outputFileName);
jspFileDownload.setZipFilePath(filePath);
jspFileDownload.setZipDelFlag(false); // 不删除压缩文件
jspFileDownload.setZipFileNames(files);
jspFileDownload.setDownFileName(outputFileName);
// jspFileDownload.setFileContent(homeworkNamePrefix);
// jspFileDownload.setFileContentEnd();
// 开始压缩并下载
int status = jspFileDownload.process();
// Debug
// out.println("status = " + status + "<br/>");
// out.println("regex = " + regex + "<br/>");
// for (int i = 0; i < files.length; i++) {
// out.println(files[i] + "<br/>");
// }
// out.println(outputFileName + "<br/>");
if (status == 4) {
out.println("<p>还没有同学上交作业</p>");
}
%>

已知bug,outputFileName不能赋值为中文名,如果赋值为中文名,返回前端的压缩包名字为------.zip,但内容一点问题都没有。暂时没有解决,如果有园友解决了的,求告知。

至此,完毕。

Jsp实现筛选并压缩文件批量下载的更多相关文章

  1. SQL 横转竖 、竖专横 (转载) 使用Dapper.Contrib 开发.net core程序,兼容多种数据库 C# 读取PDF多级书签 Json.net日期格式化设置 ASPNET 下载共享文件 ASPNET 文件批量下载 递归,循环,尾递归 利用IDisposable接口构建包含非托管资源对象 《.NET 进阶指南》读书笔记2------定义不可改变类型

    SQL 横转竖 .竖专横 (转载)   普通行列转换 问题:假设有张学生成绩表(tb)如下: 姓名 课程 分数 张三 语文 74 张三 数学 83 张三 物理 93 李四 语文 74 李四 数学 84 ...

  2. C#子线程中更新ui-----c# 多线程多文件批量下载

    c# 多线程多文件批量下载   废话少说,先演示一张效果图 简单说下过程喽 开发过程中其实总是会碰到项目想应用下载文件~ 看其他语言有很多封装好的类库可以使用~~ 作为小白的我并没有找到很多c#的案例 ...

  3. js 实现多文件批量下载

    关于兼容性问题: <a href="xxx.docx" target='_blank'></a> 下载文件时,这种写法是没有兼容性问题:但是下载图片时,IE ...

  4. javaweb通过接口来实现多个文件压缩和下载(包括单文件下载,多文件批量下载)

    原博客地址:https://blog.csdn.net/weixin_37766296/article/details/80044000 将多个文件压缩并下载下来:(绿色为修改原博客的位置) 注意:需 ...

  5. NET 文件批量下载

    HTML <a class="btn btn-warning" id="btnDownload">选中下载</a> JS /* 批量下载 ...

  6. java+文件批量下载

    这篇文章主要介绍了Java实现批量下载选中文件功能,非常不错,具有参考借鉴价值,需要的朋友可以参考下 1.在action中定义变量 private List<String> downLoa ...

  7. 文件打包,下载之使用PHP自带的ZipArchive压缩文件并下载打包好的文件

    总结:                                                          使用PHP下载文件的操作需要给出四个header(),可以参考我的另一篇博文: ...

  8. R语言之RCurl实现文件批量下载

    前言: RCurl工具包的作者是由Duncan Temple Lang现任加州大学 U.C. Davis分校副教授.他曾致力于借助统计整合进行信息技术的探索.使用者通过RCurl可以轻易访问网页,进行 ...

  9. jquery-ajax实现文件批量下载

    直接看代码: <script type="text/javascript"> //全选控制 $(document).ready(function() { $(" ...

随机推荐

  1. 使用python脚本实现基于指定字符串的文本排序

    朋友用ansible导出了一个文件,文件中包含上千台机器的磁盘信息,他想要知道哪些机器最需要赶紧扩磁盘.思路是,按剩余磁盘空间百分数,从小到大对文本内容重新排序.下面是具体实现. 源文件ip.txt的 ...

  2. c# winform 关于DataGridView的一些操作(很全,绝对够用)

    转自:http://heisetoufa.iteye.com/blog/405317 设置字段名 设置字段值 设定单元格表示 Error图标 设定当前单元格 取得当前单元格内容 取得当前单元格的列 I ...

  3. 深入浅出 RPC - 浅出篇+深入篇

    摘自: http://blog.csdn.net/mindfloating/article/details/39473807 近几年的项目中,服务化和微服务化渐渐成为中大型分布式系统架构的主流方式,而 ...

  4. Find out who the “mole” is?

    Blueheat Company’s  production server was out of order again. The CEO was very upset and want their ...

  5. Android IOS WebRTC 音视频开发总结(六二)-- 大数据解密国外实时通讯行业开发现状

    本文主要介绍国外实时通讯行业现状,文章最早发表在我们的微信公众号上,详见这里,欢迎关注微信公众号blackerteam,更多详见www.blackerteam.com 上篇文章我们采用百度搜索指数来分 ...

  6. 二十二、OGNL的一些其他操作

    二十二.OGNL的一些其他操作 投影 ?判断满足条件 动作类代码: ^ $   public class Demo2Action extends ActionSupport {     public ...

  7. iOS 层层推进实现代理模式

    1.代理模式核心思想:A类委托B类做某件事,然后A类获取B类的执行的返回结果! 举例:女孩想去买电影票,但是自己不亲自去而是委托男孩了解电影电影票信息,同时女孩获得男孩买票的结果,代码模拟实现: /* ...

  8. js ajax乱码查看\u8fdb\u53e3

    document.write('\u8fdb\u53e3') //在页面上看乱码转为中文 或在按F12 在console里查看 直接打'\u8fdb\u53e3'

  9. Kettle 合并记录报错!

    在Kettle的合并记录过程的时候,在“为了转换解除补丁开始 ”这一步的时候报错.具体错误如图所示: Kettle的转换如图所示: 问题原因:可能是你的数据库链接驱动和Kettle的版本不兼容. 解决 ...

  10. tomcat servlet 线程

    在服务器里,有一个servlet,当客户端第一次访问服务器时,tomcat会 帮我们建一个servlet的对象出来,(注意: tomcat里面可能部署了10个Servlet,如果某一个Servlet从 ...