Spring MVC 下载文件时文件内容乱码问题
今天在做文件上传的时候,同时需要做下载的功能,上传使用Spring的上传功能很方便,以参数的形式就可以接收到文件,直接调用transferTo保存文件就可以了。但是做下载功能的时候需要返回文件流,就遇到问题了,文件名没问题,下载也正常,但是内容就是一串字母数字,类似MD5的字符串。
下载的代码如下:
@ResponseBody
@RequestMapping(value = "/download")
public ResponseEntity<?> downloadFile(@RequestParam("fileUrl") String fileUrl) throws IOException {
System.out.println(fileUrl);
File file = new File(basePath+ "/" + fileUrl);
//处理显示中文文件名的问题
String fileName = new String(file.getName().getBytes("utf-8"),"ISO-8859-1");
//设置请求头内容,告诉浏览器代开下载窗口
HttpHeaders headers = new HttpHeaders();
headers.setContentDispositionFormData("attachment",fileName );
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
return new ResponseEntity<>( FileUtils.readFileToByteArray(file),
headers, HttpStatus.CREATED);
}
本以为文件下载下来没问题了,但是内容却不一样。
例如一个正常的txt文件,下载下来就是如下内容:
"uvrOqCAwMTM4MDE2OQ0KzfTIqLflIDQ1MTg5Ng0Kwbq3ySAwMTM3NzAyMQ0KwO7S7SAwMTM3Nzk0NA0K0vzUvtDLIDAxMzczMzQ5DQrSpsP3IDAxMzc3ODgyDQrDt7jVIDAxMzc3ODUwDQrQ3LrsIDAxMzgwNzgzDQqzws7AueMgMDEzNzc4NDYNCsHWwPbB4SAwMTM3Nzk1NQ0K"
在网上找了很多方法,发现基本都没说乱码问题,都是文件名乱码。原因也分析得不对。Google了很久终于找到了原因。
原来 appingJacksonHttpMessageConverter 这个文件有问题,配置不对,由于优先级问题,没有调用到正确的方法。具体原因可以参考下面的参考网址。
解决方法,在MVC配置JSON中加入额外的配置
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<list>
<!--把ByteArray加在Json前面,下载文件需要,否则文件内容出现乱码-->
<bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"/>
<bean id="jsonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" >
<property name = "supportedMediaTypes">
<list>
<value>text/plain;charset=UTF-8</value>
</list>
</property>
</bean>
</list>
</property>
</bean>
再测试文本和图片都没有问题了。
ref.
http://www.iteye.com/topic/1125784
欢迎关注我公众号:
