首页 > 其他分享 >Spring Boot实现文件上传和下载

Spring Boot实现文件上传和下载

时间:2024-09-08 20:52:28浏览次数:7  
标签:java Spring Boot springframework fileName file import org 上传

1.背景

项目中经常会有上传和下载的需求,这篇文章简述一下springboot项目中实现简单的上传和下载。


2.代码工程

实验目标

实现简单的文件上传和下载

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>springboot-demo</artifactId>
        <groupId>com.et</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
 
    <artifactId>file</artifactId>
 
    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
 
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-autoconfigure</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpmime</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>
</project>

controller

Web项目中,文件的上传和下载服务也是基于HTTP请求的,文件上传由于需要向服务接口提交数据,可以使用POST的请求方式,而文件的下载只是获取数据,因此可以使用GET请求方式。  


package com.et.controller;
 
import com.et.bean.FileInfo;
import com.et.service.FileUploadService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.Resource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
 
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
@RestController
public class HelloWorldController {
    @RequestMapping("/hello")
    public Map<String, Object> showHelloWorld(){
        Map<String, Object> map = new HashMap<>();
        map.put("msg", "HelloWorld");
        return map;
    }
    @Autowired
    private FileUploadService fileUploadService;
 
 
    /**
     * upload
     *
     * @param files
     * @return
     */
    @PostMapping("/upload")
    public ResponseEntity<String> upload(@RequestParam("files") MultipartFile[] files) {
        fileUploadService.upload(files);
        return ResponseEntity.ok("File Upload Success");
    }
 
    /**
     *  files
     *
     * @return
     */
    @GetMapping("/files")
    public ResponseEntity<List<FileInfo>> list() {
        return ResponseEntity.ok(fileUploadService.list());
    }
 
    /**
     * get file by name
     *
     * @param fileName
     * @return
     */
    @GetMapping("/files/{fileName:.+}")
    public ResponseEntity<Resource> getFile(@PathVariable("fileName") String fileName) {
        return ResponseEntity.ok().header(HttpHeaders.CONTENT_DISPOSITION,
                "attachment; filename=\"" + fileName + "\"").body(fileUploadService.getFile(fileName));
    }
}

service

创建好指定的文件存放路径文件夹后,上传逻辑只需要将接收到的文件数据赋值到指定路径后即可。


file.getInputStream(),接收文件参数的对应字节流

this.path.resolve(file.getOriginalFilename()),指定的path路径拼接接收文件的原始名称作为文件的路径信息

Files.copy(),复制文件的方法

文件的下载逻辑是根据指定的文件名称到文件资源文件夹中获取,如果存在则返回文件。


this.path.resolve(fileName),构建文件全路径

new UrlResource(file.toUri()),根据文件路径创建URL源

resource.exists() && resource.isReadable(),文件存在并且可读时返回

package com.et.service;
 
import com.et.bean.FileInfo;
import org.springframework.core.io.Resource;
import org.springframework.web.multipart.MultipartFile;
 
import java.util.List;
 
 
public interface FileUploadService {
 
    void upload(MultipartFile[] files);
 
    List<FileInfo> list();
 
    Resource getFile(String fileName);
}
package com.et.service.impl;
 
import com.et.bean.FileInfo;
import com.et.service.FileUploadService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource;
import org.springframework.stereotype.Service;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.multipart.MultipartFile;
 
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
 
@Service
@Slf4j
public class FileUploadServiceImpl implements FileUploadService {
    @Value("${upload.path:/data/upload/}")
    private String filePath;
 
    private static final List<FileInfo> FILE_STORAGE = new CopyOnWriteArrayList<>();
 
    @Override
    public void upload(MultipartFile[] files) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        for (MultipartFile file : files) {
            String fileName = file.getOriginalFilename();
            boolean match = FILE_STORAGE.stream().anyMatch(fileInfo -> fileInfo.getFileName().equals(fileName));
            if (match) {
                throw new RuntimeException("File [ " + fileName + " ] already exist");
            }
 
            String currentTime = simpleDateFormat.format(new Date());
            try (InputStream in = file.getInputStream();
                 OutputStream out = Files.newOutputStream(Paths.get(filePath + fileName))) {
                FileCopyUtils.copy(in, out);
            } catch (IOException e) {
                log.error("File [{}] upload failed", fileName, e);
                throw new RuntimeException(e);
            }
            FileInfo fileInfo = new FileInfo().setFileName(fileName).setUploadTime(currentTime);
            FILE_STORAGE.add(fileInfo);
        }
    }
 
    @Override
    public List<FileInfo> list() {
        return FILE_STORAGE;
    }
 
    @Override
    public Resource getFile(String fileName) {
        FILE_STORAGE.stream()
                .filter(info -> info.getFileName().equals(fileName))
                .findFirst()
                .orElseThrow(() -> new RuntimeException("File [ " + fileName + " ] not exist"));
        File file = new File(filePath + fileName);
        return new FileSystemResource(file);
    }
}
application.properties
spring.servlet.multipart.max-file-size=150MB
spring.servlet.multipart.max-request-size=200MB
spring.servlet.multipart.file-size-threshold=100MB
upload.path=/Users/liuhaihua/tmp/

