SpringMVC-文件的上传与下载与servlet原生的上传和下载功能的思路一样,只不过它们的写法有区别,涉及到IO流。
**文件下载:把文件从服务器复制(下载)到浏览器**
**文件上传:把文件从浏览器复制到服务器**
一、文件下载
**其实,下载功能,**比如你在浏览器下载图片,只需右键另存,就是说好多浏览器已经自带了。
但是,我们还是要学一下的嘛!
**实现文件的下载,需要使用到ResponseEntity类型:** 用在控制器方法的返回值类型,那么该控制器的返回值就是响应到浏览器的响应报文。(其实就是说,下载只需要把响应报文的响应体设置为“我们要下载的文件”,就可以响应到浏览器!)
1.先导入一张图片:
2、index.html上写入跳转链接
3、在Controller层执行以下代码(这个是一个模板,可直接套用!!路径做修改就好!!)
实现文件的下载,需要使用到ResponseEntity类型
ResponseEntity:可以作为控制器方法的返回值,表示响应到浏览器的完整的响应报文
@Controller
public class FileUpAndDownController {
@RequestMapping("/test/down")
public ResponseEntity<byte[]> testResponseEntity(HttpSession session) throws
IOException {
//获取ServletContext对象
ServletContext servletContext = session.getServletContext();
//获取服务器中文件的真实路径
String realPath = servletContext.getRealPath(“img”);
realPath = realPath + File.separator + “csdn.jpg”;
//创建输入流
InputStream is = new FileInputStream(realPath);
//创建字节数组,is.available()获取输入流所对应文件的字节数(把字节全部获取)
byte[] bytes = new byte[is.available()];
//将流读到字节数组中,文件的字节下载到浏览器
is.read(bytes);
//创建HttpHeaders对象设置响应头信息
MultiValueMap<String, String> headers = new HttpHeaders();
// 设置要下载方式以及下载文件的名字。
// Content-Disposition:设置下载文件的下载方式
// attachment:以附件的方式进行下载
// ;filename=1.jpg:设置下载文件默认的名字
headers.add(“Content-Disposition”, “attachment;filename=csdn.jpg”);
//设置响应状态码,(.OK,响应码为200,成功)
HttpStatus statusCode = HttpStatus.OK;
//创建ResponseEntity对象
ResponseEntity<byte[]> responseEntity = new ResponseEntity<>(bytes, headers, statusCode);//响应体、响应头、响应状态码
//关闭输入流
is.close();
return responseEntity;
}
}
二、文件上传
1、在index.xml设置form表单,提交按钮。
注意:要求form表单的请求方式必须为post,并且添加属性enctype="multipart/form-data"
解析:enctype属性:浏览器向服务器传输请求参数的方式("multipart/form-data":表单中的内容以二进制的方式提交到服务器当中 "application/x-www-form-urlencoded":传输到服务器只有数据、没有文件的)
2、控制器方法:
@Controller
public class FileUpAndDownController {
@RequestMapping("/test/up")
/*MultipartFile是SpringMVC提供简化上传操作的工具类*/
public String testup(MultipartFile photo,HttpSession session) throws IOException {
/*获取上传的文件的文件名*/
String fileName = photo.getOriginalFilename();/*要配置上传文件解析器噢!不然是无法获取!具体在下面解释。MultipartFile photo*/
/*获取ServletContext对象*/
ServletContext servletContext = session.getServletContext();
/*获取当前工程下photo目录的真实路径 photoPath:pring_mvc_ajax-1.0-SNAPSHOT*/
String photoPath = servletContext.getRealPath("photo");
/*创建photoPath所对应的file对象,创建在war包下*/
File file = new File(photoPath);
/*判断file所对应目录是否存在*/
if(!file.exists()){
file.mkdir();
}
/*上传文件的最终路径*/
String finalPath = photoPath + File.separator +fileName;
/*实现文件上传*/
photo.transferTo(new File(finalPath));
return "success";
}
MultipartFile需要文件上传解析器(必须通过文件解析器的解析才能将文件转换为MultipartFile对象)
在springmvc.xml上添加:
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
添加依赖:用于解析HTTP请求中上传的文件数据。这个库提供了一种简单易用的方式来处理文件上传,包括处理单个文件和多个文件上传。通过引入这个依赖项,你可以在你的Maven项目中使用commons-fileupload库提供的功能。
commons-fileupload commons-fileupload 1.3.1成功运行: