今天在做文件上传的时候,同时需要做下载的功能,上传使用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
欢迎关注我公众号: