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. BG雪碧图制作要求

    使用软件 firework 保存png-8 然后参数如下图: 格式:PNG 8 调色板:最适合 深度:128 透明度:Alpha 透明度

  2. 第十周java 学习总结

    20145306 java的网络编程 网络概述 网络编程技术是当前一种主流的编程技术,随着联网趋势的逐步增强以及网络应用程序的大量出现,所以在实际的开发中网络编程技术获得了大量的使用.至于以后的实际修 ...

  3. 自定义Attribute 服务端校验 客户端校验

    MVC 自定义Attribute 服务端校验 客户端校验/* GitHub stylesheet for MarkdownPad (http://markdownpad.com) *//* Autho ...

  4. Linux多线程编程阅读链接

    1. 进程与线程的一个简单解释(阮一峰) 2. linux 多线程编程 3. Linux 的多线程编程的高效开发经验 (IBM)

  5. JS数组(Array)处理函数总结

    1.concat() 连接两个或更多的数组该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本.例如: <script type="text/javascript"&g ...

  6. javac 不是内部或外部命令

    安装好JDK后 用     java                 命令测试OK! 用     java -version    命令测试OK! 用     javac                ...

  7. CSS: word-wrap和word-break

    最近修改页面排版的一些问题,发现关于内容分词换行有两个主要的CSS: word-wrap 和 word-break 特别是word-wrap还有个取值break-word,更使得这两个属性容易混淆. ...

  8. SQL Server存储过程(转载)

    Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用.当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句.这样就可以提高存储过程的性能. Ø ...

  9. 使用memcached实现tomcat集群session共享

    环境centos6.7,下载安装必要的软件:yum -y install epel-release(tomcat7在此源上,tomcat7是现在主流版本) yum -y install tomcat ...

  10. php怎么解析utf-8带BOM编码的json数据,php解析json数据返回NULL

    今天遇到一个问题,json_decode解析json数据返回null,试了各种方法都不行,最后发现,原来是json文件编码的问题. 当json_decode解析utf-8带BOM格式的json数据时, ...