1. 文件上传
SpringMVC通过MultipartResolver来实现文件上传,默认没有装配,使用MultipartResolver需要加上commons-fileupload这个jar包。
1.1 配置MultipartResolver
<!--配置上传文件控件-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"
p:defaultEncoding="UTF-8"//文件编码
p:maxUploadSize="5242880"//文件最大上传大小
p:uploadTempDir="file:/home/rookie/temp"/>//临时存储路径
1.2 编写Controller方法
@RequestMapping("/upload")
public @ResponseBody String upload(@RequestParam("file") MultipartFile file) throws IOException{
if(!file.isEmpty()){
file.transferTo(new File(this.getClass().getClassLoader().getResource("/").getPath()+file.getOriginalFilename()));//将文件从默认目录拷贝
return "success";
}else{
return "redirect:/welcome.jsp";
}
}
1.3 HTML页面编写
<form action="upload" enctype="multipart/form-data" method="post">//enctype和method必须
<input type="file" name="file"/><br/>
<input type="submit" value="upload"/><br/>
</form>
2. 文件下载
将文件发送资源发送到浏览器,需要完成以下几步:
对请求处理方法使用void返回类型,并在方法中添加HttpServletResponse参数。
将响应的内容类型设为文件的内容类型。Content-Type标题在某个实体的body中定义数据类型,并包含媒体类型和子类型标识符。如果不清楚内容类型,并且希望浏览器始终显示另存为对话框,则将他设为application/ectet-stream。
添加一个名为Content-Dispostion的Http响应标题,并赋值attachment;filename=fileName.
(1). 隐藏资源:可以将文件放在WEB-INF目录下,这样只有授权的用户才可以访问
(2).防止交叉引用:获取请求的referer属性,如果该属性值为空或者非预期值,则不将文件返回给浏览器。
Controller编写
@RequestMapping("/download")
public void download(@RequestHeader(value = "referer",defaultValue = "")String referer, HttpServletResponse response) throws IOException{
if("".equals(referer)) {//判断是否为盗链,浏览器直接输入地址无法下载
response.getWriter().write("Invalid Request");
return;
}
response.setContentType("application/javascript");
response.setCharacterEncoding("utf-8");
System.out.println(referer);
response.setHeader("Content-Disposition","attachment;filename=jquery.js");
FileInputStream inputStream=new FileInputStream(this.getClass().getClassLoader().getResource("../../js/jquery-3.2.1.min.js").getPath());//文件为web根目录/js/jquery-3.2.1.min.js
OutputStream outputStream=response.getOutputStream();
byte []bytes=new byte[1024];
while(inputStream.read(bytes)!=-1){
outputStream.write(bytes);
}
outputStream.flush();
outputStream.close();
inputStream.close();
}
总结:使用文件上传的步骤:配置依赖项(commons-fileupload),配置MultipartResolver,在Html页面的表单中注意添加method和enctype属性。文件下载步骤:设置文件头(Content-Disposition)、MIME类型和编码方式,将输入流写到HttpServletResponse的输出流中,最后注意刷新输出流,关闭流。