Spring MVC 文件上传 和下载

一、搭建Spring开发环境

1.1 在web.xml 中配置Servlet

<!--配置MVC中央控制器:DispatcherServlet-->
 <servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!--初始化一些参数 init-->
    <!--指定Spring配置文件的路径-->
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:springmvc-servlet.xml</param-value>
    </init-param>
    <!--容器在启动时就加载Servlet-->
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <!--设置此Servlet截获并处理所有的URL请求-->
    <url-pattern>/</url-pattern>
</servlet-mapping>

1.2 springmvc-config.xml:

<context:component-scan base-package="com.ytzl.controller"/>
<context:component-scan base-package="com.ytzl.service"/>
<!--2、开启mvc注解驱动:自动注册生成两个工具:处理器映射器(HandleMapping)和处理器适配器(HandleAdapter)-->
<mvc:annotation-driven/>
<!--配置视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/jsp/"/><!--前缀-->
    <property name="suffix" value=".jsp"/><!--后缀-->
</bean>



<!--配置全局异常捕获-->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
    <property name="exceptionMappings">
     <props>
         <prop key="java.lang.RuntimeException">error</prop>
     </props>
    </property>
</bean>
<!--配置文件上传-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <!--上传文件的最大大小-->
    <property name="maxUploadSize" value="17367648787"></property>
   <!--传文件的编码 -->
    <property name="defaultEncoding" value="UTF-8"></property>
</bean>

二、新建页面

2.2创建fileUpdate.jsp 页面 需要注意的是form 表单 要加上 属性entcypt=“multipart/form-data”,这表示上传的将会是二进制流的格式,以规定的二进制进行上传,便于服务器处理,使用post请求:

<form action="FileUpdate" enctype="multipart/form-data" method="post">
    <table>
        <tr>
            <td>请选择文件:</td>
            <td><input type="file" name="file"></td>
        </tr>
        <tr>
            <td>开始上传</td>
            <td><input type="submit" value="上传"></td>
        </tr>
    </table>
</form>
</body>

2.2:再写一个上传成功的jsp页面,主要是用来当上传成功时候跳转的页面,命名为:success.jsp

  <body>
   <h2>文件上传成功!</h2>  
  </body>

2.3:然后再写一个上传失败的页面,主要是用来当上传失败的时候跳转的页面,命名为:error.jsp

<body>
<h2>文件上传失败!请检查文件是否存在</h2>
</body>

2.3:创建控制器 SpringMVC 控制器

    //文件上传
    @RequestMapping(value = "/FileUpdate", method = RequestMethod.POST)
    public String fileUpdate(@RequestParam("file") MultipartFile file, HttpServletRequest request) {

        if (!file.isEmpty()) {

            String contextPath = request.getContextPath();//"/SpringMvcFileUpload"  项目路径
            String servletPath = request.getServletPath();//"/gotoAction"   本次请求的路径
            String scheme = request.getScheme();//"http"  //协议

            String storePath = "E:\\project\\SpringMvcFileUpload\\WebRoot\\images";//存放我们上传的文件路径

            String fileName = file.getOriginalFilename();

            File filepath = new File(storePath, fileName)// 文件的写入的路径

            if (!filepath.getParentFile().exists()) {

                filepath.getParentFile().mkdirs();//如果目录不存在,创建目录
            }

            try {

//                file.transferTo(new File(storePath + File.separator + fileName));//把文件写入目标文件地址
                file.transferTo(new File(String.valueOf(filepath)));//把文件写入目标文件地址

            } catch (Exception e) {

                e.printStackTrace();

                return "error";
            }
            return "success";//返回到成功页面

        } else {
            return "error";//返回到失败的页面
        }

    }

2.5:好了,到此我们就可以实现上传功能了,发布在Tomact容器里,然后就可以进行上传文件了。在浏览中输入:自己服务器 部署 的 项目路径 具体的页面请求如下,然后浏览具体的文件,点击上传按钮:

在这里插入图片描述

上传成功!
在这里插入图片描述

三、文件下载 , 将文件绑定到具体的对象上 首先定义 一个实体类 private MultipartFile file; 这个 对象主要用于 绑定 上传的文件

package com.ytzl.pojo;

import org.springframework.web.multipart.MultipartFile;

import java.io.Serializable;

