springmvc文件上传和下载

一:单文件上传

因为spring mvc的上传,底层还是依赖commons-io.jar,commons-upload.jar,所以使用之前先引入pom依赖

1、pom依赖

<!--引入上传组件-->
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.5</version>
</dependency>

<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.3.1</version>
</dependency>

2、页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page isELIgnored="false" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <form action="/upload/upload" method="post" enctype="multipart/form-data">
        上传文件: <input type="file" name="img">
        <input type="submit" value="提交">
    </form>

    <img src="${img}"/>
</body>
</html>

注意点:

  1. 请求方式必须是post,enctype必须等于multipart/form-data(get 请求或者不设置enctype只能将文件名传给服务器)
  2. ,type必须file,而且name属性值,要和Multipart xxx的形参名一致!
  3. 要想在页面中使用EL,加上isELIgnored=“false” 指令!
  4. 因为该页面存在一个图片,请求该页面的时候,该页面也会发送一个请求,去请求图片,而如果不去web.xml中配置的话,spring mvc默认会将它交给DispatcherServlet来处理,通过HandlerMapping
    去获取Handler,因为不存在该Handler的映射,所以到时候会报错!!,所以对图片这个静态资源需要在
    web.xml中配置一下

web.xml

<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.png</url-pattern>
</servlet-mapping>

3、Handler

@Controller
@RequestMapping("/upload")
public class UploadController {

    @PostMapping("/upload")
    public String upload(MultipartFile img, HttpServletRequest reqeust){
        if(img.getSize()>0){
            //1.获取保存上传文件的路径!
            String path =  reqeust.getSession().getServletContext().getRealPath("upload");
            //2.获取上传的文件名
            String fileName = img.getOriginalFilename();
            File file = new File(path,fileName);
            try {
                img.transferTo(file);
                /*存到request域,在upload.jsp中显示出来!*/
                reqeust.setAttribute("img","/upload/"+fileName);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return "upload";
    }
}

注意点:

获取的upload文件夹必须存在:F:\Software\tomcat\apache-tomcat-8.5.39\webapps\ROOT\upload
它是在ROOT目录下创建的,并且tomcat每次启动完,我们手动创建的upload文件夹就会消失,所以每次都得手动创建一个

注:到Handler后还不行,还得在配置文件中配置CommonsMultipartResolver才行!

4、spring mvc.xml

<!-- 配置上传组件 -->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"></bean>

二:多文件上传

跟单文件上传差不多

1、页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page isELIgnored="false" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <form action="/upload/uploads" method="post" enctype="multipart/form-data">
        文件1: <input type="file" name="imgs"><br/>
        文件2: <input type="file" name="imgs"><br/>
        文件3: <input type="file" name="imgs"><br/>
        <input type="submit" value="提交">
    </form>

    <c:forEach items="${files}" var="file">
        <img src="${file}" width="300px">
    </c:forEach>

</body>
</html>

1.由于使用了jstl需要导入pom依赖

2.注意name属性值必须和形参名字一模一样!

jstl

<!--引入jstl-->
<dependency>
    <groupId>jstl</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
</dependency>

<dependency>
    <groupId>taglibs</groupId>
    <artifactId>standard</artifactId>
    <version>1.1.2</version>
</dependency>

2、Handler

@PostMapping("/uploads")
public String uploads(MultipartFile[] imgs, HttpServletRequest request){
    List<String> files = new ArrayList<>();
    for(MultipartFile img : imgs){
        if(img.getSize()>0){
            //1.获取存放上传文件的路径
            String path = request.getSession().getServletContext().getRealPath("upload");
            String name = img.getOriginalFilename();
            File destfile = new File(path,name);
            try {
                img.transferTo(destfile);
                files.add("/upload/"+name);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    request.setAttribute("files",files);
    return "uploads";
}

三:文件下载

1、页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <a href="/file/download/1">1.png</a>
    <a href="/file/download/2">2.png</a>
    <a href="/file/download/3">3.png</a>
</body>
</html>

2、Handler

@Controller
@RequestMapping("/file")
public class DownloadController {

    @GetMapping("/download/{name}")
    public void download(@PathVariable("name") String name, HttpServletRequest reqeust, HttpServletResponse response){
        if(name != null) {
            name += ".png";
            String path = reqeust.getSession().getServletContext().getRealPath("upload");
            File file = new File(path, name);
            OutputStream outputStream = null;
            if (file.exists()) {
                response.setContentType("application/forc-download");
                response.setHeader("Content-Disposition","attachment;filename="+name);
                try {
                    outputStream = response.getOutputStream();
                    //将文件转换成字节数组!
                    outputStream.write(FileUtils.readFileToByteArray(file));
                    outputStream.flush();
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    if (outputStream!=null){
                        try {
                            outputStream.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }
    }
}

注:你可以先用uploads.jsp页面上传,然后在来用download.jsp体验下载!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章