Springboot+Springmvc实现文件的上传和下载(附源码)

在系统中实现文件上传下载的方式挺多,好比经过IO流的方式,经过springmvc的方式等等。综合比较,后一种性能更高。今天咱们就在springboot环境中来实现一下。html

文件上传

第一步:新建一个springboot项目。
java

第二步:新建FileController、SpringmvcfileApplication、upload.jsp文件,保证文件路径以下。

第三步:在pom文件中添加依赖。web

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!-- Spring Boot web启动器 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- jsp -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-jasper</artifactId>
            <!--<scope>provided</scope>-->
        </dependency>
    </dependencies>

第四步:编写Controller文件。其中“String filePath”处须要填写一个本机存在路径,不然会报路径错误。spring

package com.example.springmvcfile;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.util.List;

@Controller
public class FileController {
    private static final Logger LOGGER = LoggerFactory.getLogger(FileController.class);

    @GetMapping("/upload")
    public String upload() {
        return "upload";
    }
    
    @PostMapping("/upload")
    @ResponseBody
    public String upload(@RequestParam("file") MultipartFile file) {
        if (file.isEmpty()) {
            return "上传失败,请选择文件";
        }
        String fileName = file.getOriginalFilename();
        // 这须要填写一个本地路径
        String filePath ="E://springmvcfile//";
        File dest = new File(filePath + fileName);
        try {
            file.transferTo(dest);
            LOGGER.info("上传成功");
            return "上传成功";
        } catch (IOException e) {
            LOGGER.error(e.toString(), e);
        }
        return "上传失败!";
    }
}

第五步:保证启动类文件SpringmvcfileApplication不变。chrome

@SpringBootApplication
public class SpringmvcfileApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringmvcfileApplication.class, args);
    }
}

第六步:在application.properties文件中添加以下属性。apache

# 上传文件总的最大值
spring.servlet.multipart.max-request-size=10MB
# 单个文件的最大值
spring.servlet.multipart.max-file-size=10MB

## jsp
spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp

第七步:编写upload.jsp文件。浏览器

<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-type" content="text/html; charset=UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
    <title>单文件上传</title>
</head>
<body>
<form method="post" action="/upload" enctype="multipart/form-data">
    <input type="file" name="file"><br>
    <input type="submit" value="提交">
</form>
</body>
</html>

第八步:运行main方法,在浏览器中访问对应路径,测试是否成功。
在这里插入图片描述
选择文件上传成功后,去对应本机路径中查看上传的文件。
在这里插入图片描述tomcat

文件下载

文件下载的实现和上传大同小异,只需在原来的文件中修改2处便可。
第一步:在Controller层添加以下代码。springboot

@RequestMapping(value = "/download", method = RequestMethod.GET)
public ResponseEntity<Object> downloadFile() throws FileNotFoundException {
    //String fileName = "C:/Users/wds/Desktop/test.txt";
    String fileName = "E:/springmvcfile/1.jpg";
    File file = new File(fileName);
    InputStreamResource resource = new InputStreamResource(new FileInputStream((file)));

     HttpHeaders headers = new HttpHeaders();
     headers.add("Content-Disposition",String.format("attachment;filename=\"%s\"",file.getName()));
     headers.add("Cache-Control","no-cache,no-store,must-revalidate");
     headers.add("Pragma","no-cache");
     headers.add("Expires","0");

     ResponseEntity<Object> responseEntity = ResponseEntity.ok()
                                            .headers(headers)
                                            .contentLength(file.length())
                                            .contentType(MediaType.parseMediaType("application/text"))
                                            .body(resource);
      return responseEntity;
    }

第二步:在jsp文件中添加以下代码。mvc

<form>
    <a href="./download">下载</a>
</form>

第三步:进行测试。
在这里插入图片描述
咱们能够看到,在路径下有两张图片,如今我要把1.jpg下载下来。
在这里插入图片描述

小结

源码地址:
连接:https://pan.baidu.com/s/14tbBX6AmVAuMeKQX1FcvZg 提取码:e8wb