aclyyx's Blog

aclyyx's Blog

nginx没有写入权限导致导出(下载)大文件出错

2025-12-01

问题描述

一个奇怪的问题,查询功能的Excel文件导出功能,在正式环境中当查询结果数据不多时导出文件完全没有问题,可一旦查询结果条数到了几千条时,导出就会报错。

此时,Java后台程序错误信息为:

com.alibaba.excel.exception.ExcelGenerateException: Can not close IO.
	at com.alibaba.excel.context.WriteContextImpl.finish(WriteContextImpl.java:420)
	at com.alibaba.excel.write.ExcelBuilderImpl.finish(ExcelBuilderImpl.java:99)
	at com.alibaba.excel.ExcelWriter.finish(ExcelWriter.java:143)
	at com.alibaba.excel.write.builder.ExcelWriterSheetBuilder.doWrite(ExcelWriterSheetBuilder.java:63)
	... ...
Caused by: java.io.IOException: This archive contains unclosed entries.
	at org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream.finish(ZipArchiveOutputStream.java:467)
	at org.apache.poi.xssf.streaming.SXSSFWorkbook.injectData(SXSSFWorkbook.java:419)
	at org.apache.poi.xssf.streaming.SXSSFWorkbook.write(SXSSFWorkbook.java:959)
	at com.alibaba.excel.context.WriteContextImpl.finish(WriteContextImpl.java:381)
	... ...

Bingo !

最后在这里找到了答案

也可能是缓存写入权限问题,例如Nginx缓存。我的情况是本地导出10多万条数据正常,但是测试环境6000条就会出现 This archive contains unclosed entries ,少量数据却可以,这让我感到很诧异。一开始也怀疑过网关超时、熔断等,但后面发现一点导出按钮就直接出现报错了,说明不是超时的问题,更不可能是内存不够。后面经过询问运维小伙伴得知,是Nginx的缓存写入没有权限,所以无法导出,那为什么少量数据可以呢?因为数据量很少的情况下不需要用到缓存。即在导出数据量很大时,数据会先暂存到Nginx缓存中,再由缓存一点点传给浏览器最终生成完整的Excel文件。

似乎是在 Linux 中 nginx 权限导致,当时安装和运行 nginx 的用户有问题,导致 nginx 没有缓存写入权限,将权限问题解决就可以了