java下载打包下载文件 - 代码9527

like9527 2021-08-07 原文


java下载打包下载文件


一:对于文件的一些操作

1.创建文件夹

private String CreateFile(String dir) {
File file = new File(dir);
if (!file.exists()) {
//创建文件夹
boolean mkdir = file.mkdir();

} else {

}
return dir;
}

2.复制文件

private void copyFile(File source, File dest) throws IOException {
FileChannel inputChannel = null;
FileChannel outputChannel = null;
try {
inputChannel = new FileInputStream(source).getChannel();
outputChannel = new FileOutputStream(dest).getChannel();
outputChannel.transferFrom(inputChannel, 0, inputChannel.size());
} finally {
inputChannel.close();
outputChannel.close();
}
}

3.删除文件
private void delFile(File file) {
File[] listFiles = file.listFiles();
if (listFiles != null) {
for (File f : listFiles) {
if (f.isDirectory()) {
delFile(f);
} else {
f.delete();
}
}
}
file.delete();
}

 

二:controller的文件下载操作

 

OutputStream out = response.getOutputStream();
byte[] data = FileToZipUtils.createZip(pdir);//这里根据项目里实际的地址去写  ,FileToZipUtils是一个工具类
response.reset();
//response.setHeader(“Content-Disposition”,”attachment;fileName=file.zip”);
response.setHeader(“Content-Disposition”, “attachment; filename=” + java.net.URLEncoder.encode(pname+”.zip”, “UTF-8”));
response.addHeader(“Content-Length”, “”+data.length);
response.setContentType(“application/octet-stream;charset=UTF-8”);
IOUtils.write(data, out);
out.flush();
out.close();

 

三:FileToZipUtils工具类

