1.demo效果
2.需要特别配置的地方
3.需要的jar包
4.目录树
5.程序基本架构
6.具体代码
点击即可下载。
Springmvc上下文中默认没有装配MultipartResolver,因此默认情况下其不能处理文件上传工作。如果想使用Spring的文件上传功能,则需要在上下文中配置MultipartResolver
(1).配置上传文件大小
(2).配置编码方式
10485760
UTF-8
基于MVC结构:用户的任何请求都会映射到控制器中对应的方法进行处理
pro4
springmvc
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
/WEB-INF/spring-mvc.xml
1
springmvc
/
/WEB-INF/
.jsp
10485760
UTF-8
package po;
import java.io.Serializable;
import org.springframework.web.multipart.MultipartFile;
public class User implements Serializable{
private MultipartFile file; //文件,必需用MultipartFile类型
public MultipartFile getFile() {
return file;
}
public void setFile(MultipartFile file) {
this.file = file;
}
}
package controller;
import java.io.File;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.io.FileUtils;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import po.User;
@Controller
public class FileController {
/* /upload的映射,且只适用于POST方法*/
@RequestMapping(value="/upload",method=RequestMethod.POST)
//参数里的user 是用来接收传来的文件的
//因为对应上传的文件,类型为MultipartFile,上传文件会自动绑定到 方法参数user里的MultipartFile成员变量
public String upload(HttpServletRequest request,User user,Model model) throws Exception{
if(!user.getFile().isEmpty()){
//path为项目目录下的files目录的路径,(getRealPath()获取绝对路径)
String path = request.getSession().getServletContext().getRealPath("/files/");
//getOriginalFilename()获取上传文件的原名
String filename = user.getFile().getOriginalFilename();
File filepath = new File(path,filename);
if(!filepath.getParentFile().exists()){
filepath.getParentFile().mkdirs();
}
/*transferTo()将上传文件保存到一个目标文件中,separator为目录与目录之间的分隔符,如/a/b/c.txt 中的 \
将user中的文件保存到目标位置*/
user.getFile().transferTo(new File(path+File.separator+filename));
model.addAttribute("user",user); //向模型model中加入user作为数据,给页面调用
return "downloadFile"; //返回到下载文件的页面
}
return "error";
}
//处理单一文件下载
@RequestMapping(value="/downloadd")
public ResponseEntity download(HttpServletRequest request,
@RequestParam("filename") String filename,Model model)throws Exception{
//获得要文件所在父目录的绝对路径
String path = request.getSession().getServletContext().getRealPath("/files/");
//获得要下载的文件的对象
File file = new File(path+File.separator+filename);
HttpHeaders headers = new HttpHeaders();
//解决中文显示的编码问题,后一个UTF-8是要转编码成的编码,若前后都是一样的(如下),就需要写这句,我下面那句只是演示用
String downloadFileName = new String(filename.getBytes("UTF-8"),"UTF-8");
//通知浏览器以attachment(下载方式)打开文件
headers.setContentDispositionFormData("attachment",downloadFileName);
//设置文件的MIME类型
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
//download方法收到页面传递的文件名filename后,使用FileUpload组件的FileUtils读取项目的files文件夹下的该文件
//并将其构成ResponseEntity对象返回客户端下载
return new ResponseEntity(FileUtils.readFileToByteArray(file),headers,HttpStatus.CREATED);
}
/* /upload的映射,且只适用于GET方法*/
@RequestMapping(value="/upload",method=RequestMethod.GET)
public String uploadForm(){
return "uploadForm";
}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here
文件上传
上述的表格是通过POST方式映射到控制器的RequestMapping值为upload 的方法中。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@page import="java.io.File" %>
Insert title here
文件下载
<% String path = request.getSession().getServletContext().getRealPath("/files/");
File file = new File(path);
File[] fs = file.listFiles();
for(File f:fs){
if(!f.isDirectory()){
String filename = f.getName(); //取出文件的名字(非绝对路径名)
%>
<%out.print(filename);%>
<%}
}%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here
上传失败