SpringMVC—⑤文件的上传下载

本文详细介绍了如何在SpringMVC中实现文件上传和下载功能。从配置依赖包commons-fileupload开始,到配置文件上传解析器MultipartResolver,再到具体代码实现,包括Controller和前端页面的编写,最后通过测试验证功能的正确性。

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

文件上传

首先要导包

        <!--文件上传和下载的包commons-fileupload,依赖于commons-io-->
        <!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3.3</version>
        </dependency>

然后配置文件上传的配置,需要在SpringMVC的配置文件中配置CommonsMultipartResolver类

上传文件解析器——MultipartResolver
SpringMVC中没有默认装配MultipartResolver,因此在默认情况下不饿能处理文件上传工作,所以必须配置MultipartResolver
MultipartResolver 用于处理文件上传,当收到请求时 DispatcherServlet 的 checkMultipart() 方法会调用 MultipartResolver 的 isMultipart() 方法判断请求中是否包含文件。如果请求数据中包含文件,则调用 MultipartResolver 的 resolveMultipart() 方法对请求的数据进行解析,然后将文件数据解析成 MultipartFile 并封装在 MultipartHttpServletRequest (继承了 HttpServletRequest) 对象中,最后传递给 Controller

    <!--文件上传或下载-->
    <!--bean的id必须为multipartResolver,否则400;-->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="defaultEncoding" value="utf-8"/>
        <!--maxUploadSize以字节为单位 ,1,048,576‬为1M 我们这里设置上传大小限制10M-->
        <property name="maxUploadSize" value="10485760"/>
        <!--缓存大小-->
        <property name="maxInMemorySize" value="40960"/>
    </bean>

开始写代码
controller

  1. 必须注意:@RequestParam(“file”)接收文件
  2. 接收的文件的类型为CommonsMultipartFile , 这是SpringMVC封装的
package com.anye.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.commons.CommonsMultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

@Controller
public class FileUploadController {
    @RequestMapping("/upload")
    @ResponseBody
    public String upload(@RequestParam("file") CommonsMultipartFile file,
                         HttpServletRequest request) throws IOException {
        //1、获取文件名
        String filename = file.getOriginalFilename();
        if("".equals(filename)){
            return "文件不存在";
        }
        //2、上传文件保存路径
        String path = request.getServletContext().getRealPath("/upload");
        File realPath = new File(path);
        if(!realPath.exists()){
            realPath.mkdir();
        }
        //3、上传文件
        InputStream is = file.getInputStream();
        FileOutputStream os = new FileOutputStream(new File(realPath, filename));
        
        int len = 0;
        byte[] buffer = new byte[1024];
        while ((len=is.read(buffer))!=-1){
            os.write(buffer,0,len);
            os.flush();
        }
        //4、关闭流
        os.close();
        is.close();
        return "上传完毕";
    }
}

前端

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%--enctype="multipart/form-data"才能支持文件上传,这个表示使用二进制流的形式处理表单数据
application/x-www-form-urlencoded 是enctype的默认值。只处理表单中value属性的值;
enctype="text/plain" : 表示他只会将空格转换为 + 号, 其他东西不变,使用表单邮件发送
--%>
<form action="${pageContext.request.contextPath}/upload" method="post" enctype="multipart/form-data">
    <%--name服务器可以取这个文件的值--%>
    <input type="file" name="file">
    <input type="submit" value="upload">
</form>
</body>
</html>

spring-servlet.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <context:component-scan base-package="com.anye.controller"/>
    <mvc:default-servlet-handler/>
    <mvc:annotation-driven>
        <!--JSON格式乱码处理方式-->
        <mvc:message-converters register-defaults="true">
            <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                <constructor-arg value="UTF-8"/>
            </bean>
            <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
                <property name="objectMapper">
                    <bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
                        <property name="failOnEmptyBeans" value="false"/>
                    </bean>
                </property>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>
    <!--视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
    <!--文件上传或下载-->
    <!--bean的id必须为multipartResolver,否则400;-->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="defaultEncoding" value="utf-8"/>
        <!--maxUploadSize以字节为单位 ,1,048,576‬为1M 我们这里设置上传大小限制10M-->
        <property name="maxUploadSize" value="10485760"/>
        <!--缓存大小-->
        <property name="maxInMemorySize" value="40960"/>
    </bean>
</beans>

测试:
在这里插入图片描述
在这里插入图片描述
还有一种方法,只需要修改controller

package com.anye.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.commons.CommonsMultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

@Controller
public class FileUploadController {
 @RequestMapping(value = "/upload",produces = "application/json;charset = utf-8")
    @ResponseBody
    public String upload2(@RequestParam("file") CommonsMultipartFile file,
                          HttpServletRequest request) throws IOException {
        String path = request.getServletContext().getRealPath("/upload");
        File file1 = new File(path);
        if (!file1.exists()){
            file1.mkdir();
        }
        file.transferTo(new File(file1+"/"+file.getOriginalFilename()));
        return "上传完毕";
    }

}

文件下载

controller

package com.anye.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URLEncoder;

@Controller
public class FileDownloadController {
    @RequestMapping(value = "/download",produces = "application/json;charset = utf-8")
    @ResponseBody
    public String download(HttpServletResponse response) throws IOException {
        //要下载的文件地址
        String path = "C:/Users/1/Desktop";
        String fileName = "001.jpg";
        File file = new File(path, fileName);
        //设置响应头的信息
        response.reset();//让页面不缓存
        response.setCharacterEncoding("utf-8");
        //二进制流传输数据
        response.setContentType("multipart/form-data");
        response.setHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode(fileName,"UTF-8"));

        FileInputStream is = new FileInputStream(file);
        ServletOutputStream os = response.getOutputStream();
        int len = 0;
        byte[] buffer = new byte[1024];
        while ((len = is.read(buffer)) != -1){
            os.write(buffer,0,len);
            os.flush();
        }
        os.close();
        is.close();
        return null;
    }
}

前端

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<p><a href="${pageContext.request.contextPath}/download">下载图片</a></p>
</body>
</html>

测试
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值