java spring boot 批量下载文件
文件在数据库中以二进制文件流形式存储,单个导出
@GetMapping("/exportFile") public void download(@RequestParam String id, HttpServletResponse response) throws IOException { // todo 判断文件是否存在 Files files = filesService.getById(id); if (files == null) { response.getWriter().write("文件不存在!"); return; } // 获取文件名和文件格式 String fileName = files.getFileName() + files.getFileSuffix(); // 设置文件名称和文件格式 response.setContentType("application/vnd.ms-excel;charset=utf-8"); response.setHeader("Content-disposition", "attachment; filename=" + URLEncoder.encode(fileName, "utf-8")); byte[] document = files.getFile(); try (InputStream inputStream = new ByteArrayInputStream(document); ServletOutputStream outputStream = response.getOutputStream()) { int len = 0; byte[] buf = new byte[1024]; while ((len = inputStream.read(buf, 0, 1024)) != -1) { outputStream.write(buf, 0, len); } outputStream.flush(); } catch (Exception e) { e.printStackTrace(); } }
批量导出
public void batchExport(String ids, HttpServletResponse response) throws IOException { List<String> idList = StringUtils.str2List(ids, ",", true, true); List<String> isExists = new ArrayList<>(); // 根据所传id判断文件是否存在,只下载数据库中存在的文件 for (String value : idList) { if ((filesService.count(Long.valueOf(value))) == 1) { isExists.add(value); } } // 若根据所传id均找不到文件,返回提示信息 if (isExists.size() == 0) { response.getWriter().write("文件不存在"); return; } // 设置导出压缩包的名称 以P开头 中间为下载时间 后缀为zip String ZipFileName = "P" + Utils.dataForMart("2") + ".zip"; response.setHeader("Content-disposition", "attachment; filename=" + URLEncoder.encode(ZipFileName, "utf-8")); response.setContentType("application/zip;charset=UTF-8"); ZipOutputStream zipOut = new ZipOutputStream(response.getOutputStream()); for (String s : idList) { Files files = filesService.getById(s); String fileName = files.getFileName() + files.getFileSuffix(); ZipEntry zipEntry = new ZipEntry(fileName); zipOut.putNextEntry(zipEntry); byte[] bytes = files.getFileBinary(); zipOut.write(bytes, 0, bytes.length); } zipOut.close(); }