Spring Content 1.2.5下载docx文件变为Zip归档问题如何解决
Spring Content docx文件下载识别为ZIP问题修复方案
问题根因
docx格式本质是ZIP压缩结构,Spring Content默认使用二进制内容头做MIME类型推断时,会优先识别为application/zip,覆盖你存储时设置的正确MIME类型,导致浏览器识别为压缩包而非Word文档。
可行修复方案
方案1:自定义下载接口,强制指定响应头(最稳妥)
不用Spring Content自动生成的默认下载端点,自行实现下载逻辑,直接复用你存储文件时写入数据库的MIME类型和文件名,避免自动推断:
@RestController @RequestMapping("/custom-docx") public class DocxDownloadController { @Autowired private FileEntityRepository fileRepository; @Autowired private FileContentStore contentStore; @GetMapping("/{fileId}/download") public void downloadDocx(@PathVariable Long fileId, HttpServletResponse response) throws IOException { // 从数据库查询你存储的文件元数据 FileEntity file = fileRepository.findById(fileId) .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "文件不存在")); // 直接使用你存储时保存的正确MIME类型,不做自动推断 response.setContentType(file.getMimeType()); // 指定文件名和后缀,避免浏览器自动修改后缀为zip response.setHeader("Content-Disposition", "attachment;filename*=utf-8''" + URLEncoder.encode(file.getFileName(), StandardCharsets.UTF_8.name())); // 输出文件流 IOUtils.copy(contentStore.getContent(file), response.getOutputStream()); response.flushBuffer(); } }
方案2:修改MIME推断规则,兼容默认端点
如果你要保留Spring Content自动生成的REST端点,可以自定义Tika推断规则,强制docx优先识别为Word格式:
- 新增Tika配置类:
@Configuration public class TikaMimeConfig { @Bean public Tika customTika() throws TikaException, IOException { TikaConfig defaultConfig = TikaConfig.getDefaultConfig(); MimeTypes mimeRepo = defaultConfig.getMimeRepository(); // 注册docx格式的优先识别规则 MimeType docxMime = mimeRepo.forName("application/vnd.openxmlformats-officedocument.wordprocessingml.document"); docxMime.addExtension("docx"); // 提升docx类型的推断优先级,高于zip类型 mimeRepo.addPattern(docxMime, "*.docx", true); return new Tika(defaultConfig); } }
- 配置application.yml关闭自动类型推断 fallback:
spring: content: rest: mime-types: use-registered-only: true
两种方案都可以实现下载时直接返回application/vnd.openxmlformats-officedocument.wordprocessingml.document类型的响应,浏览器会自动识别为Word文档,不会显示为zip压缩包。
内容的提问来源于stack exchange,提问作者leonaugust
相关产品推荐
相关产品推荐

