SpringMVC的文件上传和下载

    SpringMVC会根据请求方法签名的不同,将请求消息中的信息以一定的方式转换并绑定到请求方法的参数中。在请求消息到达真正调用处理方法的这段时间内,SpringMVC还会完成很多其他的工作,包括请求消息转换、数据转换、数据格式化以及数据校验。

一:SpringMVC实现文件上传

    为了实现文件上上传,必须将表单的method设置为POST,并将enctype设置为multipart/form-data,在这种情况下浏览器会把用户选择的文件二进制数据发送给服务器。SpringMVC为文件上传提供了直接的支持,用即插即用的MultipartResolver实现,因此SpringMVC的文件上传组件还需要依赖Apache Commons FileUpload的组件。

<!-- 文件上传组件 -->
    <dependency>
      <groupId>commons-fileupload</groupId>
      <artifactId>commons-fileupload</artifactId>
      <version>1.3.1</version>
    </dependency>

    案例:SpringMVC的文件上传

        1、在SpringMVC.xml文件中添加Bean文件

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!--上传文件大小限制 单位为字节(10M)-->
        <property name="maxUploadSize">
            <value>10485760</value>
        </property>
        <!--请求的编码格式 必须和jsp的pageEncoding属性一致 以便正确读取表单的内容 默认为IS0-8859-1 -->
        <property name="defaultEncoding">
            <value>UTF-8</value>
        </property>
    </bean>

    2、编写jsp页面 分别是registerForm.jsp、userInfo.jsp、error.jsp   

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>用户注册</title>
</head>
<body>
    <h2>用户注册</h2>
    <form action="register" enctype="multipart/form-data" method="post">
        <table>
            <tr>
                <td>用户名:</td>
                <td><input type="text" name="username"/></td>
            </tr>
            <tr>
                <td>请上传图片:</td>
                <td><input type="file" name="image"/></td>
            </tr>
            <tr>
                <td><input type="submit" name="注册"/></td>
            </tr>
        </table>
    </form>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h2>文件下载</h2>
    <a href="download?filename=${requestScope.user.image.originalFilename}">
        ${requestScope.user.image.originalFilename}
    </a>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    错误页面
</body>
</html>

    3、Controller类

@RequestMapping("/register")
    public String register(HttpServletRequest request, @ModelAttribute User user, Model model)throws Exception{
        if(!user.getImage().isEmpty()){
            /**上传文件的路径*/
            String path = request.getSession().getServletContext().getRealPath("/images/");
            System.out.println(path);
            /**上传文件名*/
            String filename = user.getImage().getOriginalFilename();
            File filepath = new File(path,filename);
            /**判断路径是否存在 不存在则创建*/
            if(!filepath.getParentFile().exists()){
                filepath.getParentFile().mkdirs();
            }
            /**将上传文件保存带目标文件中*/
            user.getImage().transferTo(new File(path+File.separator+filename));
            /**将用户添加到model*/
            model.addAttribute("user",user);
            /**跳转*/
            return "userInfo";
        }else{
            return "error";
        }
    }

    
package com.jz.demo;
import org.springframework.web.multipart.MultipartFile;
public class User {
    private String username;
    private MultipartFile image;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public MultipartFile getImage() {
        return image;
    }

    public void setImage(MultipartFile image) {
        this.image = image;
    }
}

二:文件下载

    SpringMVC提供了一个ResponseEntity类型,使用它可以很方便的定义返回的HttpHeaders。

    @RequestMapping(value="/download")
    public ResponseEntity<byte[]> download(HttpServletRequest request,
                                           @RequestParam("filename") String filename,
                                           Model model)throws Exception{
        // 下载文件路径
        String path = request.getSession().getServletContext().getRealPath(
                "/images/");
        File file = new File(path+File.separator+ filename);
        HttpHeaders headers = new HttpHeaders();
        // 下载显示的文件名,解决中文名称乱码问题
        String downloadFielName = new String(filename.getBytes("iso-8859-1"),"UTF-8");
        // 通知浏览器以attachment(下载方式)打开图片
        headers.setContentDispositionFormData("attachment", downloadFielName);
        // application/octet-stream : 二进制流数据(最常见的文件下载)。
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
        // 201 HttpStatus.CREATED
        return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),
                headers, HttpStatus.CREATED);
    }


猜你喜欢

转载自blog.csdn.net/jz_say/article/details/80216344