SpringMVC教程之文件上传与下载详解

下面我会为大家详细讲解“SpringMVC教程之文件上传与下载详解”的完整攻略。

一、背景

在 web 开发中,文件的上传和下载是非常常见的操作。Spring 框架提供了相应的类和接口,可以方便地实现文件上传和下载功能。本文将结合两个实例,介绍 SpringMVC 的文件上传和下载的实现方法。

二、文件上传

2.1 概述

文件上传分为两步:

  1. 在表单中添加文件上传控件,用于选择要上传的文件。

  2. 服务器端处理文件上传请求,将文件保存到指定的位置。

2.2 简单示例

上传文件的示例代码如下。首先是前端的表单界面:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>文件上传示例</title>
</head>
<body>
    <form method="post" action="/upload" enctype="multipart/form-data">
        <input type="file" name="file" />
        <input type="submit" value="上传" />
    </form>
</body>
</html>

其中,<form> 标签中的 method 属性必须指定为 postaction 属性对应的是文件上传请求的处理地址。

服务器端对于文件上传请求的处理,示例代码如下:

@Controller
public class FileUploadController {

    @RequestMapping(value = "/upload", method = RequestMethod.POST)
    public String upload(@RequestParam("file") MultipartFile file, Model model) throws IOException {
        if (!file.isEmpty()) {
            byte[] bytes = file.getBytes();
            FileOutputStream fos = new FileOutputStream("C:/temp/" + file.getOriginalFilename());
            fos.write(bytes);
            fos.close();
            model.addAttribute("msg", "文件上传成功!");
        } else {
            model.addAttribute("msg", "文件上传失败:文件为空!");
        }
        return "uploadResult";
    }

}

该类使用 @Controller 注解声明为控制器, @RequestMapping 注解指定处理 "/upload" 请求,其中 @RequestParam("file") 注解指定上传文件的参数名为 file。在方法体中,使用 getBytes() 方法获取文件的字节流,保存到指定的文件中。最后,通过 model 传递消息给视图,告知上传结果。其中名为 uploadResult 的视图用于展示上传结果。

至此,简单的文件上传功能已经实现了。若出现错误,报错信息将会在视图 uploadResult 中显示出来。

2.3 进阶示例

进阶的文件上传示例实现了以下几个特性:

  1. 使用 Spring 的表单标签库,生成包含文件上传功能的表单界面。

  2. 实现同时上传多个文件的功能。

  3. 限制上传文件的类型和大小。

先来看看前端的表单界面:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>文件上传示例</title>
</head>
<body>
    <%@ taglib uri="http://www.springframework.org/tags/form" prefix="f" %>
    <f:form method="post" action="/simpleUpload" commandName="myFile">
        <f:input type="file" path="files" id="files" name="files" multiple="multiple" /><br />
        <f:errors path="files" cssClass="error" />
        <br />
        <input type="submit" value="上传" />
    </f:form>
</body>
</html>

在该表单界面中使用了 Spring 的表单标签库,通过 f:form 标签生成 form 表单,commandName 属性指定表单的 model 类,后续会用到。在表单中使用 f:input 标签生成文件上传控件,通过 path 属性指定上传文件的属性名(即使用 setter 方法设置这个参数)。

然后,我们需要在后端实现文件上传功能。示例代码如下:

@Controller
public class AdvancedFileUploadController {

