SpringMVC实现文件上传和下载的工具类

以下是详细的“SpringMVC实现文件上传和下载的工具类”的攻略。

目录

准备工作

在实现文件上传和下载之前,我们需要在pom.xml文件中添加相关的依赖项。如果你使用的是Maven,请在该文件中添加以下依赖项:

<dependency>
     <groupId>org.springframework</groupId>
     <artifactId>spring-webmvc</artifactId>
     <version>5.2.6.RELEASE</version>
 </dependency>

同时,我们还需要在web.xml文件中添加相关的配置项,如下所示:

<servlet>
     <servlet-name>DispatcherServlet</servlet-name>
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
     <init-param>
         <param-name>contextConfigLocation</param-name>
         <param-value>classpath:springmvc-config.xml</param-value>
     </init-param>
     <load-on-startup>1</load-on-startup>
 </servlet>
 <servlet-mapping>
     <servlet-name>DispatcherServlet</servlet-name>
     <url-pattern>/</url-pattern>
 </servlet-mapping>

上面的配置项中,需要注意的是contextConfigLocation。这里指定了springmvc-config.xml的配置文件路径,这个配置文件需要我们自己新建。

文件上传

文件上传是比较常见的操作,SpringMVC提供了很简单的方式来实现。下面我们来看看具体的实现步骤。

前端页面

首先,我们需要在前端页面中添加文件上传的表单。具体的代码如下所示:

<form action="uploadFile" method="post" enctype="multipart/form-data">
     <input type="file" name="file"/>
     <input type="submit" value="上传"/>
 </form>

上面的代码中,我们使用了HTML的form标签来添加文件上传的表单,其中action字段指定了上传请求的路径,这个后面会在后端Controller中实现。同时,我们也需要在input标签中指定type为file。

后端Controller

代码示例1:

@Controller
public class FileController {
     @RequestMapping(value = "/uploadFile", method = RequestMethod.POST)
     public String uploadFile(@RequestParam("file") MultipartFile file,ModelMap model) {
         //获取文件名
         String originalFilename=file.getOriginalFilename();
         //获取文件的扩展名
         String fileSuffix = originalFilename.substring(originalFilename.lastIndexOf(".")+1);
         //设置文件名字
         String fileName=UUID.randomUUID().toString()+"."+fileSuffix;
         //指定文件上传的路径
         File dest=new File("D:/uploadFile/"+fileName);
         try {
             //上传文件
             file.transferTo(dest);
             model.addAttribute("msg","上传成功");
         } catch (IOException e) {
             model.addAttribute("msg","上传失败");
             e.printStackTrace();
         }
         return "uploadResult";
     }
 }

上面的代码中,我们使用了@RequestParam注解来获取MultipartFile类型的文件对象,并且使用了transferTo方法将文件保存到指定的路径下。这里指定了D:/uploadFile为上传文件的路径,你可以根据自己的需求进行修改。

需要注意的是,在默认情况下,上传的文件是会受到大小限制的,这个大小限制默认为1MB。如果你想修改这个限制,可以在web.xml文件中添加以下配置项:

<multipart-config>
     <!--限制单个上传文件大小-->
     <max-file-size>50MB</max-file-size>
     <!--限制上传文件总大小-->
     <max-request-size>100MB</max-request-size>
     <!--设置临界值,当文件大于这个值时,才会写入临时文件夹。-->
     <file-size-threshold>0</file-size-threshold>
 </multipart-config>

代码示例2:

