摘要: springmvc 实现文件下载 ResponseEntity 松耦合
1、controller实现
@RequestMapping("download")
public ResponseEntity<byte[]> download() throws IOException {
HttpHeaders headers = new HttpHeaders();
// headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
//设置文件名
headers.setContentDispositionFormData("attachment", "a.xls");
String file = TestController.class.getResource("/config/").getPath()+"a.xls";
//把文件转成字节数组
File byteFile = new File(file);
int size = (int) byteFile.length();
FileInputStream inputStream = new FileInputStream(byteFile);
byte[] bytes = new byte[size];
int offset=0;
int readed;
while(offset<size && (readed = inputStream.read(bytes, offset,inputStream.available() )) != -1){
offset+=readed;
}
inputStream.close();
//返回
return new ResponseEntity<byte[]>(bytes,headers, HttpStatus.OK);
}
2、在springmvc.xml配置里面如果配置了messageConverters,则要加上ByteArrayHttpMessageConverter
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<list>
<!-- add ByteArrayHttpMessageConverter here -->
<bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"/>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/plain;charset=UTF-8</value>
<value>text/html;charset=UTF-8</value>
</list>
</property>
</bean>
<bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>application/json;charset=UTF-8</value>
</list>
</property>
</bean>
</list>
</property>
</bean>
因为在xml里配置了AnnotationMethodHandlerAdapter,则会覆盖掉AnnotationMethodHandlerAdapter源码中默认的ByteArrayHttpMessageConverter,造成下载文件乱码