    @RequestMapping(value = "/simpleUpload", method = RequestMethod.POST)
    public String simpleUpload(@ModelAttribute("myFile") MyFile myFile, BindingResult result, Model model)
            throws IOException {
        if (result.hasErrors()) {
            model.addAttribute("msg", "上传失败:表单验证出错!");
            return "advancedUploadResult";
        }
        List<MultipartFile> files = myFile.getFiles();
        if (files.size() == 0) {
            model.addAttribute("msg", "上传失败:未选择任何文件!");
            return "advancedUploadResult";
        }
        for (MultipartFile file : files) {
            if (!file.isEmpty()) {
                String fileName = file.getOriginalFilename();
                String fileType = fileName.substring(fileName.lastIndexOf(".") + 1, fileName.length());
                if (!fileType.equalsIgnoreCase("jpg") && !fileType.equalsIgnoreCase("png")) {
                    model.addAttribute("msg", "上传失败:文件类型不正确!");
                    return "advancedUploadResult";
                }
                if (file.getSize() > 1024 * 1024) {
                    model.addAttribute("msg", "上传失败:文件大小超限!");
                    return "advancedUploadResult";
                }
                byte[] bytes = file.getBytes();
                FileOutputStream fos = new FileOutputStream("C:/temp/" + fileName);
                fos.write(bytes);
                fos.close();
            }
        }
        model.addAttribute("msg", "上传成功!");
        return "advancedUploadResult";
    }

    @RequestMapping(value = "/advancedUpload", method = RequestMethod.GET)
    public String showUploadForm(Model model) {
        model.addAttribute("myFile", new MyFile());
        return "advancedUpload";
    }

}

class MyFile {
    private List<MultipartFile> files;

    public List<MultipartFile> getFiles() {
        return files;
    }

    public void setFiles(List<MultipartFile> files) {
        this.files = files;
    }

}

其中 @ModelAttribute("myFile") 注解指定 model 的名称为 myFile,在表单中就可以使用 myFile.files 的方式获取上传文件列表。使用 BindingResult 对上传的数据进行校验,若校验失败,将错误信息展示在视图中。调用 getFiles() 方法按顺序获取到上传文件列表,遍历其中文件:

在遍历的过程中,首先获取文件名,并从文件名中获取文件类型。然后判断文件类型和大小是否符合要求,不符合则返回错误消息。最后,使用 getBytes() 方法获取文件的字节流,保存到指定的文件中。

在实现文件上传功能中,我们还可以结合第三方组件 commons-fileupload 来解析上传文件流。在 Spring 中,只需要在配置文件中引入相关依赖,然后使用 CommonsMultipartResolver 即可自动将文件上传流转化为 MultipartFile,方便操作。

三、文件下载

3.1 概述

文件下载功能比文件上传要简单得多。在 Spring 中,可以通过在响应头中设置 Content-Disposition 头,浏览器就会自动弹出下载框,提示用户下载文件。同时,还需要将文件的字节流写入响应体中。

3.2 示例

实现文件下载的示例代码如下:

@Controller
public class FileDownloadController {

    @RequestMapping(value = "/download", method = RequestMethod.GET)
    public void download(HttpServletRequest request, HttpServletResponse response) throws Exception {
        String fileName = "myFile.jpg";
        String filePath = "C:/temp/" + fileName;
        File file = new File(filePath);

        if (file.exists()) {
            response.setContentType("application/octet-stream");
            response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
            FileInputStream fis = new FileInputStream(file);
            OutputStream os = response.getOutputStream();
            byte[] buffer = new byte[1024];
            int len = 0;
            while ((len = fis.read(buffer)) > 0) {
                os.write(buffer, 0, len);
            }
            os.flush();
            os.close();
            fis.close();
        } else {
            response.getWriter().write("文件不存在!");
        }
    }

}

文件下载请求的处理函数为 download(),在其中通过 Content-Disposition 头和响应的输出流向浏览器返回文件内容,实现文件下载功能。

四、总结

本文介绍了如何使用 SpringMVC 实现文件上传和下载功能。对于文件上传功能,我们讲解了基础示例和进阶示例,通过表单标签库的使用,限制文件上传的大小和类型,同时支持多个文件上传。对于文件下载功能,我们通过设置响应头和响应体中的字节流向浏览器返回文件内容,实现了文件下载功能。

以上便是“SpringMVC教程之文件上传与下载详解”的完整攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringMVC教程之文件上传与下载详解 - Python技术站

(0)
上一篇 2023年6月15日
下一篇 2023年6月15日

