文件上传都是通过表单形式提交给后台服务器的,因此,要想实现文件上传功能,就需要提供一个文件上传的表单,该表单需要满足下面的3个条件:
(1)form表单的method属性设置为post;
(2)form表单的enctype属性设置为multipart/from-data;
(3)提供< input type = “file” name = “filename” />的文件上传输入框。
项目结构
(1)文件上传的依赖
commons-fileupload commons-fileupload 1.3.1
(2)web.xml
二、文件下载CharacterEncodingFilter org.springframework.web.filter.CharacterEncodingFilter encoding UTF-8 forceResponseEncoding true CharacterEncodingFilter @Controller public class FileUploadAndDowController { //文件上传 @RequestMapping("/fileUpload") public String fileUpload(MultipartFile photo,HttpSession session) throws IOException { //获取上传文件的文件名 String fileName = photo.getOriginalFilename(); //获取上传文件的后缀名 String suffixName = fileName.substring(fileName.lastIndexOf(".")); //将UUID作为文件名 String uuid = UUID.randomUUID().toString(); //将uuid和suffixName拼接即为最终的文件名 fileName = uuid + suffixName; ServletContext servletContext = session.getServletContext(); String photoPath = servletContext.getRealPath("photo"); File file = new File(photoPath); //判断对应的photoPath是否存在 if(!file.exists()){ //弱不存在,则创建目录 file.mkdir(); } String finalPath = photoPath + File.separator + fileName; System.out.println(finalPath); System.out.println("---------------------------------"); //文件上传后的地址 photo.transferTo(new File(finalPath)); System.out.println("-----------------------------------"); return "success"; } }
文件下载就是将文件服务器中华的文件下载到本机上。
两个步骤:
(1)在客户端页面使用一个文件下载的超链接,该链接的href属性要指定后台文件下载的方法及文件名(首先要在需要下载的文件目录中添加一个需要下载的文件);
(2)在后台的Controller类中,使用SpringMVC提供的文件下载方法尽心文件下载。SpringMVC提供了一个ResponseEntity类型的对象,使用它可以很方便地定义返回的HttpHeaders对象和HttpStatus对象,通过这两个对象的设置,即可完成下载文件所需要的配置信息。
(1)file.html
测试文件下载功能
(2)控制器类
FileUploadAndDowController.java
//文件下载
@RequestMapping("/download")
public ResponseEntity fileDownload(HttpSession session) throws Exception {
//获取ServletContext对象
ServletContext servletContext = session.getServletContext();
//指定要下载的文件所在路径
String path = servletContext.getRealPath("/static/img/未来.jpg");
File file = new File(path);
String fileName=new String(file.getName().getBytes("utf-8"),"iso-8859-1"); //解决中文乱码问题
// //创建输入流
// FileInputStream fis = new FileInputStream(path);
// //创建字节数组,获取当前文件的所有可用长度,不能设置为定长的,否则文件比较大时无法下载
// byte[] bytes = new byte[fis.available()];
// //将流读到字节数组中
// fis.read(bytes);
// //创建HttpHeaders对象设置头信息
// HttpHeaders headers = new HttpHeaders();
// //设置下载方式及下载的名字
// headers.add("Content-Disposition","attachment;filename=未来.jpg");
// //设置响应状态码
// HttpStatus statusCode = HttpStatus.OK;
// //创建ResponseEntity对象
// ResponseEntity responseEntity = new ResponseEntity<>(bytes, headers, statusCode);
// //关闭输入流
// fis.close();
//创建HttpHeaders对象设置头信息
HttpHeaders headers=new HttpHeaders();
//设置下载方式及下载的名字
headers.setContentDispositionFormData("attachment", fileName);// aatachment 附件
headers.setContentType(MediaType.IMAGE_PNG);
//创建ResponseEntity对象
ResponseEntity responseEntity=new ResponseEntity(FileUtils.readFileToByteArray(file), headers,HttpStatus.CREATED);
return responseEntity;
}
点击测试文件下载功能即可下载;
选择需要上传的文件,点击上传,即可实现上传。
在控制台的如下位置,可以看到下载的文件的位置。可以查看文件是否下载成功。



