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";    }    /**     * 下载文件,showdowntoUTF8String     * */    //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;}

 

原创粉丝点击