@Controller
public class FileController {
    @ResponseBody
    @RequestMapping(value="/upload", method=RequestMethod.POST)
    public String upload(HttpServletRequest request){
        //创建一个通用的多部分解析器
        CommonsMultipartResolver multipartResolver =
                new CommonsMultipartResolver(request.getSession().getServletContext());
        //判断 request 是否有文件上传,即多部分请求
        if(multipartResolver.isMultipart(request)){
            //转换成多部分request
            MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest)request;
            //取得request中的所有文件名
            Iterator<String> iter = multiRequest.getFileNames();
            while(iter.hasNext()){
                //取得上传文件
                MultipartFile file = multiRequest.getFile(iter.next());
                if(file != null){
                    //取得当前上传文件的文件名称
                    String myFileName = file.getOriginalFilename();
                    if(myFileName != null && myFileName.trim() !=""){
                        try {
                            //保存文件
                            FileUtils.copyInputStreamToFile(file.getInputStream(), new File("D:/uploadFile/"+myFileName));
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }

        }
        return "上传成功";
    }
}

上面的代码中,我们使用了CommonsMultipartResolver来处理文件上传,并通过FileUtils.copyInputStreamToFile方法来保存文件到指定的路径下。

文件下载
文件下载与文件上传类似,同样是使用SpringMVC提供的方法来实现。下面我们来看看具体的实现步骤。

后端Controller
首先,我们需要在后端Controller中实现文件下载的方法。具体的代码如下:

@RequestMapping("/downloadFile")
public ResponseEntity<InputStreamResource> downloadFile(@RequestParam String fileName) throws IOException {
     ClassPathResource file = new ClassPathResource("downloadFile/"+fileName+".pdf");
     InputStreamResource resource = new InputStreamResource(file.getInputStream());
     HttpHeaders headers = new HttpHeaders();
     headers.add("Content-Disposition", String.format("attachment; filename=\"%s\"", file.getFilename()));
     headers.add("Cache-Control", "no-cache, no-store, must-revalidate");
     headers.add("Pragma", "no-cache");
     headers.add("Expires", "0");
     ResponseEntity<InputStreamResource> response = ResponseEntity.ok().headers(headers).contentLength(file.contentLength()).contentType(MediaType.parseMediaType("application/octet-stream")).body(resource);
     return response;
 }

上面的代码中,我们使用了InputStreamResource类来将文件转换为流,并通过ResponseEntity对象将流导出到前端,用于实现文件下载的功能。同时,我们也使用了HttpHeaders来设置响应头信息,让浏览器以下载的方式打开文件。

需要注意的是,上面代码中的文件路径是在class路径下,如果你想下载的文件不在该路径下,需要将路径进行相应的修改。

前端页面
最后,我们需要在前端页面中添加下载链接。具体的代码如下:

<a href="downloadFile?fileName=test">下载文件</a>

上面的代码中,我们使用了a标签添加了下载链接,其中的href路径为下载请求的路径,这个路径会在后端Controller中进行拦截和处理。

总结
通过上述的攻略,我们可以很容易地实现文件上传和下载的操作。需要注意的是,这里只是提供了一种比较基础的实现方式,如果你有更加复杂的需求,可以根据自己的情况进行相应的修改和扩展。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringMVC实现文件上传和下载的工具类 - Python技术站

(0)
上一篇 2023年5月31日
下一篇 2023年5月31日

相关文章

  • Java使用NIO优化IO实现文件上传下载功能

    我来为您讲解一下“Java使用NIO优化IO实现文件上传下载功能”的完整攻略。 概述 Java NIO library 是Java语言提供的一种基于缓冲区、非阻塞的IO,使得Java应用程序能够快速轻便地处理并发客户端请求。使用Java NIO实现文件上传下载功能的好处是可以大大提高系统的吞吐量、降低系统的IO延迟,而且还能避免阻塞线程,提高服务器的并发能力…

    Java 2023年5月19日
    00
  • Spring Boot接口幂等插件用法示例解析

    Spring Boot接口幂等插件用法示例解析攻略 本文将详细介绍Spring Boot接口幂等插件的用法,并给出两个实例说明。 1. 简介 在分布式的应用中,为了保障数据的一致性,常常需要保证接口的幂等性。Spring Boot提供一个开源插件spring-boot-starter-idempotency来保证这一点。 该插件使用Redis来实现幂等性的检…

    Java 2023年5月26日
    00
  • 深入解析Session工作原理及运行流程

    深入解析Session工作原理及运行流程 在Web应用中,会话(Session)是指一种记录客户端与服务端交互的机制。需要注意的是,Session指的是服务端存储的数据结构,而Cookie指的是存储在客户端的一个文本文件。本文将深入探讨Session的工作原理及运行流程。 Session的工作原理 Session常常被用来存储用户的登录状态、购物车中的商品等…

    Java 2023年6月15日
    00
  • Spark JDBC操作MySQL方式详细讲解

    Spark JDBC操作MySQL方式详细讲解 简介 Spark可以使用JDBC访问关系型数据库,包括MySQL,Oracle,PostgreSQL等等。Spark的JDBC操作支持读写功能,本篇文章将为大家详细讲解如何使用Spark JDBC操作MySQL数据库。 步骤 1. 导入MySQL JDBC驱动 在使用Spark JDBC操作MySQL之前,需要…

    Java 2023年6月2日
    00
  • Java8如何构建一个Stream示例详解

    下面就详细讲解Java8如何构建一个Stream示例。 什么是Stream? Stream是Java8新引入的流式处理API,它可以使得对集合的操作更加高效,简洁,易于维护。通过使用Stream,我们可以完成众多集合操作,如转化、过滤、聚合等等。 构建一个Stream实例 构建一个由数值组成的流 可以通过如下代码构建一个由数值组成的流。 Stream<…

    Java 2023年5月26日
    00
  • Java的Spring AOP详细讲解

    关于“Java的Spring AOP详细讲解”的攻略,我可以给你讲解一下。首先,我们需要明白什么是AOP,AOP全称是Aspect Oriented Programming,即面向切面编程。它是一种编程思想,可以将程序中相同的横切面代码抽取出来,集中到一起进行管理和处理。Spring AOP是基于AOP思想的实现,可以很好的解决代码耦合问题。 在Spring…

    Java 2023年5月19日
    00
  • 简单了解java函数式编码结构及优势

    简单了解Java函数式编码结构及优势 前言 在 Java 8 中,函数式编程成为了一个重大的特性。这项特性使得开发人员可以写出更具有简洁性、清晰性和可维护性的代码。在本篇攻略中,我们将简单了解 Java 函数式编码的结构和优势。 函数式编码结构 Lambda 表达式 Lambda 表达式是 Java 8 中最重要的一个特性,是一种简洁地表示函数的方法。它可以…

    Java 2023年5月20日
    00
  • Servlet实现共享数据JavaWeb组件的几种方法

    让我们来详细讲解一下“Servlet实现共享数据JavaWeb组件的几种方法”。 1. 什么是JavaWeb组件 JavaWeb组件是指在JavaWeb开发中,可以复用的独立模块。主要包括以下几种组件: Servlet:处理HTTP请求和响应的Java类。 JSP:以HTML页面为基础,嵌入Java代码实现动态网页。 Filter:在请求和响应之间对数据进行…

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