单个文件上传:
1.添加Apache文件上传jar包:
首先需要下载两个apache上传文件的jar包
commons-fileupload-1.3.1.jar
commons-io-2.4.jar
2.配置MultipartResolver处理文件:
SpringMVC 用的是 的MultipartFile来进行文件上传 所以我们首先要配置MultipartResolver:用于处理表单中的file。
spring-mvc.xml中配置
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver"
p:defaultEncoding="UTF-8" p:maxUploadSize="62914560"
p:maxInMemorySize="4096"
p:uploadTempDir="upload/temp"
>
</bean>
3.编写文件上传控制器:
@RequestMapping(value="/add",method=RequestMethod.POST)
public String add(Emp emp,MultipartFile file_photo,HttpServletRequest request) throws IOException{
if(file_photo != null && !file_photo.isEmpty()){
if(file_photo.getSize() > 2*1024*1024){
throw new RuntimeException("文件大小要大于2M");
}
File path = new File(request.getServletContext().getRealPath("/images"));
if(path == null){ new File(path).mkdirs();}
String ext = file_photo.getOriginalFilename().substring(file_photo.getOriginalFilename().lastIndexOf("."));
if(".jpg.png.jpeg.gif".indexOf(ext) == -1){
throw new RuntimeException("文件名称后缀不符合要求");
}
String filename = UUID.randomUUID().toString()+ext;
// 通过MultipartFile的transferTo(File dest)这个方法来直接转存文件到指定的路径
file_photo.transferTo(new File(path+"/"+filename));
//FileUtils.copyInputStreamToFile(file_photo.getInputStream(), new File(path+"/"+file_photo.getOriginalFilename()));
}
emp.setPhoto(file_photo.getOriginalFilename()); //获取上传文件的文件名
service.add(emp);
return "redirect:list";
}
4.文件上传表单:
<form class="form-horizontal" action="${pageContext.request.contextPath}/resource/add"
method="post" enctype="multipart/form-data">
选择文件:<input type="file" name="file_photo"> //file_photo对应方法中的参数
<input type="submit" value="提交"/>
</form>
注意要在form标签中加上enctype=”multipart/form-data”表示该表单是要处理文件的
多个文件上传:
1.添加Apache文件上传jar包:
首先需要下载两个apache上传文件的jar包
commons-fileupload-1.3.1.jar
commons-io-2.4.jar
2.配置MultipartResolver处理文件:
SpringMVC 用的是 的MultipartFile来进行文件上传 所以我们首先要配置MultipartResolver:用于处理表单中的file。
spring-mvc.xml中配置
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver"
p:defaultEncoding="UTF-8" p:maxUploadSize="62914560"
p:maxInMemorySize="4096"
p:uploadTempDir="upload/temp"
>
</bean>
3.文件上传控制器:
(1)相同文件类型
@RequestMapping(value = "uploadFiles", method = RequestMethod.POST)
public ModelAndView uploadFile(@RequestParam("files") MultipartFile[] files) {
//判断file数组不能为空并且长度大于0
if (files != null && files.length > 0) {
//循环获取file数组中得文件
for (int i = 0; i < files.length; i++) {
MultipartFile file = files[i];
if(file.getSize() > 2*1024*1024){
throw new RuntimeException("文件大小要大于2M");
}
File path = new File(request.getServletContext().getRealPath("/images"));
if(path == null){ path.mkdirs();}
String ext = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
if(".jpg.png.jpeg.gif".indexOf(ext) == -1){
throw new RuntimeException("文件名称后缀不符合要求");
}
String filename = UUID.randomUUID().toString()+ext;
// 通过MultipartFile的transferTo(File dest)这个方法来直接转存文件到指定的路径
file.transferTo(new File(path+"/"+filename));
}
}
//跳转视图
return new ModelAndView("uploadSuccess","msg",files.length+"个文件");
}
(2)不同文件类型
@RequestMapping(value = "/uploadFiles",method = RequestMethod.POST)
public ModelAndView add(MultipartFile[] files, Resource r, HttpServletRequest request) throws IOException{
System.out.println("文件长度"+files.length+"----"+files);
if(files == null || files.length == 0){return new ModelAndView("add_resource","msg","请上传图片和资源");}
//判断是否有未上传文件
if(files[0].isEmpty() && files[1].isEmpty()){
return new ModelAndView("add_resource","msg","请上传图片和资源");
}
if(files[0].isEmpty()){return new ModelAndView("add_resource","msg","请上传图片");}
if(files[1].isEmpty()){return new ModelAndView("add_resource","msg","请上传资源文件");}
for (int i = 0; i < files.length; i++) {//文件所在下标按标签从上至下
//图片处理
if(i==0){
if(files[i].getSize() > 1*1024*1024){throw new RuntimeException("文件大小要小于1M");}//判断文件大小
File path = new File(request.getServletContext().getRealPath("/images")); //获取Tomcat文件路径
if(!path.exists()){path.mkdirs();}//如文件夹不存在则创建
//获取图片后缀名
String ext = files[i].getOriginalFilename().substring(files[i].getOriginalFilename().lastIndexOf("."));
if(".jpg.png.jpeg.gif".indexOf(ext) == -1){
throw new RuntimeException("图片名称后缀不符合要求");
}
String filename = UUID.randomUUID().toString()+ext;//图片文件名称
files[i].transferTo(new File(path+"/"+filename));//转存文件到指定的路径
r.setPicture(filename);
continue;
}
//资源处理
if(files[i].getSize() > 5*1024*1024){throw new RuntimeException("文件大小要小于5M");}//判断文件大小
File path = new File(request.getServletContext().getRealPath("/source")); //获取Tomcat文件路径
if(!path.exists()){path.mkdirs();}//如文件夹不存在则创建
// 获取资源文件后缀名
String ext = files[i].getOriginalFilename().substring(files[i].getOriginalFilename().lastIndexOf("."));
if(".txt.sql.html".indexOf(ext) == -1){
throw new RuntimeException("资源文件名称后缀不符合要求");
}
String filename = UUID.randomUUID().toString()+ext;//图片文件名称
files[i].transferTo(new File(path+"/"+filename));//转存文件到指定的路径
r.setFileName(filename);
r.setFileSize(files[i].getSize());
}
Member m = (Member) request.getSession().getAttribute("m");
r.setUploadTime(new Date());
r.setMember(m);
service.add(r);
return new ModelAndView("redirect:/member/login");
}
4.多个文件上传表单:
<form class="form-horizontal" action="${pageContext.request.contextPath}/uploadFiles"
method="post" enctype="multipart/form-data">
选择文件:<input type="file" name="files">
选择文件:<input type="file" name="files"> //files对应方法中的参数
<input type="submit" value="提交"/>
</form>
前端表单,多个文件组使用同一个name名称:files,后台控制器使用 MultipartFile[] files 数组来接收
注意要在form标签中加上enctype=”multipart/form-data”表示该表单是要处理文件的
扩充:
1>MultipartFile常用方法
打印方法结果:
1>文件类型值,MultipartFile.getContentType():image/jpeg
2>表单中文件组件对应name值,MultipartFile.getName():file
3>文件原始名称包括后缀名,MultipartFile.getOriginalFilename():IMEI_20171204.jpg
4>文件大小单位为k,MultipartFile.getSize():27128
5>文件是否为空,MultipartFile.isEmpty():false
2>Apache文件相关jar包常用方法
1>FilenameUtils.concat(basePath, fullFileName):用于拼接目录和文件名为文件全路径,且会根据系统对应使用相应的分隔符
2>FileUtils.copyURLToFile(URL source, File destination, int connectionTimeout, int readTimeout):
从指定的url下载文件,保存到destination为准;同时指定连接超时时长,读取文件超时时长。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
文件下载
1.控制器编写
@Login
@RequestMapping(value="/downfile")
public void downfile(String fname, HttpServletRequest request, HttpServletResponse response){
//设置头信息进行下载文件
response.setCharacterEncoding("utf-8");
response.setContentType("application/x-msdownload");//需要弹出保存框
response.setHeader("Content-Disposition" //Content-Disposition是头信息
, "attachment;filename*=UTF-8''" + URLEncoder.encode(fname,"UTF-8"));
//下载文件的路径
String path = "D:\\IDEA\\MyCSDN\\src\\main\\webapp\\files\\"+fname;
System.out.println(path+"--");
OutputStream os = response.getOutputStream();
InputStream in = new FileInputStream(path);
FileUtil.copyStream(in,os);
os.flush();
os.close();
}
2.页面编写
<a href="${pageContext.request.contextPath}/downfile?fname=bbs.xls">下载</a>
案例(通常不会按文件名查找而是按ID查到,如积分不足作相应的异常处理)
<a href="${pageContext.request.contextPath}/downfile/${r.id}">下载</a>
@RequestMapping(value="/downfile/{id}")
public String downfile(@PathVariable("id")Integer id, HttpServletRequest request, HttpServletResponse response){
try {
Resource r = service.findOne(id);
Member m = (Member) request.getSession().getAttribute("m");
int result = service.isDown(m.getId(),r);
System.out.println("结果:"+result);
// if(result ==-1){return null;}//不能下载积分不足
//设置头信息进行下载文件
response.setCharacterEncoding("utf-8");
response.setContentType("application/x-msdownload");//需要弹出保存框
response.setHeader("Content-Disposition" //Content-Disposition是头信息
, "attachment;filename*=UTF-8''" + URLEncoder.encode(r.getFname(),"UTF-8"));
//下载文件的路径
String path = "D:\\IDEA\\MyCSDN\\src\\main\\webapp\\files\\"+r.getFileName();
System.out.println(path+"--");
OutputStream os = response.getOutputStream();
InputStream in = new FileInputStream(path);
FileUtil.copyStream(in,os);
os.flush();
os.close();
r.setDownCount(r.getDownCount()+1);
service.edit(r);//下载完毕后增加下载次数
if(result == 1){ //如不是作者或已下载过,执行加减积分
service.changeScore(m.getId(),r);
}
return null;
}catch (NotScoreRuntimeException ex){
return "redirect:/resource/add";
}catch (IOException ex){
return null;
}catch (Exception ex){
return null;
}
}