springmvc ResponseEntity 下载文件损坏问题解决方法

本文介绍了一个关于使用SpringMVC进行文件下载时遇到的问题及解决方案。主要问题是下载后的文件无法打开,通过调整配置文件中消息转换器的顺序解决了该问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这两天做一个文件下载功能,基本上使用的就是springmvc的ResponseEntity来做的,这块代码就不贴了,网上大把大把的,问题是下载的文件总是提示【文件损坏】导致打不开,word,excel,zip文件统统打不开,研究来研究去网上答案很多但是都不解决问题,唯一解决问题的就是这个帖子,地址如下:http://www.iteye.com/topic/1125784,作者解决问题的思路也很棒。

好了,不多说了,直接说说问题解决方法吧,主要就是配置文件里的顺序:

<bean
        class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
        <property name="messageConverters">
            <list>
            <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"/>
                <bean
                    class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
                    <property name="supportedMediaTypes">
                        <list>
                            <value>application/json;charset=UTF-8</value>
                            <value>text/json;charset=UTF-8</value>
                            <value>text/html;charset=UTF-8</value>
                        </list>
                    </property>
                </bean>
                <bean
                    class="org.springframework.http.converter.StringHttpMessageConverter">
                    <property name="supportedMediaTypes">
                        <list>
                            <value>text/plain;charset=UTF-8</value>
                        </list>
                    </property>
                </bean>
                
            </list>
        </property>
    </bean>


红色部分要放在MappingJackson2HttpMessageConverter的前面,修改之后问题解决!

你是一名专业的java工程师,在使用springboot结合docx4j,将InputStream流转为word文档时,并将word文档下载到客户端上。通过postman下载下来的中文名称为乱码。以下是代码 InputStream htmlStream = minioUtils.downloadFileByBucketNameAndFileName("", content.split(bucketName)[1]); // 1. 读取 HTML 内容 String html = IOUtils.toString(htmlStream, StandardCharsets.UTF_8); // 2. 创建 Word 文档 WordprocessingMLPackage wordPackage = WordprocessingMLPackage.createPackage(); // 3. 导入 HTML 内容 XHTMLImporterImpl importer = new XHTMLImporterImpl(wordPackage); wordPackage.getMainDocumentPart().getContent().addAll( importer.convert(html, null) ); // 4. 保存到输出流 ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); Docx4J.save(wordPackage, outputStream, Docx4J.FLAG_SAVE_ZIP_FILE); // 3. 设置响应头(处理中文文件名) String fileName = contentMaster.getName() + ".docx"; String encodedFileName = URLEncoder.encode(fileName, "UTF-8") .replaceAll("\\+", "%20"); InputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray()); return ResponseEntity.ok() .header("Content-Disposition", "attachment; filename*=UTF-8''" + encodedFileName + ";" + // RFC5987 " filename=\"" + new String(fileName.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1) + "\"") // 传统兼容 .contentType(MediaType.APPLICATION_OCTET_STREAM) .body(new InputStreamResource(inputStream)); 给出你的解决方案
最新发布
06-27
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值