第一种 :是用项目的工作空间做为临时存储,优点可以节省内存空间,缺点就是可能没有权限操作项目路径。所以需要注意是否能操作项目路径。
@PostMapping("downloadForZipInputStream")
@ApiOperation("文件预览 返回 inputStream 流")
public R<byte[]> downloadForZipInputStream(@RequestBody List<String> attachmentIds, HttpServletResponse response) {
String uuId = UUID.randomUUID()+".zip";
// 这一步是获取工作空间 为了避免压缩文件名称重复,所以用uuid来命名反正最后要删除的
String location = System.getProperty("user.dir") +"/"+ uuId;
try (FileOutputStream fileOutputStream = new FileOutputStream(location);
ZipOutputStream zipOutputStream = new ZipOutputStream(fileOutputStream);) {
byte[] bufs = new byte[1024 * 10];
setZipOutputStream(attachmentIds, zipOutputStream, bufs);
return R.ok(bufs);
} catch (IOException e) {
log.error("downloadForZipInputStream Convert file to zipInputStream failed exception : {}", e);
throw new ServiceException("返回inputStream失败");
}finally {
// 删除本地文件
//下载完成,删掉zip包
File fileTempZip = new File(location);
fileTempZip.delete();
}
}
/**
* 获取文件信息,压缩文件,并写入压缩流
* @param attachmentIds
* @param zipOutputStream
* @param bufs
*/
private void setZipOutputStream(List<String> attachmentIds, ZipOutputStream zipOutputStream, byte[] bufs) {
// 这是存贮 文件关系的表
List<FileUpload> fileUploads = fileService.listByIds(attachmentIds);
for (FileUpload fileInfo : fileUploads) {
Assert.notNull(fileInfo, "该文件不存在");
try (InputStream inputStream = uploadContext.download(fileInfo);// 获取minio中的流然后在操作
BufferedInputStream bis = new BufferedInputStream(inputStream, 1024 * 10)) {
String streamfilename = fileInfo.getFilename();
// 创建ZIP实体,并添加进压缩包 这个就是压缩过程了
ZipEntry zipEntry = new ZipEntry(streamfilename);
zipOutputStream.putNextEntry(zipEntry);
int read = 0;
while ((read = bis.read(bufs, 0, 1024 * 10)) != -1) {
zipOutputStream.write(bufs, 0, read);
}
} catch (Exception e) {
log.error("downloadForZipInputStream Convert file to zipInputStream failed exception : {}", e);
continue;
}
}
}
第二种 :通过内存来压缩文件,缺点:如果有较大的文件需要压缩,对硬件有一定的需求。
@PostMapping("minio/getZipInputStream")
@ApiOperation("文件预览 返回 inputStream 流")
public byte[] getZipInputStream(@RequestBody List<String> attachmentIds, HttpServletResponse response) {
// 如果不需要返回前端可以这样写
// ByteArrayOutputStream out = new ByteArrayOutputStream();
// ZipOutputStream zipOutputStream= new ZipOutputStream(out);
try (ZipOutputStream zipOutputStream = new ZipOutputStream(response.getOutputStream());) {
byte[] bufs = new byte[1024 * 10];
for (String attachmentId : attachmentIds) {
FileUpload fileInfo = fileService.getById(attachmentId);
Assert.notNull(fileInfo, "该文件不存在");
try (InputStream inputStream = uploadContext.download(fileInfo);
BufferedInputStream bis = new BufferedInputStream(inputStream, 1024 * 10)) {
String streamfilename = fileInfo.getFilename();
// 创建ZIP实体,并添加进压缩包
ZipEntry zipEntry = new ZipEntry(streamfilename);
zipOutputStream.putNextEntry(zipEntry);
int read = 0;
while ((read = bis.read(bufs, 0, 1024 * 10)) != -1) {
zipOutputStream.write(bufs, 0, read);
}
} catch (Exception e) {
continue;
}
}
return bufs;
} catch (IOException e) {
throw new RuntimeException(e);
}
}
工作随手记