vue+java如何实现文件打包下载功能, 点击打包下载,下载整个目录树,就是一级目录包含多个下级目录,目录下有对应的文件
功能:
目前做到这里:
目录和文件都是从数据库表里读取的
所有的文件在服务器读取然后临时打个zip包,然后将zip的流返回给前端
我想想法是每个栏目看成是一个节点,每个pdf看成是该栏目的数据,每个节点都设置一个父id,数据库中存储的是文件的名称,便利的时候先获取到最上面的父id的名称,然后递归便利出所有的文件名称,使用vue的数据绑定和数组的这样就可以展示出来所有名字,下载的时候,先上传文件夹的层级关系,然后递归创建文件夹,可以创建临时目录吧文件复制进去,最后打包。这个可以使用fastfdfs来做
前端传过下载文件编号,在数据库中根据编号查出对应文件存储的路径,根据路径将文件写入到HttpServletResponse中,设置文本传输类型为二进制流response.setContentType("APPLICATION/OCTET-STREAM"),将其返回给前端。
详情,你可参考这篇博文讲解,期望对你有所帮助:https://blog.csdn.net/Wulawuba/article/details/123835721
1、前端还是展示为主的,表面看上去是一个文件,一个压缩包,其实都是图标,图片
2、那么展示的内容呢,层级,哪怕是树的形状,都是服务端用一定的数据结构返回给前端的;
3、一旦用户点击下载,其实是在向服务端发送一个请求,请求的要么是这个文件的地址,要么就是服务端以流的形式返回来,供用户通过浏览器进行下载
所有的文件在服务器读取
可以使用java的ZipOutputStream
此流用于以 ZIP 文件格式写入文件,包括对压缩和未压缩条目的支持,也就是打包成压缩zip包,常用于附件下载(多文件下载),文件压缩存储。
//多个文件,压缩成zip后下载
@PostMapping("/downloadZip")
public void downloadMoreFile(@RequestBody userVo userVo, HttpServletResponse response) {
List<File> files1 = new ArrayList<>();
for (int i = 0; i <userVo.getUserEntityList().size() ; i++) {
File file = new File(userVo.getUserEntityList().get(i).getName());
files1.add(file);
}
System.out.println(files1);
String zipTmp = "D:\\home\\1.zip";
zipd(zipTmp,files1,response);
}
public void zipd(String zipTmp,List<File> files,HttpServletResponse response){
File zipTmpFile = new File(zipTmp);
try {
if (zipTmpFile.exists()) {
zipTmpFile.delete();
}
zipTmpFile.createNewFile();
response.reset();
// 创建文件输出流
FileOutputStream fous = new FileOutputStream(zipTmpFile);
ZipOutputStream zipOut = new ZipOutputStream(fous);
zipFile(files, zipOut);
zipOut.close();
fous.close();
downloadZip(zipTmpFile, response);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
//files打成压缩包
public void zipFile(List files, ZipOutputStream outputStream) {
int size = files.size();
for (int i = 0; i < size; i++) {
File file = (File) files.get(i);
zipFile(file, outputStream);
}
}
public void zipFile(File inputFile, ZipOutputStream ouputStream) {
try {
if (inputFile.exists()) {
if (inputFile.isFile()) {
FileInputStream IN = new FileInputStream(inputFile);
BufferedInputStream bins = new BufferedInputStream(IN, 512);
ZipEntry entry = new ZipEntry(inputFile.getName());
ouputStream.putNextEntry(entry);
int nNumber;
byte[] buffer = new byte[512];
while ((nNumber = bins.read(buffer)) != -1) {
ouputStream.write(buffer, 0, nNumber);
}
bins.close();
IN.close();
} else {
try {
File[] files = inputFile.listFiles();
for (int i = 0; i < files.length; i++) {
zipFile(files[i], ouputStream);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static HttpServletResponse downloadZip(File file, HttpServletResponse response) {
if (file.exists() == false) {
System.out.println("待压缩的文件目录:" + file + "不存在.");
} else {
try {
// 以流的形式下载文件。
InputStream fis = new BufferedInputStream(new FileInputStream(file.getPath()));
byte[] buffer = new byte[fis.available()];
fis.read(buffer);
fis.close();
// 清空response
response.reset();
OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
response.setContentType("application/octet-stream");
// 如果输出的是中文名的文件,在此处就要用URLEncoder.encode方法进行处理
response.setHeader("Content-Disposition",
"attachment;filename=" + new String(file.getName().getBytes("GB2312"), "ISO8859-1"));
toClient.write(buffer);
toClient.flush();
toClient.close();
} catch (Exception ex) {
ex.printStackTrace();
} finally {
try {
File f = new File(file.getPath());
// f.delete();
} catch (Exception e) {
e.printStackTrace();
}
}
}
return response;
}
您的采纳就是对我最大的动力!!!