<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">1、使用虚拟路径方式</span>
1)首先需要配置虚拟路径,将一个url对应到服务器的一个文件夹
2)url + 文件名即可在浏览器上访问服务器中的文件,当浏览器不支持的文件时,浏览器自动下载
此方法有两个弊端: 1)当浏览器支持直接打开文件(如图片)时,文件不会被下载。 ps:可能有办法设置,我不知道
2)下载的文件名与服务器中的文件名是一样的,而存放在服务器中的文件名通常是包含时间信息的长字符串,这样下载下来的文件名就是不是很好
1.2、tomcat 虚拟路径配置
<-- <span style="font-family: Arial, Helvetica, sans-serif;">打开Tomcat7/conf/web.xml,找到</span> -->
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<-- <param-value>处将false改为true -->
<-- 再打开server.xml -->
在</host>之前加入<Context path="/名字" docBase="D:\Tomcat 7.0\文件夹名"/>
2、使用ResponseEntity 方式下载
@RequestMapping("download")
public ResponseEntity<byte[]> download() throws IOException {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
headers.setContentDispositionFormData("attachment", "文件名+文件类型");
return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(File对象), headers, HttpStatus.CREATED);
}
上诉ResponseEntity<byte[]> 构造方法中第一个参数为byte数组类型
当得到的是InputStream时,需要一个方法将InputStream流转换成byte数组
public static byte[] getByteArray(InputStream inputStream) throws IOException {
ByteArrayOutputStream swapStream = new ByteArrayOutputStream();
byte[] buff = new byte[2048];
int bytesRead = 0;
while ((bytesRead = inputStream.read(buff, 0, 100)) > 0) {
swapStream.write(buff, 0, bytesRead);
}
return swapStream.toByteArray();
}
上传使用input的file标签,在后台使用CommonsMultipartFile对象可以直接获取到file,继而进行其他操作