Spring MVC实现文件上传

291 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第26天,点击查看活动详情

前言

在我们的项目当中,文件上传下载使用的是非常频繁的功能。关于文件上传和下载的功能,我们实现的方式有很多。Spring MVC也对文件的上传和下载进行了封装,更加方便了我们实现文件上传和下载的操作。底层的原理是通过I/O流来实现的。这篇文章我们就来讲下Spring MVC的文件上传。

文件上传

原理

文件上传就是把客户端的文件资源通过网络请求将文件传输到服务器,服务器再通过输入流读取文件,再通过输出流保存到服务器的本地。

文件上传

1.我们这里需要在pom.xml中引入两个依赖

<dependency>
  <groupId>commons-io</groupId>
  <artifactId>commons-io</artifactId>
  <version>2.7</version>
</dependency>

<dependency>
  <groupId>commons-fileupload</groupId>
  <artifactId>commons-fileupload</artifactId>
  <version>1.3.1</version>
</dependency>

2.创建上传文件的页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <form action="/file/upload" method="post" enctype="multipart/form-data">
        <input type="file" name="image">
        <input type="submit" value="上传图片">
    </form>
</body>
</html>

这里的请求方法method必须是postenctype必须是multipart/form-data这是用于文件上传的,如果设置成其他的,传过去的就是个字符串,而不是文件的内容。

3.配置MultipartFile。

@Bean
public MultipartResolver multipartResolver() throws IOException {
    CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
    multipartResolver.setUploadTempDir(new FileSystemResource("/var/local/tmp"));
    return multipartResolver;
}

MultipartFile是SpringMVC提供简化上传操作的工具类。

4.配置customizeRegistration。

@Override
protected void customizeRegistration(ServletRegistration.Dynamic registration) {
    registration.setMultipartConfig(new MultipartConfigElement("/var/local/tmp"));
}

CommonsMultipartResolver是基于Apache的Commons FileUpload来实现文件上传功能的。

5.创建fileController。

@Controller
@RequestMapping("/file")
public class fileController {

    @GetMapping("/fileUpload")
    public String fileUpload(){
        return "fileUpload";
    }

    @PostMapping("/upload")
    public String upload(MultipartFile image, HttpServletRequest request) throws IOException {

        if (image.getSize() > 0){
            String path = request.getServletContext().getRealPath("file");

            String fileName = image.getOriginalFilename();

            File file = new File(path,fileName);

            image.transferTo(file);
        }

        return "fileUpload";
    }
}

这里的image对应的是我们文件上传页面typefileinputname值。使用request获取我们上传的文件绝对路径,将我们的文件存储在file的文件夹下面,然后获取上传的文件名,使用I/O流的方式将名字一样的文件存储到file文件夹下,最后使用transferTo将文件的数据给到file文件夹下的同名文件中,这样就实现了文件上传。

6.启动项目测试。

微信截图_20221024231659.png 进入文件上传页面。

选择文件上传。

微信截图_20221024231758.png

我们的图片这时候就上传到了webapp文件夹下面的file文件夹下面。

微信截图_20221024231909.png

图片展示。

微信截图_20221024232030.png

上传成功。

因为我们这里是本地的项目,服务器和客户端是同一台电脑,所以上传到本地文件夹下,在真实的项目中我们的文件是会上传到服务器上面的。