public class FileToZipUtils {

// 日志
private static Logger log = LoggerFactory.getLogger(FileToZipUtils.class);

/***
* 压缩文件变成zip输出流
*/
public static byte[] createZip(String srcSource) throws Exception{
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ZipOutputStream zip = new ZipOutputStream(outputStream);
//将目标文件打包成zip导出
File file = new File(srcSource);
createAllFile(zip, file, “”);
IOUtils.closeQuietly(zip);
return outputStream.toByteArray();
}

/***
* 对文件下的文件处理
*/
public static void createAllFile(ZipOutputStream zip, File file, String dir) throws Exception {
//如果当前的是文件夹,则进行进一步处理
if (file.isDirectory()) {
//得到文件列表信息
File[] files = file.listFiles();
//将文件夹添加到下一级打包目录
zip.putNextEntry(new ZipEntry(dir + “/”));
dir = dir.length() == 0 ? “” : dir + “/”;
//循环将文件夹中的文件打包
for (int i = 0; i < files.length; i++) {
createAllFile(zip, files[i], dir + files[i].getName()); //递归处理
}
} else { //当前的是文件,打包处理
//文件输入流
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
ZipEntry entry = new ZipEntry(dir);
zip.putNextEntry(entry);
zip.write(FileUtils.readFileToByteArray(file));
IOUtils.closeQuietly(bis);
zip.flush();
zip.closeEntry();
}
}

/**
* 将存放在sourceFilePath目录下的源文件,打包成fileName名称的zip文件,并存放到zipFilePath路径下
*
* @param sourceFilePath
* :待压缩的文件路径
* @param zipFilePath
* :压缩后存放路径
* @param fileName
* :压缩后文件的名称
* @return
*/
public static boolean fileToZip(String sourceFilePath, String zipFilePath, String fileName) {
boolean flag = false;
File sourceFile = new File(sourceFilePath);
FileInputStream fis = null;
BufferedInputStream bis = null;
FileOutputStream fos = null;
ZipOutputStream zos = null;

if (sourceFile.exists() == false) {
log.info(“待压缩的文件目录:” + sourceFilePath + “不存在.”);
} else {
try {
File zipFile = new File(zipFilePath + “/” + fileName + “.zip”);
if (zipFile.exists()) {
log.info(zipFilePath + “目录下存在名字为:” + fileName + “.zip” + “打包文件.”);
} else {
File[] sourceFiles = sourceFile.listFiles();
if (null == sourceFiles || sourceFiles.length < 1) {
log.info(“待压缩的文件目录:” + sourceFilePath + “里面不存在文件,无需压缩.”);
} else {
fos = new FileOutputStream(zipFile);
zos = new ZipOutputStream(new BufferedOutputStream(fos));
byte[] bufs = new byte[1024 * 10];
for (int i = 0; i < sourceFiles.length; i++) {
// 创建ZIP实体,并添加进压缩包
ZipEntry zipEntry = new ZipEntry(sourceFiles[i].getName());
zos.putNextEntry(zipEntry);
// 读取待压缩的文件并写进压缩包里
fis = new FileInputStream(sourceFiles[i]);
bis = new BufferedInputStream(fis, 1024 * 10);
int read = 0;
while ((read = bis.read(bufs, 0, 1024 * 10)) != -1) {
zos.write(bufs, 0, read);
}
}
flag = true;
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
throw new RuntimeException(e);
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException(e);
} finally {
// 关闭流
try {
if (null != bis)
bis.close();
if (null != zos)
zos.close();
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
}
return flag;
}
/**
* 解压缩zip包
*
* @param zipFilePath
* 需要解压的zip文件的全路径
* @param unzipFilePath
* 解压后的文件保存的路径
* @param includeZipFileName
* 解压后的文件保存的路径是否包含压缩文件的文件名。true-包含;false-不包含
*/
@SuppressWarnings(“unchecked”)
public static void unzip(String zipFilePath, String unzipFilePath, boolean includeZipFileName) throws Exception {
if (StringUtils.isNotBlank(zipFilePath) || StringUtils.isNotBlank(unzipFilePath)) {
File zipFile = new File(zipFilePath);
// 如果解压后的文件保存路径包含压缩文件的文件名,则追加该文件名到解压路径
if (includeZipFileName) {
String fileName = zipFile.getName();
if (StringUtils.isNotEmpty(fileName)) {
fileName = fileName.substring(0, fileName.lastIndexOf(“.”));
}
unzipFilePath = unzipFilePath + File.separator + fileName;
}
// 创建解压缩文件保存的路径
File unzipFileDir = new File(unzipFilePath);
if (!unzipFileDir.exists() || !unzipFileDir.isDirectory()) {
unzipFileDir.mkdirs();
}

// 开始解压
ZipEntry entry = null;
String entryFilePath = null, entryDirPath = null;
File entryFile = null, entryDir = null;
int index = 0, count = 0, bufferSize = 1024;
byte[] buffer = new byte[bufferSize];
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
ZipFile zip = new ZipFile(zipFile);
Enumeration<ZipEntry> entries = (Enumeration<ZipEntry>) zip.entries();
// 循环对压缩包里的每一个文件进行解压
while (entries.hasMoreElements()) {
entry = entries.nextElement();
// 构建压缩包中一个文件解压后保存的文件全路径
entryFilePath = unzipFilePath + File.separator + entry.getName();
// 构建解压后保存的文件夹路径
index = entryFilePath.lastIndexOf(File.separator);
if (index != -1) {
entryDirPath = entryFilePath.substring(0, index);
} else {
entryDirPath = “”;
}
entryDir = new File(entryDirPath);
// 如果文件夹路径不存在,则创建文件夹
if (!entryDir.exists() || !entryDir.isDirectory()) {
entryDir.mkdirs();
}

// 创建解压文件
entryFile = new File(entryFilePath);
if (entryFile.exists()) {
// 检测文件是否允许删除,如果不允许删除,将会抛出SecurityException
SecurityManager securityManager = new SecurityManager();
securityManager.checkDelete(entryFilePath);
// 删除已存在的目标文件
entryFile.delete();
}

// 写入文件
bos = new BufferedOutputStream(new FileOutputStream(entryFile));
bis = new BufferedInputStream(zip.getInputStream(entry));
while ((count = bis.read(buffer, 0, bufferSize)) != -1) {
bos.write(buffer, 0, count);
}
bos.flush();
bos.close();
}
zip.close();// 切记一定要关闭掉,不然在同一个线程,你想解压到临时路径之后,再去删除掉这些临时数据,那么就删除不了
}

}
}

posted on
2019-12-26 16:53 
代码9527 
阅读(304
评论(0
编辑 
收藏 
举报

 

版权声明:本文为like9527原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/like9527/p/12103037.html

java下载打包下载文件 - 代码9527的更多相关文章

  1. 高通/苹果/联发科:手机CPU那些事 – cn2022

    高通/苹果/联发科:手机CPU那些事 高通/苹果/联发科:手机CPU那些事   这里说的CPU并不局限于狭义的 […]...

  2. tf多值离散embedding方法 – 江枫1

    tf多值离散embedding方法 https://www.jianshu.com/p/4a7525c018b […]...

  3. 如何用SQL语句给表增加字段? 如何分区视图? – 破曉之陽

    如何用SQL语句给表增加字段? 如何分区视图? 如何用SQL语句给表增加字段? ALTER   TABLE   […]...

  4. 关于kafka中ISR、AR、HW、LEO、LSO、LW的含义详解 – RICH-ATONE

    关于kafka中ISR、AR、HW、LEO、LSO、LW的含义详解 一、kafka replication  […]...

  5. 贴片电阻的识别 – jacob1934

    贴片电阻的识别 当片式电阻阻值精度为±5[%]时,采用三个数字表示:  跨接线记为000;  阻值小于10Ω的 […]...

  6. python开发最受欢迎的十款工具 – 无名小妖

    python开发最受欢迎的十款工具 python开发最受欢迎的十款工具 dreamyla3个月前 今天小编给正 […]...

  7. 【PyImageSearch】Ubuntu16.04使用OpenCV3.3.0实现图像分类 – 王老头

    【PyImageSearch】Ubuntu16.04使用OpenCV3.3.0实现图像分类   这篇博文将会展 […]...

  8. flask + Python3 实现的的API自动化测试平台—- IAPTest接口测试平台(总结感悟篇)

               前言:      在前进中去发现自己的不足,在学习中去丰富自己的能力,在放弃时想想自己最 […]...

随机推荐

  1. 归并排序就这么简单

    归并排序就这么简单 从前面已经讲解了冒泡排序、选择排序、插入排序,快速排序了,本章主要讲解的是归并排序,希望大 […]...

  2. 人工智能——极大极小算法+αβ剪枝

    参考博客[https://blog.csdn.net/sacredness/article/details/9 […]...

  3. Python之Django rest_Framework框架认证源码分析

    #!/usr/bin/env python # -*- coding:utf-8 -*- from rest_ […]...

  4. Hadoop MapReduce作业执行流程

    整个 Hadoop MapReduce 的作业执行流程如图 1 所示,共分为 10 步。图 1 Hadoop MapReduce的作业执行流程1. 提交作业客户端向 JobTracker 提交作业。首先,用户需要将所有应该配置的参数...

  5. 微信第三方登陆,无需注册一键登录,获取用户信息,PHP实现方法

    今天讲讲利用微信oauth2实现第三方登陆的实现方法.   先说说前提吧!   首先你得是服务号,并且是经过认 […]...

  6. 若依管理系统RuoYi-Vue(三):代码生成器原理和实战

    本篇文章将会介绍ruoyi-vue代码生成器的使用方法、原理介绍以及独立版代码生成器的封装 历史文章 若依管理 […]...

  7. 如何处理iOS中照片的方向

    原文地址: http://www.cocoachina.com/ios/20150605/12021.html […]...

  8. modelsim 10.0a 破解安装

    modelsim 10.0a 破解安装   第一步,从modelsim的官网www.modelsim.com下 […]...

展开目录

目录导航