前言
在日常的开发中,会遇到批量下载文件的需要,但是在特殊情况下,需要按照一定的层级目录来下载文件,看到这个问题,该如何处理呢,在本文中,将采用图文结合的方式来实现这样的功能。
需要引入的依赖
<!-- commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.8.0</version>
</dependency>
<!-- hutool -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.7.21</version>
</dependency>
代码实现
输出的效果如图所示:
代码如下所示:
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.StrUtil;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.apache.commons.io.IOUtils;
import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.util.Date;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
@Controller
@RequestMapping(value = "down" )
public class DownController {
@GetMapping(value = "load" )
public void download(HttpServletResponse response) throws Exception {
// 获取输出流和 zip 包输出流
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ZipOutputStream zip = new ZipOutputStream(outputStream);
// 获取当前项目的路径
String property = System.getProperty("user.dir" );
// 压缩包的名称
String root = "result";
// 处理需要处理的文件路径,并填充文件的名称
zip.putNextEntry(new ZipEntry(root + "/data/123.sql" ));
IOUtils.write(FileUtil.readBytes(new File(property + "/script/data.sql" )), zip);
zip.flush();
zip.closeEntry();
zip.putNextEntry(new ZipEntry(root + "/data1/123.sql" ));
IOUtils.write(FileUtil.readBytes(new File(property + "/script/data.sql" )), zip);
zip.flush();
zip.closeEntry();
zip.putNextEntry(new ZipEntry(root + "/data2/123.sql" ));
IOUtils.write(FileUtil.readBytes(new File(property + "/script/data.sql" )), zip);
zip.flush();
zip.closeEntry();
zip.putNextEntry(new ZipEntry(root + "/data2/dt/123.sql" ));
IOUtils.write(FileUtil.readBytes(new File(property + "/script/data.sql" )), zip);
zip.flush();
zip.closeEntry();
// 生成输出流
IOUtils.closeQuietly(zip);
genCode(response, outputStream.toByteArray());
}
/**
* 生成zip文件
*/
private void genCode(HttpServletResponse response, byte[] data) throws IOException {
// 生成压缩文件的名称
String idStr = DateUtil.format(new Date(), "HHmmss" );
String format = StrUtil.format("attachment; filename="result{}.zip"", idStr);
response.reset();
response.addHeader("Access-Control-Allow-Origin", "*" );
response.addHeader("Access-Control-Expose-Headers", "Content-Disposition" );
response.setHeader("Content-Disposition", format);
response.addHeader("Content-Length", "" + data.length);
response.setContentType("application/octet-stream; charset=UTF-8" );
IOUtils.write(data, response.getOutputStream());
}
}