SpringMVC的文件上传和下载

本文介绍如何在SpringMVC框架中实现文件上传和下载功能。通过配置MultipartResolver来支持文件上传,并展示了具体的代码实例。同时,还介绍了如何使用ResponseEntity实现文件的下载。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    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;
    }
}
@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";
        }
    }


二:文件下载

    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);
    }


对于Spring MVC来说,文件上传下载是常见的功能之一。下面是关于如何实现文件上传下载的基本步骤: 1. 文件上传: - 在Spring MVC的配置文件中,添加`CommonsMultipartResolver`来解析文件上传请求。 - 创建一个表单页面,使用`enctype="multipart/form-data"`属性,确保可以上传文件。 - 在Controller中创建一个处理文件上传请求的方法,使用`@RequestParam("file") MultipartFile file`注解来接收文件。 - 在方法内部,可以通过`file.getInputStream()`来获取文件的输入流,进而实现上传操作。 2. 文件下载: - 在Controller中创建一个处理文件下载请求的方法。 - 在方法内部,使用`HttpServletResponse`对象设置响应头信息,包括`Content-Disposition``Content-Type`。 - 通过`response.getOutputStream()`获取输出流,并将文件的内容写入输出流。 需要注意的是,为了确保文件上传下载的安全性,可以进行一些额外的处理,例如限制文件类型、大小等。 以下是一个示例代码,用于演示文件上传下载: ```java @Controller public class FileController { @Autowired private ServletContext servletContext; @RequestMapping(value = "/upload", method = RequestMethod.POST) public String upload(@RequestParam("file") MultipartFile file) { try { String fileName = file.getOriginalFilename(); String filePath = servletContext.getRealPath("/uploads/") + fileName; file.transferTo(new File(filePath)); return "redirect:/success"; } catch (Exception e) { e.printStackTrace(); return "redirect:/error"; } } @RequestMapping(value = "/download", method = RequestMethod.GET) public void download(HttpServletResponse response) { try { String fileName = "example.txt"; String filePath = servletContext.getRealPath("/downloads/") + fileName; File file = new File(filePath); InputStream inputStream = new FileInputStream(file); response.setHeader("Content-Disposition", "attachment; filename=" + fileName); response.setContentType("application/octet-stream"); IOUtils.copy(inputStream, response.getOutputStream()); response.flushBuffer(); inputStream.close(); } catch (Exception e) { e.printStackTrace(); } } } ``` 上述代码中,`servletContext.getRealPath()`方法用于获取文件的实际路径,`IOUtils.copy()`方法用于将文件内容写入输出流。 请注意,上述示例仅为演示目的,实际应用中可能需要进行更多的异常处理、文件校验等操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值