Spring学习笔记-MVC文件上传与下载
来源:互联网 发布:外星人源码论坛eenot 编辑:程序博客网 时间:2024/06/05 15:47
commons-fileupload组件
上传文件有多种方式:文件流手工编程上传、基于commons-fileupload组件、基于Servlet3及以上版本的文件上传等。
Spring MVC框架文件上传是基于commons-fileupload组件的文件上传。
MultipartFile接口
SpringMVC框架中,上传文件时文件的相关信息及操作封装在MultipartFile对象中。
byte[] getBytes()//返回文件内容的字节数组
String getContentType()//返回文件内容的类型
InputStream getInputStream()//返回InputStream可读取内容
String getName()//返回请求参数的名称
String getOriginalFilename()//返回客户端提交的原始文件名
long getSize()//返回文件的大小,单位字节
boolean isEmpty()//判断上传文件是否为空
void transferTo(File destination)//将上传文件保存到目标目录下
配置
pom.xml中配置jar包
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
springmvc.xml中配置CommonsMultipartResolver
<!-- springmvc文件上传需要配置的节点--><bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="maxUploadSize" value="20971500"/> <property name="defaultEncoding" value="UTF-8"/> <property name="uploadTempDir" value="upload"/> <property name="resolveLazily" value="true"/></bean>
基于表单的文件上传
表单enctype设置为multipart/form-data,input使用file
<form action="/home/onefile" method="post" enctype="multipart/form-data"> 选择文件:<input type="file" name="myfile"><br> 文件描述:<input type="text" name="description"><br> <input type="submit" value="上传"></form>
Controller
@Controller@RequestMapping("/home")public class HomeController { //添加一个日志器 private static final Logger logger = LoggerFactory.getLogger(HomeController.class); @RequestMapping("/updown") public String upload(){ logger.info("上传页面"); return "updownload/upload_download"; } /** * 单文件上传 * */ @RequestMapping("/onefile") public String oneFileUpload(@ModelAttribute FileDomain fileDomain, HttpServletRequest request){ //设置文件路径 String realpath = request.getServletContext().getRealPath("uploadfiles"); String fileName = fileDomain.getMyfile().getOriginalFilename(); File targetFile = new File(realpath,fileName); if(!targetFile.exists()){ targetFile.mkdirs(); } //上传 try { fileDomain.getMyfile().transferTo(targetFile); logger.info("成功"); System.out.println(realpath); }catch (Exception e){ e.printStackTrace(); } return "updownload/showOne"; } /** * 多文件上传 * */ @RequestMapping("/multifile") public String multiFileUpload(@ModelAttribute MultiFileDomain multiFileDomain, HttpServletRequest request){ String realpath = request.getServletContext().getRealPath("uploadfiles"); File targetDir = new File(realpath); if(!targetDir.exists()){ targetDir.mkdirs(); } List<MultipartFile> files = multiFileDomain.getMyfile(); for(int i=0;i<files.size();i++){ MultipartFile file = files.get(i); String fileName = file.getOriginalFilename(); File targetFile = new File(realpath,fileName); //上传 try { file.transferTo(targetFile); }catch (Exception e){ e.printStackTrace(); } } return "updownload/showMulti"; } /** * 下载文件,show、down、toUTF8String * */ //show @RequestMapping("showDownFiles") public String show(HttpServletRequest request,Model model){ String realpath = request.getServletContext().getRealPath("uploadfiles"); File dir = new File(realpath); File files[] = dir.listFiles(); ArrayList<String> fileName = new ArrayList<>(); for(int i=0;i<files.length;i++){ fileName.add(files[i].getName()); } model.addAttribute("files",fileName); return "updownload/showDownFiles"; } //down @RequestMapping("down") public String down(@RequestParam String filename, HttpServletRequest request, HttpServletResponse response){ String aFilePath = null; FileInputStream in = null; ServletOutputStream out = null; try { System.out.println(filename); aFilePath=request.getServletContext().getRealPath("uploadfiles"); response.setHeader("Content-Type","application/x-msdownload"); response.setHeader("Content-Disposition", "attachment;filename="+toUTF8String(filename)); in=new FileInputStream(aFilePath+"\\"+filename); out=response.getOutputStream(); out.flush(); int aRead=0; byte[] b = new byte[1024]; while ((aRead = in.read(b))!=-1&&in!=null){ out.write(b,0,aRead); } out.flush(); in.close(); out.close(); }catch (Throwable e){ e.printStackTrace(); } logger.info("下载成功"); return null; } //toUTF8String public String toUTF8String(String str){ StringBuffer sb = new StringBuffer(); int len = str.length(); for(int i=0;i<len;i++){ char c = str.charAt(i); if(c>=0&&c<=255){ sb.append(c); }else { byte b[]; try { b=Character.toString(c).getBytes("UTF-8"); }catch (UnsupportedEncodingException e){ e.printStackTrace(); b=null; } for(int j=0;j<b.length;j++){ int k = b[j]; if(k<0){ k&=255; } sb.append("%"+Integer.toHexString(k).toUpperCase()); } } } System.out.println(sb); return sb.toString(); }}
JSP页面
upload_download.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head> <title>Title</title></head><body>上传下载页面<form action="/home/onefile" method="post" enctype="multipart/form-data"> 选择文件:<input type="file" name="myfile"><br> 文件描述:<input type="text" name="description"><br> <input type="submit" value="单文件上传"></form><form action="/home/multifile" method="post" enctype="multipart/form-data"> 选择文件1:<input type="file" name="myfile"><br> 文件描述1:<input type="text" name="description"><br> 选择文件2:<input type="file" name="myfile"><br> 文件描述2:<input type="text" name="description"><br> 选择文件3:<input type="file" name="myfile"><br> 文件描述3:<input type="text" name="description"><br> <input type="submit" value="多文件上传"></form></body></html>
showOne.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %><% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+ request.getServerPort()+path+"/";%><html><head> <base href="<%=basePath%>"> <title>Title</title></head><body>${fileDomain.description}<br>${fileDomain.myfile.originalFilename}</body></html>
showMulti.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %><%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%><% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+ request.getServerPort()+path+"/";%><html><head> <base href="<%=basePath%>"> <title>Title</title></head><body><%=basePath%><table> <tr> <td>详情</td><td>文件名</td> </tr> <c:forEach items="${multiFileDomain.description}" var="description" varStatus="loop"> <tr> <td>${description}</td> <td>${multiFileDomain.myfile[loop.count-1].originalFilename}</td> </tr> </c:forEach></table></body></html>
showDownFiles.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %><%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%><% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+ request.getServerPort()+path+"/";%><html><head> <base href="<%=basePath%>"> <title>Title</title></head><body><table> <c:forEach items="${files}" var="filename"> <tr> <td><a href="home/down?filename=${filename}">${filename}</a></td> </tr> </c:forEach></table></body></html>
Model
getter和setter略
public class FileDomain { private String description; private MultipartFile myfile;}
public class MultiFileDomain { private List<String> description; private List<MultipartFile> myfile;}
- Spring学习笔记-MVC文件上传与下载
- spring mvc文件上传与下载
- Spring MVC 实现文件上传与下载
- Spring mvc 文件的上传与下载
- Spring MVC之文件上传与下载
- Spring MVC 文件上传与下载
- Spring MVC 文件上传与下载
- Spring mvc文件上传与下载
- Spring MVC 学习笔记 八 文件上传
- Spring MVC文件上传 下载
- Spring mvc 文件上传 下载
- 文件的上传与下载之方式3:Spring MVC
- MVC文件上传与下载
- MVC文件上传与下载
- spring MVC文件的上传和下载
- spring MVC文件上传和下载
- spring mvc的文件下载及上传
- spring mvc文件上传和下载
- 北京SEO祭司:Link与domain如何区分?
- java实体类为什么要实现序列化
- 语音增强原理之噪声估计
- 阿里云Ubuntu16.04搭建LAMP+私有云nextcloud
- 请求重定向和请求转发的区别
- Spring学习笔记-MVC文件上传与下载
- Dubbo 结合 Spring Boot 的探索(注册发现,管理监控,全链路日志跟踪)
- codeforces 903A.Hungry Student Problem
- BZOJ3724: PA2014Final Krolestwo
- Shoppings
- HDU P2196 Computer
- BZOJ2815: [ZJOI2012]灾难(支配树)
- java通过克隆的方式创建对象
- 复数类