SpringBoot整合Hutool实现文件上传下载
前言
我相信我们在日常开发中,难免会遇到对各种媒体文件的操作,由于业务需求的不同对文件操作的代码实现也大不相同
数据库设计
DROP TABLE IF EXISTS `sys_file`;
CREATE TABLE `sys_file` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '文件id',
`name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '文件名',
`type` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '文件类型',
`size` bigint(20) NULL DEFAULT NULL COMMENT '文件大小(kb)',
`url` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '下载路径',
`path` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '文件地址',
`md5` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '文件md5',
`is_Delete` tinyint(1) NULL DEFAULT 0 COMMENT '是否删除 0:未删除 1:删除',
`enable` tinyint(1) NULL DEFAULT 1 COMMENT '是否禁用链接 1:可用 0:禁用用',
`upload_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '上传时间',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `uni_md5`(`md5`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 56 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '文件表' ROW_FORMAT = Compact;
yaml配置我们的上传路径
files:
ip: localhost
upload:
path: F:/项目/SpringBoot+vue/admin/files/
上传
maven配置
<!-- hutool-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.15</version>
</dependency>
<!-- MybatisPlus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.2</version>
</dependency>
文件接口
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SecureUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.tg.admin.common.Result;
import com.tg.admin.entity.Files;
import com.tg.admin.entity.User;
import com.tg.admin.service.FileService;
import com.tg.admin.utils.JwtUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.List;
/**
* @Program: admin
* @ClassName: FileController
* @Author: liutao
* @Description: 文件处理
* @Create: 2023-03-16 18:15
* @Version 1.0
**/
@Api(tags = "文件接口")
@RestController
@RequestMapping("/file")
public class FileController {
@Value("${files.upload.path}")
private String fileUploadPath;
@Value("${server.port}")
private String port;
@Value("${files.ip}")
private String ip;
@Autowired
private FileService fileService;
@ApiOperation("分页查询所有文件信息")
@GetMapping("/page")
public Result<Files> findPage(@RequestParam Integer pageNum,
@RequestParam Integer pageSize,
@RequestParam String name,
@RequestParam String type) {
IPage<Files> page = new Page<>(pageNum, pageSize);
QueryWrapper<Files> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("is_Delete", false);
if (!"".equals(name)) {
queryWrapper.like("name", name);
}
if (!"".equals(type)) {
queryWrapper.like("type", type);
}
return Result.success(fileService.page(page, queryWrapper));
}
/**
* @MethodName: upload
* @description: 文件上传
* @Author: LiuTao
* @Param: [file]
* @UpdateTime: 2023/3/16 18:39
* @Return: java.lang.String
* @Throw: IOException
**/
@PostMapping("/upload")
public Result<Files> upload(@RequestParam MultipartFile file,
HttpServletRequest request) throws IOException {
// 文件原始名
String originalFilename = file.getOriginalFilename();
// 文件类型
String type = FileUtil.extName(originalFilename);
// 文件大小
long size = file.getSize();
String today = DateUtil.today();
// 定义一个文件唯一的标识码
String fileUUID = IdUtil.fastSimpleUUID() + StrUtil.DOT + type;
// 判断目录是否存在。不存在就创建
if (!FileUtil.exist(fileUploadPath + today)) {
FileUtil.mkdir(fileUploadPath + today);
}
//上传的文件
File uploadFile = new File(fileUploadPath + StrUtil.C_SLASH + fileUUID);
System.out.println(fileUploadPath);
// 文件存入磁盘
file.transferTo(uploadFile);
// 获取文件md5
String md5 = SecureUtil.md5(uploadFile);
// 查询数据库有没有当前md5
Files one = getFileMd5(md5);
String url;
if (one != null) {
url = one.getUrl();
uploadFile.delete();
return Result.waring("文件重复", one.getUrl());
} else {
url = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + "/file/" + fileUUID;
}
// 存入数据库
Files saveFile = new Files();
saveFile.setName(originalFilename);
saveFile.setType(type);
saveFile.setSize(size / 1024);
saveFile.setPath(uploadFile.getCanonicalPath());
saveFile.setUrl(url);
saveFile.setMd5(md5);
fileService.save(saveFile);
return Result.success(url);
}
@ApiOperation("根据id删除文件")
@DeleteMapping("/{id}")
public Result<Files> delete(@PathVariable Integer id) {
Files files = fileService.getById(id);
files.setIsDelete(true);
fileService.updateById(files);
return Result.success();
}
@ApiOperation("根据id批量删除文件")
@PostMapping("del/batch")
public Result<Files> deleteBatch(@RequestBody List<Integer> ids) {
QueryWrapper<Files> queryWrapper = new QueryWrapper<Files>();
queryWrapper.in("id", ids);
List<Files> files = fileService.list(queryWrapper);
for (Files file : files) {
file.setIsDelete(true);
fileService.updateById(file);
}
return Result.success();
}
@ApiOperation(value = "更新或新增", httpMethod = "POST")
@PostMapping("/update")
public Result<Files> save(@RequestBody Files files) {
return Result.success(fileService.saveOrUpdate(files));
}
@ApiOperation("下载文件接口")
@GetMapping("/{fileUUID}")
public void download(@PathVariable String fileUUID,
HttpServletResponse response) throws IOException {
File uploadFile = new File(fileUploadPath + StrUtil.C_SLASH + fileUUID);
ServletOutputStream outputStream = response.getOutputStream();
response.addHeader("Content-Disposition", "attachment;filename =" + URLEncoder.encode(fileUUID, "UTF-8"));
response.setContentType("application/octet-stream");
byte[] bytes = FileUtil.readBytes(uploadFile);
outputStream.write(bytes);
outputStream.flush();
outputStream.close();
}
private Files getFileMd5(String md5) {
QueryWrapper<Files> wrapper = new QueryWrapper<>();
wrapper.eq("md5", md5);
List<Files> list = fileService.list(wrapper);
return list.size() == 0 ? null : list.get(0);
}
}
阅读剩余
版权声明:
作者:涛哥
链接:https://ltbk.net/back/spring_family/spring-boot/article/1423.html
文章版权归作者所有,未经允许请勿转载。
作者:涛哥
链接:https://ltbk.net/back/spring_family/spring-boot/article/1423.html
文章版权归作者所有,未经允许请勿转载。
THE END