public class UserFrom implements Serializable {
    private String uname; // 与请求参数名称相同
    private String upass;
    private String reupass;
    private MultipartFile file;  //上传文件会自动绑定到该属性
    //省略 getre seter 方法  ......

3.2创建一个 register.jsp 页面 用于模拟用户 注册上传头像的 场景 如下

<form action="${pageContext.request.contextPath }/register" method="post"  enctype="multipart/form-data" >
    <table border=1 bgcolor="lightblue" align="center">
        <tr><td>姓名:</td><td><input class="textSize" type="text" name="uname" /></td></tr>
        <tr><td>密码:</td><td><input class="textSize" type="password" maxlength="20" name="upass" /></td></tr>
        <tr><td>确认密码:</td><td><input class="textSize" type="password" maxlength="20" name="reupass" /></td></tr>
        <tr><td>请选择头像:</td><td><input type="file" name="file"></td></tr>
        <tr><td>开始上传</td><td><input type="submit" value="上传"></td></tr>
    </table>
</form>
</body>

3.3:写我们的方法控制器处理注册逻辑的层的代码,注意其中的user对象加入了@ModelAttribute注解,其主要作用是用来映射把上面的form表单的file属性自动注入到对象里面,还有Map<String,Object>
map主要是为了存放user对象,放在requestScope里面,这样就可用el表达式把其中的值取出来了。

//文件下载-文件上传
@RequestMapping(value = "/register", method = RequestMethod.POST)
public String register(@ModelAttribute UserFrom user, HttpServletRequest request, Map<String, Object> map) {
    MultipartFile file = user.getFile();
    boolean empty = file.isEmpty();
    String wrong = "success";
    String good = "download";
    if (!empty) {
        String realPath = request.getServletContext().getRealPath("/images");
        String uploadPath = "E:\\project\\SpringMvcFileUpload\\WebRoot\\images";
        String headimageName = file.getOriginalFilename();
        File imageFile = new File(uploadPath, headimageName);
        try {
            file.transferTo(new File(uploadPath + File.separator + headimageName));
        } catch (IOException e) {
            e.printStackTrace();
            return wrong;
        }
        map.put("user", user);
        return good;
    } else {
        return wrong;
    }
}

3.4 我们再新建一个 download.jsp 页面 用来 下载我们 模拟注册 上传后的文件

<body>
	用户头像:${user.file.originalFilename} // requestScope 这里 是可以不用写 的 他默认会从小到大 在域里找user
	</body>

在这里插入图片描述

在这里插入图片描述

四、实现用户下载 功能 改造 我们的 download.jsp

<body>
<p>${requestScope.user.file}</p>
<h3>文件下载</h3>
<p>用户头像:<a href="download?filename=${requestScope.user.file.originalFilename}">下载:${requestScope.user.file.originalFilename}</a></p>
</body>

4.2 然后 开始 编写 download 控制器 注意download方法返回的是ResponseEntity<byte[]> 类型,这个是封装好的返回类型,我们需要传入byte数组、headers、HttpStatus,然后它就会返回具体的下载流,调用客户端去下载资源

//文件下载
@RequestMapping(value = "download", method = RequestMethod.GET)
public ResponseEntity<byte[]> download(HttpServletRequest request, @RequestParam("filename") String filename, Model model) throws IOException {

    String downloadFilePath="E:\\project\\SpringMvcFileUpload\\WebRoot\\images";//从我们的上传文件夹中去取

    File file = new File(downloadFilePath+File.separator+filename);//新建一个文件

    HttpHeaders headers = new HttpHeaders();//http头信息

    String downloadFileName = new String(filename.getBytes("UTF-8"),"iso-8859-1");//设置编码

    headers.setContentDispositionFormData("attachment", downloadFileName);

    headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);

    //MediaType:互联网媒介类型  contentType:具体请求中的媒体类型信息

    return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),headers, HttpStatus.CREATED);
}

页面顶部的 语句 忽略
在这里插入图片描述

4.3 开始测试

点击 开始下载
如图左下角 的 下载完成 去查看 控制器 下载路径的位置 文件就已经在了
在这里插入图片描述

本篇博文介绍了SpringMvc上传和文件的功能,需要注意的地方就是对于文件上传包common-fileupload.jar包的使用,还有在配置文件上配置mulitipartResolver这个bean。下面又介绍了用java 实体类去映射上传文件的属性对应的文件,这点的好处就是它会自动映射,然后把对象放入到我们的请求域中,就可以展示给界面用户层,这也是mvc思想模式的体现。接下来是介绍去下载文件,只需要从我们的写入的目标地址去取出文件,再进行responseEntity对象的封装,就可以实现下载功能

参考自 :https://www.cnblogs.com/wyq178/p/6921164.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值