手把手教你用SpringBoot將文件打包成zip存放或導出

環境準備

其實也沒什麼準備,準備好Springboot就行,還有幾張圖片:

在這裡插入圖片描述

將文件打包成Zip存放

代碼

Controller代碼:

@RequestMapping("/zip")
@RestController
public class ZipController {

    /**
     * 將文件打包成zip並存放在特定位置
     */
    @PostMapping("package")
    public void packageFileToZip() throws IOException {
        // 為瞭方便我直接將文件地址寫好瞭,各位可以根據自己的情況修改
        String[] filePath = new String[]{"E:\\ykds\\1068128498917799516.jpg", "E:\\ykds\\1068128498917917980.jpg", "E:\\ykds\\1068128498917807874.jpg"};
        // 將需要打包的文件都放在一個集合中
        List<File> fileList = new ArrayList<>();
        for (String s : filePath) {
            File file = new File(s);
            fileList.add(file);
        }
        // 先在D盤創建一個壓縮包
        File zipFile = new File("D:\\package.zip");
        if(!zipFile.exists())
            zipFile.createNewFile();
        // 將package.zip的File對象傳到toZip對象中
        ZipUtils.toZip(fileList, zipFile);
    }
}

ZipUTils工具類代碼

public class ZipUtils {

    /**
     * 把文件集合打成zip壓縮包
     * @param srcFiles 壓縮文件集合
     * @param zipFile  zip文件名
     * @throws RuntimeException 異常
     */
    public static void toZip(List<File> srcFiles, File zipFile) throws IOException {
        if(zipFile == null){
            return;
        }
        if(!zipFile.getName().endsWith(".zip")){
            return;
        }
        ZipOutputStream zos = null;
        FileOutputStream out = new FileOutputStream(zipFile);
        try {
            zos = new ZipOutputStream(out);
            for (File srcFile : srcFiles) {
                byte[] buf = new byte[BUFFER_SIZE];
                zos.putNextEntry(new ZipEntry(srcFile.getName()));
                int len;
                // 讀取文件並寫入到zip中
                FileInputStream in = new FileInputStream(srcFile);
                while ((len = in.read(buf)) != -1) {
                    zos.write(buf, 0, len);
                    zos.flush();
                }
                in.close();
            }

        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            if (zos != null) {
                zos.close();
            }
        }
    }
}

測試

代碼打好瞭,接下來測試下,打開熟悉的postman:

在這裡插入圖片描述

調用接口後就會在D盤中新建一個package.zip的壓縮包:

在這裡插入圖片描述

可以看到,我打包的文件都在這裡,再看看能不能正常顯示:

在這裡插入圖片描述

very good!

將文件打包成zip並導出

上面的方法隻是將壓縮包保存在本地,如果需要導出的話代碼有點不一樣。

代碼

Controller代碼:

/**
     * 將文件打包成zip並下載
     */
    @PostMapping("download")
    public void download(HttpServletResponse response) throws IOException {
        // 這裡還是和上面一樣
        String[] filePath = new String[]{"E:\\ykds\\1068128498917799516.jpg", "E:\\ykds\\1068128498917917980.jpg", "E:\\ykds\\1068128498917807874.jpg"};
        List<File> fileList = new ArrayList<>();
        for (String s : filePath) {
            File file = new File(s);
            fileList.add(file);
        }
        response.setHeader("content-type", "application/octet-stream");
        response.setContentType("application/octet-stream");
        response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=download.zip");
        ZipUtils.downloadZip(response.getOutputStream(), fileList);
    }

ZipUtils工具類代碼

public static void downloadZip(OutputStream outputStream, List<File> fileList){
        BufferedInputStream bufferedInputStream = null;
        ZipOutputStream zipOutputStream = null;
        try {
            zipOutputStream = new ZipOutputStream(outputStream);
            for (File file : fileList) {
                ZipEntry zipEntry = new ZipEntry(file.getName());
                zipOutputStream.putNextEntry(zipEntry);
                byte[] buf = new byte[BUFFER_SIZE];
                int len;
                FileInputStream in = new FileInputStream(file);
                while ((len = in.read(buf)) != -1) {
                    zipOutputStream.write(buf, 0, len);
                    zipOutputStream.flush();
                }
            }
            zipOutputStream.flush();
            zipOutputStream.close();

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 關閉流
            try {
                if (bufferedInputStream != null) {
                    bufferedInputStream.close();
                }
                if (zipOutputStream != null ) {
                    zipOutputStream.close();
                }
                if (outputStream != null) {
                    outputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }

測試

還是用postman:

在這裡插入圖片描述
在這裡插入圖片描述

下載完成後打開看看

在這裡插入圖片描述

到此這篇關於手把手教你用SpringBoot將文件打包成zip存放或導出的文章就介紹到這瞭,更多相關SpringBoot將文件打包成zip內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!