我的下载代码:
@RequestMapping("/doc/downloadDocument") public ResponseEntity<byte[]> download(String fileName) throws IOException{ File file = new File(getDir(),fileName); if (file.exists()){ //如果文件存在 HttpHeaders httpHeaders = new HttpHeaders(); //设置文件下载的描述信息 String downloadFileName = new String(file.getName().getBytes("UTF-8"),"iso-8859-1"); httpHeaders.setContentDispositionFormData("attachment",downloadFileName); //设置响应的内容是流----二进制 httpHeaders.setContentType(MediaType.APPLICATION_OCTET_STREAM); return new ResponseEntity<>( FileUtils.readFileToByteArray(file), httpHeaders, HttpStatus.OK); }else { return null; } }
下载的图片是损坏的,文本文档的话内容混乱,excel文件则提示文件已损坏.是哪里有问题吗? 而且,下载的文件体积会变大
目测是下载时出问题了,但不知道是啥问题,,求解决
问题解决了.我用了fastjson替换掉了默认的jackson,不知道是不是这原因,别人用默认的没问题.需要在fastjson配置前加上几句话配置spring消息转换器.问题解决.下载文件出错是因为编码格式的问题.
<mvc:annotation-driven> <!--不使用默认消息转换器 --> <mvc:message-converters register-defaults="false"> <!--spring消息转换器 --> <bean class="org.springframework.http.converter.StringHttpMessageConverter"/> <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"/> <bean class="org.springframework.http.converter.BufferedImageHttpMessageConverter"/>
<!--解决@Responcebody中文乱码问题 -->
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<constructor-arg value="UTF-8"></constructor-arg>
</bean>
<!--配合fastjson支持 -->
<bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
<property name="defaultCharset" value="UTF-8"></property>
<property name="supportedMediaTypes">
<list>
<!--顺序保持这样,避免IE下载出错 -->
<value>text/html;charset=UTF-8</value>
<value>application/json</value>
</list>
</property>
<property name="fastJsonConfig" ref="fastJsonConfig"></property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven></code></pre>
######
FileUtils.readFileToByteArray
该函数的代码呢?######FileUtils用的是org.apache.commons.io.FileUtils这个方法######
引用来自“MStarLight”的评论
FileUtils.readFileToByteArray
该函数的代码呢?
public static byte[] readFileToByteArray(File file) throws IOException {
InputStream in = null;
try {
in = openInputStream(file);
return IOUtils.toByteArray(in, file.length());
} finally {
IOUtils.closeQuietly(in);
}
}
######一个比较简单的检查方式..下载一个比较小的纯文本(最好在一行内能看完,不然调试看着累),然后打断点,逐步调试。方可解决。######好,我试试######哈
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。