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. WP8_(windows phone环境下)上传文件从C#到php接口

    在windows phone环境下,将手机上的图片上传到服务端(php环境): 注意事项:在上传的地方,头文件中name,例如name= img,则在php服务端处理时 ,需要约定好 存取一致 php ...

  2. PDM文件编辑

    需要把Oracle中的表,导出到已有的PDM文件中. 1.Oracle导出表脚本 1) 2) 3) 2.PowerDesigner导入脚本 1) 2) 3) 4)

  3. 2搭建Android开发环境

    这一章主要是讲解如何搭建Android开发环境,需要准备的工具有: (1)   JDK6或以上的版本: (2)   Eclipse (3)   ADT(用于开发Android应用程序) (4)   C ...

  4. Jquery 利用单个复选款(checkbox)实现全选、反选

    1 <script type="text/javascript"> $(function(){ //全选 $("#CheckedAll").clic ...

  5. c#中操作word文档-三、MSDN文档

    这是关于word读写的MSDN内容,基本所有的方法都可以在这上面找到 https://msdn.microsoft.com/zh-cn/library/office/ff837519.aspx

  6. Silverlight中DataPager控件扩展

    大家一定遇到这样的情况,想改变一下SL的DataPager的显示信息,比如希望分页控件上显示数据的总数.那么就需要扩展一下DataPager控件即可. 其实扩展DataPager很简单,只要获取到Da ...

  7. 在Windows下Mysql如何重置root用户密码

    原文链接:http://www.feeldesignstudio.com/2013/05/windows-mysql-root-password-reset 网上的很多在Windows下重置root用 ...

  8. Linux安装配置php环境的方法

    本文实例讲述了Linux安装配置php环境的方法.分享给大家供大家参考,具体如下: 1.获取安装文件: http://www.php.net/downloads.php php-5.3.8.tar.g ...

  9. 学习c编程的第三天

    #include<stdio.h> int add(int,int); int main(){ int x=add(1,2); printf("%d",x); retu ...

  10. Varint编码

    LevelDB内部通过采用变长编码,对数据进行压缩来减少存储空间,采用CRC进行数据正确性校验.下面就对varint编码进行学习. 传统的integer是以32位来表示的,存储需要4个字节,当如果整数 ...