以上只是一些关键代码,所有代码请参见下面代码仓库


代码仓库

https://github.com/Harries/springboot-demo(File)

3.测试

启动Spring Boot应用

使用postman请求下载接口时,接口返回文件,postman会直接解析文件内容,如果无法正确解析则会显示乱码信息。如果在浏览器请求接口时,返回文件时浏览器会弹出下载文件的提示。

上传测试



下载测试



4.引用

https://github.com/callicoder/spring-boot-file-upload-download-rest-api-example

Spring Boot实现文件上传和下载 | Harries Blog™

标签:java,Spring,Boot,springframework,fileName,file,import,org,上传
From: https://blog.51cto.com/JiangJinHao/11952969

相关文章

  • redis基础——SpringDataRedis入门
    redis基础——SpringDataRedis入门最近在学习redis,学到了redis的java客户端,其中最常用的是Jedis和lettuce,而SpringDataRedis是spring整合了Jedis和lettuce的产物,它提供了RedisTemplate工具类,封装各种对redis的操作,将不同数据类型的API封装到了不同类型中,避免了代码臃肿。S......
  • python+flask计算机毕业设计基于单片机及spring框架的高血压患者居家监测系统(程序+开
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着现代社会生活节奏的加快和人口老龄化趋势的加剧,高血压作为一种常见的慢性疾病,其发病率逐年上升,已成为影响公众健康的重要因素之一。传......
  • Spring MVC: 构建Web应用的强大框架
    SpringMVC:构建现代Web应用的强大框架1.MVC设计模式简介MVC(Model-View-Controller)是一种广泛使用的软件设计模式,它将应用程序的逻辑分为三个相互关联的组件:Model(模型):负责管理数据、业务逻辑和规则。View(视图):负责用户界面的展示,将数据呈现给用户。Con......
  • 基于springboot在线点餐毕设系统
    一、项目介绍基于SpringBootVue的网上点餐系统角色:管理员、用户、服务人员管理员:管理员通过用户名和密码、角色填写完成后进行登录,如图5-4所示。管理员登录成功后进入到系统操作界面,可以对首页、个人中心、用户管理、美食店管理、美食分类管理、美食信息管理、美食订单......
  • 春意融融:SpringBoot打造在线订餐服务
    1绪论1.1研究背景随着互联网技术的快速发展,网络时代的到来,网络信息也将会改变当今社会。各行各业在日常企业经营管理等方面也在慢慢的向规范化和网络化趋势汇合[13]。电子商务必将成为未来商务的主流,因此对于餐饮行业来说,建立一个网上订餐系统是必不可少的一种销售模式;......
  • 春日美食汇:基于SpringBoot的订餐平台
    2系统关键技术2.1JSP技术JSP(Java脚本页面)是Sun和许多参与建立的公司所提倡的动态web技术。将Java程序添加到传统的web页面HTML文件()。htm,。Html)[1]。JSP这种能够独立使用的编程语言可以嵌入在html语言里面运行,正因为JSP参照了许多编程语言的特性,使得JSP在web的脚......
  • 基于SpringBoot的美食分享平台设计与实现,LW+源码+部署讲解
    一、绪论1.1研究意义当今社会作为一个飞速的发展社会,网络已经完全渗入人们的生活,网络信息已成为传播的第一大媒介,可以毫不夸张说网络资源获取已逐步改变了人们以前的生活方式,网络已成为人们日常,休闲主要工具。人们记录、分享和发现美食的方式正在逐渐发生改变,因此借助怎......
  • 心理辅导新体验:Spring Boot心理咨询应用
    5系统实现5.1用户信息管理管理员管理用户信息,可以添加,修改,删除用户信息信息。下图就是用户信息管理页面。图5.1用户信息管理页面5.2试卷信息管理管理员管理试卷信息,可以添加,修改,删除试卷信息信息。下图就是试卷信息管理页面。图5.2试卷信息管理页面5.3试题信息......
  • Spring Boot 整合 RabbitMQ 详解
    前言:在消息中间件领域中RabbitMQ也是一种非常常见的消息中间件了,本篇简单分享一下SpringBoot项目集成RabbitMQ的过程。RabbitMQ系列文章传送门RabbitMQ的介绍及核心概念讲解@RabbitListener注解详解SpringBoot集成RabbitMQ可以分为三大步,如下:在proerti......
  • 心灵关怀:Spring Boot学生心理咨询系统
    1绪论1.1研究背景现在大家正处于互联网加的时代,这个时代它就是一个信息内容无比丰富,信息处理与管理变得越加高效的网络化的时代,这个时代让大家的生活不仅变得更加地便利化,也让时间变得更加地宝贵化,因为每天的每分钟,每秒钟这些时间都能让人们处理大批量的日常事务,这些场......