Java文件分級(jí)目錄打包下載zip的實(shí)例代碼
Java文件分級(jí)目錄打包下載zip
說(shuō)一下具體實(shí)現(xiàn)的功能吧,要將頁(yè)面的文件存放在對(duì)應(yīng)的文件目錄,打成壓縮包下載。
由于第一次接觸,也是找了一整天網(wǎng)上的方法,費(fèi)盡腦汁,終于實(shí)現(xiàn)了。
打包下載zip的工具類
直接調(diào)用即可
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.collections.CollectionUtils;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;
import org.apache.tools.zip.ZipOutputStream;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @Author: fd
* @Date 2020/7/28 21:33
* @Description:
*/
public class ZipUtiles {
private static Logger logger = LoggerFactory.getLogger(ZipUtiles.class);
// 目錄標(biāo)識(shí)判斷符
private static final String PATCH = "/";
// 基目錄
private static final String BASE_DIR = "/b/";
// 緩沖區(qū)大小
private static final int BUFFER = 2048;
// 字符集
private static final String CHAR_SET = "UTF-8";
public static void compress(File srcFile, ZipOutputStream zipOutputStream, String basePath) throws Exception {
if (srcFile.isDirectory()) {
compressDir(srcFile, zipOutputStream, basePath);
} else {
compressFile(srcFile, zipOutputStream, basePath);
}
}
private static void compressDir(File dir, ZipOutputStream zipOutputStream, String basePath) throws Exception {
try {
// 獲取文件列表
File[] files = dir.listFiles();
if (files.length < 1) {
ZipEntry zipEntry = new ZipEntry(basePath + dir.getName() + PATCH);
zipOutputStream.putNextEntry(zipEntry);
zipOutputStream.closeEntry();
}
for (int i = 0,size = files.length; i < size; i++) {
compress(files[i], zipOutputStream, basePath + dir.getName() + PATCH);
}
} catch (Exception e) {
throw new Exception(e.getMessage(), e);
}
}
private static void compressFile(File file, ZipOutputStream zipOutputStream, String dir) throws Exception {
try {
// 壓縮文件
ZipEntry zipEntry = new ZipEntry(dir + file.getName());
zipOutputStream.putNextEntry(zipEntry);
// 讀取文件
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
int count = 0;
byte data[] = new byte[BUFFER];
while ((count = bis.read(data, 0, BUFFER)) != -1) {
zipOutputStream.write(data, 0, count);
}
bis.close();
zipOutputStream.closeEntry();
} catch (Exception e) {
throw new Exception(e.getMessage(),e);
}
}
public static void main(String[] args) {
try {
ZipOutputStream zipOutputStream = new ZipOutputStream(new FileOutputStream(new File("D:/a/a.zip")));
zipOutputStream.setEncoding(CHAR_SET);
List<File> files = new ArrayList<File>();
files.add(new File("D:\\a\\b\\1.jpg"));
files.add(new File("D:\\a\\b\\2.jfif"));
if (CollectionUtils.isEmpty(files) == false) {
for (int i = 0,size = files.size(); i < size; i++) {
compress(files.get(i), zipOutputStream, BASE_DIR);
}
}
// 沖刷輸出流
zipOutputStream.flush();
// 關(guān)閉輸出流
zipOutputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}頁(yè)面下載方法的接口
業(yè)務(wù)邏輯可跟需求修改,這里主要是查詢數(shù)據(jù)庫(kù)得出文件名,根據(jù)自己需求構(gòu)建分級(jí)文件名,存入集合,循環(huán)將對(duì)應(yīng)的文件存放到文件夾里,調(diào)用工具類打成壓縮包下載。
/**
* 打包下載
*/
@RequestMapping(value = "/packdownload", method = RequestMethod.GET)
public void packdownload(HttpSession session, HttpServletRequest request, HttpServletResponse response) {
PrintWriter outWriter = null;
try {
//查詢條件
String loanId = request.getParameter("loanId")==null?"":request.getParameter("loanId").trim();
String contNo = request.getParameter("contNoStr")==null?"":request.getParameter("contNoStr").trim();
Criteria cri = new Criteria();
cri.clear();
//業(yè)務(wù)需求 查詢文件的條件
if(StringUtils.isNotBlank(loanId) && !loanId.equals("")){
cri.put("loanId",loanId);
}
//查詢出來(lái)的文件集合
List<TFileConfig> tFileConfigList = fileConfigService.selectByCondition(cri);
if(tFileConfigList != null && tFileConfigList.size() > 0){
String zipName = contNo + "信貸檔案信息.zip";
response.setContentType("application/octet-stream");// 指明response的返回對(duì)象是文件流
response.setHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode(zipName, "UTF-8"));
ZipOutputStream zipOutputStream = new ZipOutputStream(new BufferedOutputStream(response.getOutputStream()));
zipOutputStream.setMethod(ZipOutputStream.DEFLATED);//設(shè)置壓縮方法
try {
//以下代碼為 根據(jù)自己所需條件查詢數(shù)據(jù)庫(kù)得出文件夾名 構(gòu)建二級(jí)文件夾名
List<File> files = new ArrayList<File>();
List<String> totalFolderList = new ArrayList<String>();
TFileConfig fileConfig = null;
for (int i = 0;i < tFileConfigList.size(); i++){
fileConfig = tFileConfigList.get(i);
cri.clear();
cri.put("loanConfigId",fileConfig.getLoanConfigId());
List<TLoanConfig> loanConfigList = tLoanConfigService.selectByCondition(cri); //根據(jù)loanConfigId 查找對(duì)應(yīng) 的 配置類名
if(loanConfigList != null && loanConfigList.size() > 0){
String folderName = loanConfigList.get(0).getLoanConfigName(); //子類文件名
cri.clear();
cri.put("superIds",loanConfigList.get(0).getSuperId());
List<TLoanConfig> superConfigList = tLoanConfigService.selectByCondition(cri);
if(superConfigList != null && superConfigList.size() > 0){
TLoanConfig config = superConfigList.get(0);
String superConfigName = config.getLoanConfigName(); //父類文件夾名
totalFolderList.add(superConfigName + "\\" + folderName + "\\"); //構(gòu)建二級(jí)文件夾名
}
files.add(new File(fileConfig.getRealPath()));
}
}
if (CollectionUtils.isEmpty(files) == false) {
for (int i = 0,size = totalFolderList.size(); i < size; i++) {
//調(diào)用工具類方法
ZipUtiles.compress(files.get(i), zipOutputStream, totalFolderList.get(i));
}
response.flushBuffer();
// 沖刷輸出流
zipOutputStream.flush();
zipOutputStream.finish();
// 關(guān)閉輸出流
zipOutputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}else{
outWriter = response.getWriter();
outWriter.println("<script>alert('該日期暫無(wú)文件')';</script>");
return;
}
} catch (Exception e) {
try {
outWriter = response.getWriter();
} catch (IOException e1) {
e1.printStackTrace();
}
logger.error("ImportfileController.java-packdownload-Exception: ", e);
outWriter.println("<script>alert('下載異常')';</script>");
return;
}
}頁(yè)面下載調(diào)用后臺(tái)接口
function subFrm(){
var options = {
dataType: 'json',
iframe: false,
resetForm: true,
success: function(data) {
debugger;
if(data.code == 1){
layer.alert('校驗(yàn)成功', {icon: 1},function(index){
var url = pcs.common.path + '/admin/sysfiles/packdownload?loanId=' + $("#loanId").val() + "&contNoStr=" + $("#contNoStr").val();
window.location.href = url;
//關(guān)閉彈窗
setTimeout(function () {
var index = parent.layer.getFrameIndex(window.name);
parent.layer.close(index);
}, 500)
});
}else{
layer.alert(data.msg, {icon: 2});
}
},
error:function(){
layer.alert('頁(yè)面已過期,請(qǐng)刷新', {icon: 2},function(){
window.location.href = pcs.common.path + '/admin/user/confirmPwd';
});
}
};
$.ajaxSetup({contentType:'application/x-www-form-urlencoded;charset=utf-8'});
$('#frm').ajaxSubmit(options);
}這是頁(yè)面文件的展示頁(yè)
點(diǎn)擊下載即可打包文件,下載壓縮包。

下載成功的展示

解壓后的文件



總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
java 中 阻塞隊(duì)列BlockingQueue詳解及實(shí)例
這篇文章主要介紹了java 中 阻塞隊(duì)列BlockingQueue詳解及實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-03-03
使用maven構(gòu)建java9 service實(shí)例詳解
本篇文章主要介紹了使用maven構(gòu)建java9 service實(shí)例詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧2018-02-02
java讀取resources文件詳解及實(shí)現(xiàn)代碼
這篇文章主要介紹了java讀取resources文件詳解及實(shí)現(xiàn)代碼的相關(guān)資料,在開發(fā)項(xiàng)目的時(shí)候經(jīng)常會(huì)遇到讀取文件夾里面的內(nèi)容,需要的朋友可以參考下2017-07-07
springboot利用easypoi實(shí)現(xiàn)簡(jiǎn)單導(dǎo)出功能
本文介紹了如何使用Spring Boot和EasyPoi庫(kù)實(shí)現(xiàn)Excel文件的導(dǎo)出功能,EasyPoi是一個(gè)簡(jiǎn)化Excel和Word操作的工具,通過簡(jiǎn)單的配置和代碼,可以輕松地將Java對(duì)象導(dǎo)出為Excel文件,并且支持圖片導(dǎo)出等功能,感興趣的朋友一起看看吧2024-12-12
SpringBoot Admin的簡(jiǎn)單使用的方法步驟
本文主要介紹了SpringBoot Admin的簡(jiǎn)單使用的方法步驟,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01
Springboot整合實(shí)現(xiàn)郵件發(fā)送的原理詳解
SpringBoot集成郵件服務(wù)非常簡(jiǎn)單,通過簡(jiǎn)單的學(xué)習(xí)即可快速掌握郵件業(yè)務(wù)類的核心邏輯和企業(yè)郵件的日常服務(wù),本文給大家分享Springboot整合實(shí)現(xiàn)郵件發(fā)送的原理,一起看看吧2021-06-06

