SpringMVC文件上传和下载

基于表单的文件上传

标签 <input type="file"/>会在浏览器中显示一个输入框和一个按钮,输入框可供用户填写本地文件的文件名和路径名,按钮可以让浏览器打开一个文件选择框供用户选择文件。
文件上传的表单例子如下:
<form method="post" action="upload" enctype="multipart/form-data">
<input type="file" name="myfile"/>
</form>
对于基于表单的文件上传,不要忘记使用 enctype 属性,并将它的值设置为 multipart/form-data,同时将表单的提交方式设置为 post。为什么要这样呢?下面从 enctype 属性说起。
表单的 enctype 属性指定的是表单数据的编码方式,该属性有以下 3 个值。
application/x-www-form-urlencoded:这是默认的编码方式,它只处理表单域里的 value 属性值。
multipart/form-data:该编码方式以二进制流的方式来处理表单数据,并将文件域指定文件的内容封装到请求参数里。
text/plain:该编码方式只有当表单的 action 属性为“mailto:”URL 的形式时才使用,主要适用于直接通过表单发送邮件的方式。
由上面 3 个属性的解释可知,在基于表单上传文件时 enctype 的属性值应为 multipart/form-data。

MultipartFile接口

在 Spring MVC 框架中上传文件时将文件相关信息及操作封装到 MultipartFile 对象中,因此开发者只需要使用 MultipartFile 类型声明模型类的一个属性即可对被上传文件进行操作。该接口具有如下方法
在这里插入图片描述
在上传文件时需要在配置文件中使用 Spring 的 org.springframework.web.multipart.commons.CommonsMultipartResolver 类配置 MultipartResolver 用于文件上传。

实例解析:

SpringMVC实现文件上传,需要再添加两个jar包 一个是io包 ,另一个是fileupload包
在这里插入图片描述
前端页面:

实现文件上传需要注意:
⭐提交的方法为post
⭐ 只要表单中有文件上传 就必须改流 enctype="multipart/form-data 固定死 表示当前媒体是以流的形式提交的
⭐使用上传文件的file标签

<%--
  Created by IntelliJ IDEA.
  User: yang
  Date: 2021/3/18
  Time: 11:07
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%--写个表单  提交到upload去处理    只要表单中有文件上传 就必须改流 enctype="multipart/form-data  固定死 表示当前媒体是以流的形式提交的  --%>

<form action="/upload.do" method="post" enctype="multipart/form-data">
    文件上传:<input type="file" name="file"><br>
    文件上传:<input type="file" name="file"><br>
    文件上传:<input type="file" name="file"><br>
    <input type="submit" value="提交">

    <%--下载不够灵活--%>
    <a href="download/总体设计.docx">下载文档</a>
    <%--真实下载需要传参 从而下载 --%>
    <%--下载需要去转流  --%>
    <%--下载二进制文件需要这样写  --%>
    <a href="download.do?fileName=aa.jpg">美女壁纸</a>
</form>
</body>
</html>

上传文件的功能类:

注意: 需要在springmvc里面配置上传的解释器

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="defaultEncoding" value="UTF-8"></property>
        <property name="maxUploadSize" value="10000000"></property>
    </bean>
package cn.yyj.controller;
import org.apache.commons.io.FileUtils;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
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.ResponseStatus;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import javax.xml.ws.ResponseWrapper;
import java.io.File;
import java.io.IOException;
import java.util.Date;
import java.util.Random;
import java.util.Scanner;
@Controller
public class UploadController {
    //文件上传  表单提交过来的参数名字叫file
    @RequestMapping("/upload.do")
    //接收一下 MultipartFile 是个数组 可能有多个 ,
    public String upload(MultipartFile file[], HttpServletRequest request) throws IOException {
        //数组 for循环
        for (int i=0;i<file.length;i++){
            //上传路径  request.getServletContext().getRealPath("/upload/")    获得上下文  得到上传路径   上传的文件都在upload里面
            String path=request.getServletContext().getRealPath("/upload/");
            //获得上传文件名 file[i].getOriginalFilename() 得到文件名
            String name=file[i].getOriginalFilename();
            //改名(因为有可能会重名 出现覆盖情况  经过改名再提交到服务器)
            String newname=new Date().getTime()+new Random().nextInt(99999)+name ;
            //上传改过后的 路径 +名字    path+newname
            File f1=new File(path+newname);
            //上传 抛个异常 抛给虚拟机
            file[i].transferTo(f1);
        }
        //上传成功去success1这个页面
        return "success1";
    }
}

文件下载功能类:

    //文件下载
    @RequestMapping("/download.do")
    //转流的方法   ResponseEntity<byte[]> 返回的是一个实体   方法名download  接收参数 fileName 与前端传过来的name一样
    public ResponseEntity<byte[]> download(@RequestParam("fileName") String fileName,HttpServletRequest request) throws IOException {
        //获得下载的路径
        String path=request.getServletContext().getRealPath("/download/");
        //用   地址加文件名  进行操作的
        File file=new File(path+fileName);
        //转格式  默认的格式都是iso-8859-1
        String newName=new String(fileName.getBytes("UTF-8"),"iso-8859-1");
        //转流  根据HTTP的头部信息
        HttpHeaders hh=new HttpHeaders();
        //setContentDispositionFormData  上下文的表单数据  固定的attachment  转格式后的新名字 newName
        hh.setContentDispositionFormData("attachment",newName);
        //setContentType 上下文的数据类型   媒体 APPLICATION_OCTET_STREAM
        hh.setContentType(MediaType.APPLICATION_OCTET_STREAM);
        //返回值  是一个ResponseEntity<byte[]> 有三个参数
        // 1.FileUtils.readFileToByteArray(file)把他改成byte数组
        //2. 头部
        //3 httpstatus 状态  created
        return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),hh, HttpStatus.CREATED);
    }

不管文件上传还是下载都需要在web项目下创建相应的upload和download的文件夹:
如图
在这里插入图片描述

运行结果显示:
在这里插入图片描述

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值