相关文章

  • Java实现的计时器【秒表】功能示例

    Java实现计时器【秒表】功能示例攻略 1. 功能概述 Java实现计时器功能的主要思路是通过多线程实现,秒表的开始、暂停、重置等功能可以通过控制线程状态来实现。具体需要实现以下功能:- 开始计时:启动一个新线程,用于定时更新计时器的时间并显示在界面上。- 暂停计时:暂停计时器的定时更新线程,但计时器的时间不变。- 重置计时:将计时器的时间重置为0,同时将计…

    Java 2023年5月19日
    00
  • Redis妙用之存储用户token问题

    下面是关于“Redis妙用之存储用户token问题”的完整攻略。这是一个用Redis来存储用户token的应用场景,主要是为了解决分布式系统中的用户身份验证问题。 1. 背景介绍 在分布式系统中,使用token来进行用户身份验证是很常见的做法。当用户登录系统时,系统会创建一个token,并将该token返回给用户。用户在接下来的请求中,会在请求头或者请求体中…

    Java 2023年5月26日
    00
  • springboot实现邮箱验证码功能

    SpringBoot实现邮箱验证码功能 在Web应用程序中,验证码是一种常见的安全机制,它可以帮助我们防止恶意攻击和机器人攻击。本文将详细讲解如何使用SpringBoot实现邮箱验证码功能,包括以下内容: 邮箱验证码的基本概念 SpringBoot中的邮箱验证码实现方法 示例一:使用JavaMailSender发送邮件 示例二:使用Thymeleaf模板生成…

    Java 2023年5月15日
    00
  • SpringBoot程序预装载数据的实现方法及实践

    下面我来详细讲解一下“SpringBoot程序预装载数据的实现方法及实践”的完整攻略。 什么是SpringBoot数据预装载? SpringBoot数据预装载是指在应用程序启动时,自动加载一些初始数据并将其存储在内存中,以便在应用程序运行时使用。 SpringBoot数据预装载的实现方法 SpringBoot数据预装载的实现方法有以下两种方式: 1. 通过实…

    Java 2023年5月20日
    00
  • Java实现字符串解析为日期时间的方法示例

    引言 在Java中,字符串转日期时间是经常使用的操作之一。本文将讲解利用Java实现字符串解析为日期时间的方法示例。 问题概述 在Java中,我们可以通过SimpleDateFormat类来实现字符串解析为日期时间的目的。SimpleDateFormat是一个日期格式化类,通过指定的日期格式将日期转换为字符串,或将字符串按指定格式解析为日期。可以使用Simp…

    Java 2023年5月20日
    00
  • Java ArrayList集合详解(Java动态数组)

    Java ArrayList集合详解(Java动态数组) 什么是Java ArrayList? 在Java中,ArrayList是一种可以动态增长和缩小的数组序列,它是Array和Vector的非同步版本。它通过继承AbstractList类和实现List接口来提供了大小可以改变的数组的操作。 Java ArrayList的常用方法 1. 添加元素 Arra…

    Java 2023年5月26日
    00
  • springboot 集成dubbo的步骤详解

    下面是关于“Spring Boot集成Dubbo的步骤详解”的完整攻略,包含了以下内容: 环境搭建 引入依赖 编写Dubbo服务接口和实现类 配置Dubbo的服务提供者和消费者 演示实例 环境搭建 在开始前必须确定以下工具: 使用Java 1.8或以上版本 下载并安装ZooKeeper 下载Dubbo 引入依赖 使用Maven管理依赖,导入以下依赖: &lt…

    Java 2023年5月19日
    00
  • SpringBoot 中常用注解及各种注解作用

    来详细讲解一下SpringBoot中常用注解及各种注解作用的攻略。 1. @SpringBootApplication 这是一个复合注解,包含了@Configuration、@EnableAutoConfiguration和@ComponentScan三个注解。 @Configuration:表示这是一个配置类,可以用来替代xml配置文件。 @EnableA…

    Java 2023年5月15日
    00
合作推广
合作推广
分享本页
返回顶部