Java(二):Spring Boot 项目-文件的增删改查下载

news2024/11/25 14:42:28

Spring Boot 项目-文件的增删改查下载

    • 准备
      • docker运行mysql
      • 设置MySQL时区
      • 查看当前MySQL使用的时区
      • MySQL建库建表
    • 定义两个实体类
      • 数据表实体类
      • 查询条件实体类
    • 工具类
      • `com/example/user/utils/FileUtil.java`
    • 用到的SQL语句
      • mapper `user/src/main/resources/mapper/FileTableDao.xml`
    • 增/改(上传)
      • controller `com/example/user/controller/FileTableController.java`
      • service `com/example/user/service/impl/FileTableServiceImpl.java`
      • controller `com/example/user/controller/FileTableController.java`
      • service `com/example/user/service/impl/FileTableServiceImpl.java`
      • controller `com/example/user/controller/FileTableController.java`
      • service `com/example/user/service/impl/FileTableServiceImpl.java`
    • 下载
      • controller `com/example/user/controller/FileTableController.java`
      • service `com/example/user/service/impl/FileTableServiceImpl.java`
    • 完整源码
      • 目录结构
      • 源码

准备

docker运行mysql

$ docker run --name local-mysql -p 3306:3306 -v /Users/lee/Documents/AAA-PLee/C-Code/mysql/conf.d:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 -d mysql

设置MySQL时区

添加修改 /mysql/conf.d/xxx.cnf 文件,并重启 MySQL

[mysqld]

default-time_zone = '+8:00'

查看当前MySQL使用的时区

SELECT @@global.time_zone; # +08:00

MySQL建库建表

create database java_app;
create table java_app.file_table
(
    id         varchar(255)                     not null primary key, -- 文件ID
    name       varchar(255)                     not null,             -- 文件真实名称
    extension  varchar(10)                      null,                 -- 文件扩展名
    type       varchar(255)                     null,                 -- 文件类型
    size       int                              not null,             -- 文件大小(单位:字节)
    status     int          default 1           not null,             -- 文件当前状态(0删除,1存在)
    createTime datetime     default NOW()       not null,             -- 文件创建时间
    updateTime datetime                         null                  -- 文件修改时间
);

定义两个实体类

数据表实体类

注意:规定参数时区

com/example/user/entity/FileTable.java

package com.example.user.entity;

import com.fasterxml.jackson.annotation.JsonFormat;

import java.util.Date;
import java.io.Serializable;

/**
 * (FileTable)实体类
 */
public class FileTable implements Serializable {

    private String id;

    private String name;

    private String extension;

    private String type;

    private Integer size;

    private Integer status;

    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    private Date createTime;

    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    private Date updateTime;


    public FileTable(String id, String name, String extension, String type, Integer size) {
        this.id = id;
        this.name = name;
        this.extension = extension;
        this.type = type;
        this.size = size;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getExtension() {
        return extension;
    }

    public void setExtension(String extension) {
        this.extension = extension;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public Integer getSize() {
        return size;
    }

    public void setSize(Integer size) {
        this.size = size;
    }

    public Integer getStatus() {
        return status;
    }

    public void setStatus(Integer status) {
        this.status = status;
    }

    public Date getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }

    public Date getUpdateTime() {
        return updateTime;
    }

    public void setUpdateTime(Date updateTime) {
        this.updateTime = updateTime;
    }

}

查询条件实体类

com/example/user/entity/FileTableCondition.java

package com.example.user.entity;

import java.io.Serializable;
import java.util.Date;

/**
 * 查询条件
 */
public class FileTableCondition implements Serializable {

    private String id;

    private String name;

    private String extension;

    private String type;

    private Integer minSize;

    private Integer maxSize;

    private Integer status;

    private Date startCreateTime;

    private Date endCreateTime;

    private Date startUpdateTime;

    private Date endUpdateTime;

    public FileTableCondition(
            String id, String name, String extension, String type,
            Integer status,
            Integer minSize, Integer maxSize,
            Date startCreateTime, Date endCreateTime,
            Date startUpdateTime, Date endUpdateTime
    ) {
        this.id = id;
        this.name = name;
        this.extension = extension;
        this.type = type;
        this.status = status;
        this.minSize = minSize;
        this.maxSize = maxSize;
        this.startCreateTime = startCreateTime;
        this.endCreateTime = endCreateTime;
        this.startUpdateTime = startUpdateTime;
        this.endUpdateTime = endUpdateTime;
    }
}

工具类

com/example/user/utils/FileUtil.java

package com.example.user.utils;

import com.example.user.entity.FileTable;
import org.springframework.core.io.FileSystemResource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.UUID;

/**
 * 文件工具类
 */
public class FileUtil {

