springboot 下载文件(多目录下载)

190 阅读1分钟

前言

在日常的开发中,会遇到批量下载文件的需要,但是在特殊情况下,需要按照一定的层级目录来下载文件,看到这个问题,该如何处理呢,在本文中,将采用图文结合的方式来实现这样的功能。

需要引入的依赖


<!-- 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>


代码实现

输出的效果如图所示:

图片.png

图片.png

图片.png

代码如下所示:



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());
    }

}