SpringMVC 05 -文件上传与下载

1 文件上传

表单上传文件 前端要求:

  1. 请求方式必须是post
  2. 请求类型必须是multipart/form-data(enctype必须为multipart/form-data(二进制流的形式提交))

1.1 导入文件上传依赖

  • 文件操作依赖 commons-io
  • 文件上传的依赖 fileupload
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.4</version>
</dependency>
<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.3.3</version>
    <exclusions>
        <exclusion>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
        </exclusion>
    </exclusions>
</dependency>

1.2 文件上传表单

upload.html

  • 请求方式必须是post

  • 请求的类型必须是multipart/form-data

    enctype必须为multipart/form-data(二进制流的形式提交)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>文件上传</title>
</head>
<body>
    <form action="/upload" method="post" enctype="multipart/form-data">
        名称:<input type="text" name="name">
        头像:<input type="file" name="file">
        <input type="submit" value="上传">
    </form>
</body>
</html>

1.3 配置文件上传解析器

springmvc.xml

  • 文件上传解析器 CommonsMultipartResolver
    • 设置最大上传的总大小
    • 设置单个文件上传的大小
    • 设置文件上传编码格式
<!-- 文件上传解析器 CommonsMultipartResolver-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <!--最大上传的总大小-->
    <property name="maxUploadSize" value="10000000"></property>
    <!--单个文件上传的大小-->
    <property name="maxUploadSizePerFile" value="2000000"></property>
    <!--文件上传编码格式-->
    <property name="defaultEncoding" value="utf-8"></property>
</bean>

1.4 定义Controller

  1. 处理文件上传的内容
  2. 获取上传文件的名称–获取文件的后缀–获取新文件名称
  3. 将上传的文件保存到指定的位置
  4. 成功跳转
@Controller
public class UploadController {
    @RequestMapping("/uploadFile")
    public String upload(MultipartFile file,String name){
        //文件上传的操作
        //1、定义文件的位置(a、当前项目   b、本地磁盘)
        //2、解决文件名冲突问题
        //--------------------------------------------------
        //获取上传的文件名
        String filename = file.getOriginalFilename();
        //FilenameUtils.getExtension(filename); 获取文件后缀名  (注意:没有.)
        String fileNameExt = filename.substring(filename.lastIndexOf("."));

        filename = UUID.randomUUID().toString().replace("-","")+fileNameExt;
        File f = new File("D:\\workspace\\upload",filename);
        try {
            //将上传文件保存指定位置
            file.transferTo(f);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "ok";
    }
}

2 文件下载

2.1 定义下载链接

前端页面定义下载链接

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
        <img src="/img/e791dfcb84bf4708aa5985190d23c0e9.jpg" width="120px" height="120px"><br>
        <a href="/download?name=e791dfcb84bf4708aa5985190d23c0e9.jpg">点击下载</a>
</body>
</html>

2.2 定义Controller

  • java注释中不能出现单斜杠(错误,非法的Unicode转义)
  1. 根据文件名创建输入流对象
  2. 读取磁盘文件,通过响应流写到客户端
  3. 设置响应头,告知浏览器是下载操作 attachment以附件形式响应
  4. 拷贝方法。将文件读取出来, 通过响应流写客户端 向浏览器返回输出流
@Controller
public class DownloadController {

    @RequestMapping("/download")
    public void download(String name, HttpServletResponse response) throws IOException {
        //根据文件名创建输入流对象  name是前端拿到的
        //读取D:\\workspace\\upload\\name文件,通过响应流写到客户端  \n \t
        FileInputStream fis = new FileInputStream("D:\\workspace\\upload\\"+name);
        //设置响应头,告知浏览器是下载操作   attachment以附件形式响应
        response.setHeader("Content-Disposition","attachment;filename="+name);
        //拷贝方法。将文件读取出来, 通过响应流写客户端  (向浏览器返回输出流)
        IOUtils.copy(fis,response.getOutputStream());
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yinying293

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值