    // 文件保存路径
    private static final String FILE_PATH = "/Users/lee/Documents/AAA-PLee/C-Code/java-app/UploadFiles/";

    /**
     * 保存文件
     *
     * @param fileId        文件ID
     * @param multipartFile 文件
     * @return 文件信息
     * @throws IOException 错误信息
     */
    public static FileTable saveFile(String fileId, MultipartFile multipartFile) throws IOException {
        // 文件完整名称
        String originalFilename = multipartFile.getOriginalFilename();
        // 断言文件名不为空
        assert originalFilename != null;

        // 随机ID作为文件名
        String id = null == fileId || fileId.isEmpty() ? UUID.randomUUID().toString() : fileId;
        // 文件名
        String name = originalFilename.substring(0, originalFilename.lastIndexOf("."));
        // 文件扩展名
        String extension = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);
        // 文件类型
        String type = multipartFile.getContentType();
        // 文件大小(单位:字节)
        int size = (int) multipartFile.getSize();

        // 目标存储位置
        String path = FILE_PATH + id;
        // 把上传的文件转存到目标目录
        multipartFile.transferTo(new File(path));

        // 实例化文件信息
        return new FileTable(id, name, extension, type, size);
    }

    /**
     * 下载文件
     *
     * @param fileTable 实例对象
     * @return 文件流
     */
    public static ResponseEntity<FileSystemResource> downloadFile(FileTable fileTable) {
        File file = new File(FILE_PATH + fileTable.getId());
        FileSystemResource fileSystemResource = new FileSystemResource(file);

        String fileName = fileTable.getName() + "." + fileTable.getExtension();
        HttpHeaders headers = new HttpHeaders();
        headers.add("Content-Disposition", "attachment; filename=" + fileName);
        headers.add("Pragma", "no-cache");
        headers.add("Cache-Control", "no-cache");
        headers.add("Expires", "0");

        return ResponseEntity
                .ok()
                .headers(headers)
                .contentLength(file.length())
                .contentType(MediaType.parseMediaType(fileTable.getType()))
                .body(fileSystemResource);
    }

}

用到的SQL语句

mapper user/src/main/resources/mapper/FileTableDao.xml

注意:Integerint区别

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.user.dao.FileTableDao">

    <resultMap type="com.example.user.entity.FileTable" id="FileTableMap">
        <result property="id" column="id" jdbcType="VARCHAR"/>
        <result property="name" column="name" jdbcType="VARCHAR"/>
        <result property="extension" column="extension" jdbcType="VARCHAR"/>
        <result property="type" column="type" jdbcType="VARCHAR"/>
        <result property="size" column="size" jdbcType="INTEGER"/>
        <result property="status" column="status" jdbcType="INTEGER"/>
        <result property="createTime" column="createTime" jdbcType="TIMESTAMP"/>
        <result property="updateTime" column="updateTime" jdbcType="TIMESTAMP"/>
    </resultMap>

    <!--新增一条数据-->
    <insert id="insert" keyProperty="" useGeneratedKeys="true">
        insert into file_table(id, name, extension, type, size)
        values (#{id}, #{name}, #{extension}, #{type}, #{size})
    </insert>

    <!--新增多条数据-->
    <insert id="insertList" parameterType="java.util.List">
        insert into file_table(id, name, extension, type, size)
        values
        <foreach collection="list" item="item" index="index" separator=",">
            (#{item.id}, #{item.name}, #{item.extension}, #{item.type}, #{item.size})
        </foreach>
    </insert>

    <!--通过文件ID删除-->
    <delete id="deleteById">
        update file_table set status = 0, updateTime = NOW() where id = #{id}
    </delete>

    <!--通过文件ID修改数据-->
    <update id="update">
        update file_table
        <set>
            updateTime = NOW(),
            <if test="name != null and name != ''">
                name = #{name},
            </if>
            <if test="extension != null and extension != ''">
                extension = #{extension},
            </if>
            <if test="type != null and type != ''">
                type = #{type},
            </if>
            <if test="size != null and size != ''">
                size = #{size},
            </if>
            <if test="status != null and status != ''">
                status = #{status}
            </if>
        </set>
        where id = #{id}
    </update>

    <!--根据ID查询数据-->
    <select id="queryById" resultMap="FileTableMap">
        select * from file_table
        <where>
            id = #{id}
        </where>
    </select>

    <!--根据ID查询数据-->
    <select id="queryByIds" resultMap="FileTableMap">
        select * from file_table
        <where>
            <foreach collection="list" item="id" index="index">
                <if test="id != null and id != ''">
                    or id = #{id}
                </if>
            </foreach>
        </where>
    </select>

    <!--条件查询数据-->
    <select id="queryByCondition" resultMap="FileTableMap">
        select * from file_table
        <where>
            <if test="id != null and id != ''">
                and id = #{id}
            </if>
            <if test="name != null and name != ''">
                and name = #{name}
            </if>
            <if test="extension != null and extension != ''">
                and extension = #{extension}
            </if>
            <if test="type != null and type != ''">
                and type = #{type}
            </if>
            <if test="status != null">
                and status = #{status}
            </if>
            <if test="minSize != null">
                and size <![CDATA[ >= ]]> #{minSize}
            </if>
            <if test="maxSize != null">
                and size <![CDATA[ <= ]]> #{maxSize}
            </if>
            <if test="startCreateTime != null">
                and DATE_FORMAT(createTime, '%Y-%m-%d') <![CDATA[ >= ]]> DATE_FORMAT(#{startCreateTime}, '%Y-%m-%d')
            </if>
            <if test="endCreateTime != null">
                and DATE_FORMAT(createTime, '%Y-%m-%d') <![CDATA[ <= ]]> DATE_FORMAT(#{endCreateTime}, '%Y-%m-%d')
            </if>
            <if test="startUpdateTime != null">
                and DATE_FORMAT(updateTime, '%Y-%m-%d') <![CDATA[ >= ]]> DATE_FORMAT(#{startUpdateTime}, '%Y-%m-%d')
            </if>
            <if test="endUpdateTime != null">
                and DATE_FORMAT(updateTime, '%Y-%m-%d') <![CDATA[ <= ]]> DATE_FORMAT(#{endUpdateTime}, '%Y-%m-%d')
            </if>
        </where>
    </select>

</mapper>

增/改(上传)

controller com/example/user/controller/FileTableController.java

package com.example.user.controller;

import com.example.user.entity.FileTable;
import com.example.user.entity.FileTableCondition;
import com.example.user.service.FileTableService;
import org.springframework.core.io.FileSystemResource;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import java.io.IOException;
import java.util.Date;
import java.util.List;

/**
 * (FileTable)表控制层
 */
@RestController
@RequestMapping("fileTable")
public class FileTableController {

    /**
     * 服务对象
     */
    @Resource
    private FileTableService fileTableService;

    /**
     * 单/多文件上传 (新增/编辑)
     *
     * @param id             文件ID
     * @param multipartFiles 文件
     * @return 文件信息
     */
    @PostMapping("/upload")
    public ResponseEntity<Object> upload(String id, @RequestParam("file") MultipartFile[] multipartFiles) throws IOException {
        if (null != id && !id.isEmpty() && multipartFiles.length > 0) {
            return ResponseEntity.ok(this.fileTableService.upload(id, multipartFiles[0]));
        } else {
            if (multipartFiles.length > 1) {
                return ResponseEntity.ok(this.fileTableService.upload("", multipartFiles));
            } else {
                return ResponseEntity.ok(this.fileTableService.upload("", multipartFiles[0]));
            }
        }
    }
}

service com/example/user/service/impl/FileTableServiceImpl.java

package com.example.user.service.impl;

import com.example.user.dao.FileTableDao;
import com.example.user.entity.FileTable;
import com.example.user.entity.FileTableCondition;
import com.example.user.service.FileTableService;
import com.example.user.utils.FileUtil;
import org.springframework.core.io.FileSystemResource;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import java.io.IOException;
import java.util.*;
import java.util.stream.Collectors;

/**
 * (FileTable)表服务实现类
 */
@Service("filesService")
public class FileTableServiceImpl implements FileTableService {

    @Resource
    private FileTableDao fileTableDao;

    /**
     * 单文件上传
     *
     * @param id            文件ID
     * @param multipartFile 文件
     * @return 文件信息
     */
    @Override
    public FileTable upload(String id, MultipartFile multipartFile) throws IOException {
        if (null == id || id.isEmpty()) {
            FileTable fileTable = FileUtil.saveFile("", multipartFile);
            this.fileTableDao.insert(fileTable);
            return this.fileTableDao.queryById(fileTable.getId());
        } else {
            FileTable fileTable = FileUtil.saveFile(id, multipartFile);
            this.fileTableDao.update(fileTable);
            return this.fileTableDao.queryById(fileTable.getId());
        }
    }

    /**
     * 多文件上传
     *
     * @param id             文件ID
     * @param multipartFiles 文件
     * @return 文件信息
     */
    @Override
    public List<FileTable> upload(String id, MultipartFile[] multipartFiles) throws IOException {
        List<FileTable> fileList = new ArrayList<>();
        for (MultipartFile multipartFile : multipartFiles) {
            fileList.add(FileUtil.saveFile("", multipartFile));
        }
        this.fileTableDao.insertList(fileList);
        List<String> ids = fileList.stream().map(FileTable::getId).collect(Collectors.toList());
        return this.fileTableDao.queryByIds(ids);
    }

}

controller com/example/user/controller/FileTableController.java

package com.example.user.controller;

import com.example.user.entity.FileTable;
import com.example.user.entity.FileTableCondition;
import com.example.user.service.FileTableService;
import org.springframework.core.io.FileSystemResource;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import java.io.IOException;
import java.util.Date;
import java.util.List;

/**
 * (FileTable)表控制层
 */
@RestController
@RequestMapping("fileTable")
public class FileTableController {

    /**
     * 服务对象
     */
    @Resource
    private FileTableService fileTableService;

    /**
     * 删除数据
     *
     * @param id 文件ID
     * @return 删除是否成功
     */
    @DeleteMapping("{id}")
    public ResponseEntity<Boolean> deleteById(@PathVariable("id") String id) {
        return ResponseEntity.ok(this.fileTableService.deleteById(id));
    }

}

service com/example/user/service/impl/FileTableServiceImpl.java

package com.example.user.service.impl;

import com.example.user.dao.FileTableDao;
import com.example.user.entity.FileTable;
import com.example.user.entity.FileTableCondition;
import com.example.user.service.FileTableService;
import com.example.user.utils.FileUtil;
import org.springframework.core.io.FileSystemResource;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import java.io.IOException;
import java.util.*;
import java.util.stream.Collectors;

/**
 * (FileTable)表服务实现类
 */
@Service("filesService")
public class FileTableServiceImpl implements FileTableService {

    @Resource
    private FileTableDao fileTableDao;

    /**
     * 通过文件ID删除数据
     *
     * @param id 文件ID
     * @return 是否成功
     */
    @Override
    public boolean deleteById(String id) {
        return this.fileTableDao.deleteById(id) > 0;
    }

}

controller com/example/user/controller/FileTableController.java

注意:时间格式

package com.example.user.controller;

import com.example.user.entity.FileTable;
import com.example.user.entity.FileTableCondition;
import com.example.user.service.FileTableService;
import org.springframework.core.io.FileSystemResource;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import java.io.IOException;
import java.util.Date;
import java.util.List;

/**
 * (FileTable)表控制层
 */
@RestController
@RequestMapping("fileTable")
public class FileTableController {

    /**
     * 服务对象
     */
    @Resource
    private FileTableService fileTableService;

    /**
     * 条件查询
     *
     * @param id              文件ID
     * @param name            文件真实名称
     * @param extension       文件扩展名
     * @param type            文件类型
     * @param minSize         最小文件大小(单位:字节)
     * @param maxSize         最大文件大小(单位:字节)
     * @param status          文件当前状态(0删除,1存在)
     * @param startCreateTime 文件创建开始时间
     * @param endCreateTime   文件创建结束时间
     * @param startUpdateTime 文件修改开始时间
     * @param endUpdateTime   文件修改结束时间
     * @return 文件信息
     */
    @GetMapping
    public ResponseEntity<List<FileTable>> queryByCondition(
            @RequestParam(required = false) String id,
            @RequestParam(required = false) String name,
            @RequestParam(required = false) String extension,
            @RequestParam(required = false) String type,
            @RequestParam(required = false) Integer status,
            @RequestParam(required = false) Integer minSize,
            @RequestParam(required = false) Integer maxSize,
            @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date startCreateTime,
            @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date endCreateTime,
            @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date startUpdateTime,
            @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date endUpdateTime
    ) {
        FileTableCondition fileTableCondition = new FileTableCondition(
                id, name, extension, type,
                status,
                minSize, maxSize,
                startCreateTime, endCreateTime,
                startUpdateTime, endUpdateTime
        );
        return ResponseEntity.ok(this.fileTableService.queryByCondition(fileTableCondition));
    }

}

service com/example/user/service/impl/FileTableServiceImpl.java

package com.example.user.service.impl;

import com.example.user.dao.FileTableDao;
import com.example.user.entity.FileTable;
import com.example.user.entity.FileTableCondition;
import com.example.user.service.FileTableService;
import com.example.user.utils.FileUtil;
import org.springframework.core.io.FileSystemResource;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import java.io.IOException;
import java.util.*;
import java.util.stream.Collectors;

/**
 * (FileTable)表服务实现类
 */
@Service("filesService")
public class FileTableServiceImpl implements FileTableService {

    @Resource
    private FileTableDao fileTableDao;

    /**
     * 条件查询
     *
     * @param fileTableCondition 实例对象
     * @return 文件信息
     */
    @Override
    public List<FileTable> queryByCondition(FileTableCondition fileTableCondition) {
        return this.fileTableDao.queryByCondition(fileTableCondition);
    }

}

下载

controller com/example/user/controller/FileTableController.java

package com.example.user.controller;

import com.example.user.entity.FileTable;
import com.example.user.entity.FileTableCondition;
import com.example.user.service.FileTableService;
import org.springframework.core.io.FileSystemResource;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import java.io.IOException;
import java.util.Date;
import java.util.List;

/**
 * (FileTable)表控制层
 */
@RestController
@RequestMapping("fileTable")
public class FileTableController {

    /**
     * 服务对象
     */
    @Resource
    private FileTableService fileTableService;

    @GetMapping("/download/{id}")
    public ResponseEntity<FileSystemResource> download(@PathVariable("id") String id){
        return this.fileTableService.downloadById(id);
    }

}

service com/example/user/service/impl/FileTableServiceImpl.java

package com.example.user.service.impl;

import com.example.user.dao.FileTableDao;
import com.example.user.entity.FileTable;
import com.example.user.entity.FileTableCondition;
import com.example.user.service.FileTableService;
import com.example.user.utils.FileUtil;
import org.springframework.core.io.FileSystemResource;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import java.io.IOException;
import java.util.*;
import java.util.stream.Collectors;

/**
 * (FileTable)表服务实现类
 */
@Service("filesService")
public class FileTableServiceImpl implements FileTableService {

    @Resource
    private FileTableDao fileTableDao;

    /**
     * 文件下载
     *
     * @param id 文件ID
     * @return 文件流
     */
    @Override
    public ResponseEntity<FileSystemResource> downloadById(String id) {
        FileTable fileTable = this.fileTableDao.queryById(id);
        return FileUtil.downloadFile(fileTable);
    }
}

完整源码

目录结构

在这里插入图片描述

源码

user/src/main/resources/application.yml

server:
  port: 8000

spring:
  application:
    name: user-service
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/java_app
    username: root
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver

mybatis:
  mapper-locations: classpath:**/mapper/*.xml

com/example/user/UserApplication.java

package com.example.user;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.mybatis.spring.annotation.MapperScan;

@SpringBootApplication
@MapperScan(basePackages = "com.example.user.dao")
public class UserApplication {

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

}

com/example/user/controller/FileTableController.java

package com.example.user.controller;

import com.example.user.entity.FileTable;
import com.example.user.entity.FileTableCondition;
import com.example.user.service.FileTableService;
import org.springframework.core.io.FileSystemResource;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import java.io.IOException;
import java.util.Date;
import java.util.List;

/**
 * (FileTable)表控制层
 */
@RestController
@RequestMapping("fileTable")
public class FileTableController {

    /**
     * 服务对象
     */
    @Resource
    private FileTableService fileTableService;

    /**
     * 单/多文件上传 (新增/编辑)
     *
     * @param id             文件ID
     * @param multipartFiles 文件
     * @return 文件信息
     */
    @PostMapping("/upload")
    public ResponseEntity<Object> upload(String id, @RequestParam("file") MultipartFile[] multipartFiles) throws IOException {
        if (null != id && !id.isEmpty() && multipartFiles.length > 0) {
            return ResponseEntity.ok(this.fileTableService.upload(id, multipartFiles[0]));
        } else {
            if (multipartFiles.length > 1) {
                return ResponseEntity.ok(this.fileTableService.upload("", multipartFiles));
            } else {
                return ResponseEntity.ok(this.fileTableService.upload("", multipartFiles[0]));
            }
        }
    }

    /**
     * 删除数据
     *
     * @param id 文件ID
     * @return 删除是否成功
     */
    @DeleteMapping("{id}")
    public ResponseEntity<Boolean> deleteById(@PathVariable("id") String id) {
        return ResponseEntity.ok(this.fileTableService.deleteById(id));
    }

    /**
     * 条件查询
     *
     * @param id              文件ID
     * @param name            文件真实名称
     * @param extension       文件扩展名
     * @param type            文件类型
     * @param minSize         最小文件大小(单位:字节)
     * @param maxSize         最大文件大小(单位:字节)
     * @param status          文件当前状态(0删除,1存在)
     * @param startCreateTime 文件创建开始时间
     * @param endCreateTime   文件创建结束时间
     * @param startUpdateTime 文件修改开始时间
     * @param endUpdateTime   文件修改结束时间
     * @return 文件信息
     */
    @GetMapping
    public ResponseEntity<List<FileTable>> queryByCondition(
            @RequestParam(required = false) String id,
            @RequestParam(required = false) String name,
            @RequestParam(required = false) String extension,
            @RequestParam(required = false) String type,
            @RequestParam(required = false) Integer status,
            @RequestParam(required = false) Integer minSize,
            @RequestParam(required = false) Integer maxSize,
            @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date startCreateTime,
            @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date endCreateTime,
            @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date startUpdateTime,
            @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date endUpdateTime
    ) {
        FileTableCondition fileTableCondition = new FileTableCondition(
                id, name, extension, type,
                status,
                minSize, maxSize,
                startCreateTime, endCreateTime,
                startUpdateTime, endUpdateTime
        );
        return ResponseEntity.ok(this.fileTableService.queryByCondition(fileTableCondition));
    }

    @GetMapping("/download/{id}")
    public ResponseEntity<FileSystemResource> download(@PathVariable("id") String id){
        return this.fileTableService.downloadById(id);
    }

}

com/example/user/service/FileTableService.java

package com.example.user.service;

import com.example.user.entity.FileTable;
import com.example.user.entity.FileTableCondition;
import org.springframework.core.io.FileSystemResource;
import org.springframework.http.ResponseEntity;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.List;

/**
 * (FileTable)表服务接口
 */
public interface FileTableService {

    /**
     * 单文件上传
     *
     * @param id            文件ID
     * @param multipartFile 文件
     * @return 文件信息
     */
    FileTable upload(String id, MultipartFile multipartFile) throws IOException;

    /**
     * 多文件上传
     *
     * @param id             文件ID
     * @param multipartFiles 文件
     * @return 文件信息
     */
    List<FileTable> upload(String id, MultipartFile[] multipartFiles) throws IOException;

    /**
     * 通过主键删除数据
     *
     * @param id 文件ID
     * @return 是否成功
     */
    boolean deleteById(String id);

    /**
     * 条件查询
     *
     * @param fileTableCondition 实例对象
     * @return 文件信息
     */
    List<FileTable> queryByCondition(FileTableCondition fileTableCondition);


    /**
     * 文件下载
     *
     * @param id 文件ID
     * @return 文件流
     */
    ResponseEntity<FileSystemResource> downloadById(String id);

}

com/example/user/service/impl/FileTableServiceImpl.java

package com.example.user.service.impl;

import com.example.user.dao.FileTableDao;
import com.example.user.entity.FileTable;
import com.example.user.entity.FileTableCondition;
import com.example.user.service.FileTableService;
import com.example.user.utils.FileUtil;
import org.springframework.core.io.FileSystemResource;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import java.io.IOException;
import java.util.*;
import java.util.stream.Collectors;

/**
 * (FileTable)表服务实现类
 */
@Service("filesService")
public class FileTableServiceImpl implements FileTableService {

    @Resource
    private FileTableDao fileTableDao;

    /**
     * 单文件上传
     *
     * @param id            文件ID
     * @param multipartFile 文件
     * @return 文件信息
     */
    @Override
    public FileTable upload(String id, MultipartFile multipartFile) throws IOException {
        if (null == id || id.isEmpty()) {
            FileTable fileTable = FileUtil.saveFile("", multipartFile);
            this.fileTableDao.insert(fileTable);
            return this.fileTableDao.queryById(fileTable.getId());
        } else {
            FileTable fileTable = FileUtil.saveFile(id, multipartFile);
            this.fileTableDao.update(fileTable);
            return this.fileTableDao.queryById(fileTable.getId());
        }
    }

    /**
     * 多文件上传
     *
     * @param id             文件ID
     * @param multipartFiles 文件
     * @return 文件信息
     */
    @Override
    public List<FileTable> upload(String id, MultipartFile[] multipartFiles) throws IOException {
        List<FileTable> fileList = new ArrayList<>();
        for (MultipartFile multipartFile : multipartFiles) {
            fileList.add(FileUtil.saveFile("", multipartFile));
        }
        this.fileTableDao.insertList(fileList);
        List<String> ids = fileList.stream().map(FileTable::getId).collect(Collectors.toList());
        return this.fileTableDao.queryByIds(ids);
    }

    /**
     * 通过文件ID删除数据
     *
     * @param id 文件ID
     * @return 是否成功
     */
    @Override
    public boolean deleteById(String id) {
        return this.fileTableDao.deleteById(id) > 0;
    }

    /**
     * 条件查询
     *
     * @param fileTableCondition 实例对象
     * @return 文件信息
     */
    @Override
    public List<FileTable> queryByCondition(FileTableCondition fileTableCondition) {
        return this.fileTableDao.queryByCondition(fileTableCondition);
    }

    /**
     * 文件下载
     *
     * @param id 文件ID
     * @return 文件流
     */
    @Override
    public ResponseEntity<FileSystemResource> downloadById(String id) {
        FileTable fileTable = this.fileTableDao.queryById(id);
        return FileUtil.downloadFile(fileTable);
    }
}

com/example/user/dao/FileTableDao.java

package com.example.user.dao;

import com.example.user.entity.FileTable;
import com.example.user.entity.FileTableCondition;

import java.util.List;

/**
 * (FileTable)表数据库访问层
 */
public interface FileTableDao {

    /**
     * 新增数据
     *
     * @param files 实例对象
     * @return 影响行数
     */
    int insert(FileTable files);

    /**
     * 新增数据
     *
     * @param filesList 实例对象
     * @return 影响行数
     */
    int insertList(List<FileTable> filesList);

    /**
     * 通过主键删除数据
     *
     * @param id 文件ID
     * @return 影响行数
     */
    int deleteById(String id);

    /**
     * 修改数据
     *
     * @param fileTable 实例对象
     * @return 影响行数
     */
    int update(FileTable fileTable);

    /**
     * 按ID查询数据
     *
     * @param id 文件ID
     * @return 对象列表
     */
    FileTable queryById(String id);

    /**
     * 按ID查询数据
     *
     * @param ids 文件ID
     * @return 对象列表
     */
    List<FileTable> queryByIds(List<String> ids);

    /**
     * 按条件查询数据
     *
     * @param fileTableCondition 查询条件
     * @return 对象列表
     */
    List<FileTable> queryByCondition(FileTableCondition fileTableCondition);

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/651873.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于SSM框架的Java的医院管理系统的设计与实现+文档

博主介绍&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 项目名称 基于SSM框架的Java的医院管理系统的设计与实现文档 视频演示 视频去哪了呢&#xff1f;_哔哩哔哩_bilibili 系统介绍 摘 要 随着互联网技术的快速进…

ARM-驱动

字符设备驱动的内部实现&#xff1a; 文件存在文件系统中&#xff0c;会有一个标识inode号&#xff0c;基于这个标识找到了struct_inode结构体&#xff08;保存当前文件信息&#xff09;&#xff0c;struct_inode结构体中有一个struct cdev *i_cdev类型的字符设备指针&#x…

糖基化修饰1240252-34-9,Fmoc-Thr((Ac4Galβ1-3)Ac3GlcNAcβ1-6AcGalNAcα)-OH,反应特点及性质研究

文章关键词&#xff1a;糖化学试剂&#xff0c;多肽合成&#xff0c;Fmoc-保护氨基酸&#xff0c;糖基化修饰 Fmoc-Thr((Ac4Galβ1-3)Ac3GlcNAcβ1-6AcGalNAcα)-OH &#xff08;文章编辑来源于&#xff1a;西安凯新生物科技有限公司小编WMJ&#xff09;​ 一、Product stru…

Golang每日一练(leetDay0098) 生命、Nim、猜数字游戏

目录 289. 生命游戏 Game Of Life 292. Nim 游戏 Nim Game 299. 猜数字游戏 Bulls and Cows &#x1f31f; 每日一练刷题专栏 &#x1f31f; Rust每日一练 专栏 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 289. 生命游戏 Game Of L…

牛客小白月赛56

今天无聊vp了一下 A.省略 B.最优肯定是全部都是1 C.直接统计每个余数下可以填多少个数&#xff0c;然后排序从小到大的排序输出即可 #include <iostream> #include <cstring> #include <algorithm> #include <vector> #include <queue> #inc…

Linux yum常用命令

Linux服务器安装成功后&#xff0c;我们会经常使用yum安装rpm包以满足使用的需要。使用yum源安装rpm包有两种方式&#xff1a; 方式一&#xff1a; 搭建本地yum源环境&#xff0c;进行rpm包的安装&#xff0c;具体搭建方式&#xff0c;参考(chapter-5)&#xff1a; Linux常规…

Android12之如何查看hidl服务(一百五十五)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

关闭网络钓鱼攻击 - 类型、方法、检测、预防清单

在当今互联互通的世界中&#xff0c;数字通信和交易占主导地位&#xff0c;网络钓鱼攻击已成为一种无处不在的威胁。 通过伪装成可信赖的实体&#xff0c;网络钓鱼攻击欺骗用户和组织泄露敏感信息&#xff0c;例如密码、财务数据和个人详细信息。 网络钓鱼攻击是网络罪犯使用…

【SpringCloud入门】-- 认识SpringCloudAlibabaNacos服务注册和配置中心

目录 1.Nacos是什么&#xff1f; 2.Nacos能干什么&#xff1f; 3. 各种服务注册中心比较 4.Nacos安装与运行 5.介绍一下Nacos图形化界面 6.NameSpace&#xff0c;Group&#xff0c;Data ID三者的关系&#xff1f;为什么这样设计&#xff1f; 7.Nacos集群和持久化配置 前…

MATLAB与自动化控制:控制系统设计、仿真和实现的应用和优化

章节一&#xff1a;介绍 自动化控制系统是现代工程中的关键组成部分&#xff0c;它在许多领域中发挥着重要作用&#xff0c;如机械工程、电气工程和航空航天工程等。在控制系统设计、仿真和实现过程中&#xff0c;MATLAB成为了一种强大的工具。本文将探讨MATLAB在自动化控制中…

用户模块封装数据模型层

数据模型层 数据模型层&#xff08;Data Model Layer&#xff09;是指在应用程序中用于表示和处理数据的模型层。这一层通常是应用程序的核心&#xff0c;因为它 负责从各种数据源获取数据并保证这些数据与应用程序的功能相匹配 。 在一个应用程序中&#xff0c;数据模型层通…

MidJourney使用教程:二 初识Prompts

最近AIGC这么火&#xff0c;除了chatGPT以外&#xff0c;这种图像类的产品也是非常有意思&#xff0c;其中就有MidJourney和Stable Diffusion这俩个比较出圈。这里我先选择MidJourney来体验并整理出一个教程。一方面MidJourney最简单&#xff0c;能当路Discord&#xff0c;注册…

正则替换的方式删除特定的内容

以前&#xff0c;公司网络限制&#xff0c;无法通过用户名密码登录某些网站&#xff0c;但是可以通过浏览器打开网站&#xff0c;而这些网站有个问题&#xff0c;非登录用户&#xff0c;不能复制博客中的代码&#xff0c;这个就有些麻烦了。 好在&#xff0c;这些代码是可以通过…

6.vue3医疗在线问诊项目 - _极速问诊-订单选择页面 ==> 问诊级别(普通/三甲)、科室选择(一级科室、二级科室)、病情描述、选择患者

6.vue3医疗在线问诊项目 - _极速问诊-订单选择页面 > 问诊级别&#xff08;普通/三甲&#xff09;、科室选择&#xff08;一级科室、二级科室&#xff09;、病情描述、选择患者 极速问诊-选择问诊级别-路由{#consult-change-type} 完成选择三甲还是普通问诊页面&#xff0c…

【Hadoop】大数据开发环境配置

【Hadoop】大数据开发环境配置 文章目录 【Hadoop】大数据开发环境配置1 设置静态ip2 设置主机名3 关闭防火墙4 ssh免密码登录5 JDK配置6 hadoop安装并配置6.1 集群节点之间时间同步6.2 SSH免密码登录完善6.3 hadoop配置 1 设置静态ip 进入ifcfg-ens33文件 vi /etc/sysconfig/n…

JAVA图形界面GUI

目录 一、窗口、窗格、按钮、标签 设置一个窗口JFrame 设置一个窗格JPanel和按钮JButton 设置一个标签JLabel 标准写法 二、监听器ActionListener 用内部类实现 用匿名内部类实现 用LAMADA表达式实现 三、文本域、复选框、下拉列表 JTextField单行文本域 JCheckBox复选…

智能算法终极大比拼,以CEC2017测试函数为例,十种智能算法直接打包带走,不含任何套路

包含人工蜂群(ABC)、灰狼(GWO)、差分进化(DE)、粒子群(PSO)、麻雀优化(SSA)、蜣螂优化(DBO)、白鲸优化(BWO)、遗传算法(GA)、粒子群算法(PSO)&#xff0c;基于反向动态学习的差分进化算法&#xff0c;共十种算法&#xff0c;直接一文全部搞定&#xff01; 其中基于反向动态学习…

Dalamud 插件开发白皮书 P1 - Getting started

文章目录 从哪里开始 How do I get started?Dalamud 插件例子Dalamud 底层探究XIVLauncher 启动器 在哪里寻找帮助 Where do I ask for help?如何热重载插件 How do I hot-reload my plugin?如何调试插件&#xff0c;甚至游戏&#xff1f;如何在编码过程中使用 How do I use…

国内几款强大的语言模型

写在前面 Hello大家好&#xff0c; 我是【麟-小白】&#xff0c;一位软件工程专业的学生&#xff0c;喜好计算机知识。希望大家能够一起学习进步呀&#xff01;本人是一名在读大学生&#xff0c;专业水平有限&#xff0c;如发现错误或不足之处&#xff0c;请多多指正&#xff0…

STC15WProteus仿真红绿灯直行左右转紧急模式STC15W4K32S4-0041

STC15WProteus仿真红绿灯直行左右转紧急模式STC15W4K32S4-0041 Proteus仿真小实验&#xff1a; STC15WProteus仿真红绿灯直行左右转紧急模式STC15W4K32S4-0041 功能&#xff1a; 硬件组成&#xff1a;STC15W4K32S4单片机 2位数码管5个LED灯&#xff08;红 黄 ←绿 ↑绿 →绿…