errorServerHandler(Exception e) {
131 | log.error("服务异常::", e);
132 | return ResultUtil.error(ErrorCode.SERVER_ERROR);
133 | }
134 | }
135 |
--------------------------------------------------------------------------------
/file-server/src/main/java/com/ykrenz/fileserver/mapper/FileInfoMapper.java:
--------------------------------------------------------------------------------
1 | package com.ykrenz.fileserver.mapper;
2 |
3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper;
4 | import com.ykrenz.fileserver.entity.FileInfo;
5 |
6 | /**
7 | *
8 | * 文件信息主表 Mapper 接口
9 | *
10 | *
11 | * @author Mr Ren
12 | * @since 2021-05-24
13 | */
14 | public interface FileInfoMapper extends BaseMapper {
15 |
16 | }
17 |
--------------------------------------------------------------------------------
/file-server/src/main/java/com/ykrenz/fileserver/mapper/FilePartInfoMapper.java:
--------------------------------------------------------------------------------
1 | package com.ykrenz.fileserver.mapper;
2 |
3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper;
4 | import com.ykrenz.fileserver.entity.FilePartInfo;
5 | import org.apache.ibatis.annotations.Select;
6 |
7 | import java.util.List;
8 |
9 | /**
10 | *
11 | * 文件信息主表 Mapper 接口
12 | *
13 | *
14 | * @author Mr Ren
15 | * @since 2021-05-24
16 | */
17 | public interface FilePartInfoMapper extends BaseMapper {
18 |
19 | @Select({
20 | "select * from file_part_info where now() > DATE_ADD(create_time,INTERVAL #{expireDays} day) " +
21 | "and partNumber = 0 and status = 1 limit 500"
22 | })
23 | List selectExpireUploads(int expireDays);
24 | }
25 |
--------------------------------------------------------------------------------
/file-server/src/main/java/com/ykrenz/fileserver/mapper/LockMapper.java:
--------------------------------------------------------------------------------
1 | package com.ykrenz.fileserver.mapper;
2 |
3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper;
4 | import com.ykrenz.fileserver.entity.FileLock;
5 | import org.apache.ibatis.annotations.Insert;
6 |
7 | /**
8 | *
9 | * 文件信息主表 Mapper 接口
10 | *
11 | *
12 | * @author Mr Ren
13 | * @since 2021-05-24
14 | */
15 | public interface LockMapper extends BaseMapper {
16 |
17 | @Insert(
18 | "insert ignore into file_lock(lock_key,create_time,expire_time) values (#{lockKey},#{createTime},#{expireTime})"
19 | )
20 | int insertIgnore(FileLock fileLock);
21 | }
22 |
--------------------------------------------------------------------------------
/file-server/src/main/java/com/ykrenz/fileserver/model/ErrorCode.java:
--------------------------------------------------------------------------------
1 | package com.ykrenz.fileserver.model;
2 |
3 | import lombok.Getter;
4 |
5 | /**
6 | * @Description: 异常枚举类
7 | * @date 2020/5/22 14:40
8 | */
9 | @Getter
10 | public enum ErrorCode {
11 | /**
12 | * 服务异常
13 | */
14 | SERVER_ERROR("服务器异常,请联系管理员"),
15 | /**
16 | * 参数异常
17 | */
18 | PARAM_ERROR("参数异常"),
19 | /**
20 | * 不支持当前请求方法
21 | */
22 | HTTP_METHOD_ERROR("不支持当前请求方法"),
23 | /**
24 | * 不支持当前媒体类型
25 | */
26 | HTTP_MEDIA_ERROR("不支持当前媒体类型"),
27 | /**
28 | * 文件过大
29 | */
30 | FILE_TO_LARGE("文件过大,请使用分片上传"),
31 | /**
32 | * 上传失败
33 | */
34 | UPLOAD_ERROR("上传失败,请重试"),
35 | /**
36 | * uploadId不存在
37 | */
38 | UPLOAD_ID_NOT_FOUND("uploadId不存在或已经过期"),
39 | /**
40 | * 文件CRC32校验失败
41 | */
42 | FILE_CRC32_ERROR("文件CRC32校验失败,请重新上传"),
43 | /**
44 | * 文件不存在
45 | */
46 | FILE_NOT_FOUND("文件不存在"),
47 | ;
48 | /**
49 | * 返回消息
50 | */
51 | private final String message;
52 |
53 | ErrorCode(String message) {
54 | this.message = message;
55 | }
56 |
57 | public String getMessage() {
58 | return message;
59 | }
60 | }
61 |
--------------------------------------------------------------------------------
/file-server/src/main/java/com/ykrenz/fileserver/model/ResultUtil.java:
--------------------------------------------------------------------------------
1 | package com.ykrenz.fileserver.model;
2 |
3 | import io.swagger.annotations.ApiModel;
4 | import io.swagger.annotations.ApiModelProperty;
5 | import lombok.Getter;
6 | import lombok.Setter;
7 |
8 | import java.io.Serializable;
9 |
10 | /**
11 | * 返回值封装处理
12 | *
13 | * @param
14 | */
15 | @Setter
16 | @Getter
17 | @ApiModel(value = "Result", description = "响应结果")
18 | public class ResultUtil implements Serializable {
19 |
20 | private static final long serialVersionUID = 1L;
21 |
22 | @ApiModelProperty("成功")
23 | private boolean success;
24 | @ApiModelProperty("数据")
25 | private T data;
26 | @ApiModelProperty("错误信息")
27 | private String error;
28 | @ApiModelProperty("重置分片上传")
29 | private boolean reset;
30 |
31 |
32 | private ResultUtil(T data) {
33 | this.data = data;
34 | this.success = true;
35 | }
36 |
37 | private ResultUtil(String error, boolean reset) {
38 | this.error = error;
39 | this.success = false;
40 | this.reset = reset;
41 | }
42 |
43 | /**
44 | * success
45 | *
46 | * @param
47 | * @return
48 | */
49 | public static ResultUtil success(T data) {
50 | return new ResultUtil<>(data);
51 | }
52 |
53 | /**
54 | * success
55 | *
56 | * @param
57 | * @return
58 | */
59 | public static ResultUtil success() {
60 | return new ResultUtil<>(null);
61 | }
62 |
63 | /**
64 | * 失败
65 | *
66 | * @param
67 | * @return
68 | */
69 | public static ResultUtil error(ErrorCode error) {
70 | return new ResultUtil<>(error.getMessage(), false);
71 | }
72 |
73 | public static ResultUtil error(String error) {
74 | return new ResultUtil<>(error, false);
75 | }
76 |
77 | public static ResultUtil error(String error, boolean reset) {
78 | return new ResultUtil<>(error, reset);
79 | }
80 | }
--------------------------------------------------------------------------------
/file-server/src/main/java/com/ykrenz/fileserver/model/request/CancelPartRequest.java:
--------------------------------------------------------------------------------
1 | package com.ykrenz.fileserver.model.request;
2 |
3 | import io.swagger.annotations.ApiModel;
4 | import io.swagger.annotations.ApiModelProperty;
5 | import lombok.Data;
6 |
7 | import javax.validation.constraints.NotBlank;
8 |
9 | /**
10 | * @Description 取消分片上传参数
11 | * @Author ren
12 | * @Since 1.0
13 | */
14 | @Data
15 | @ApiModel(value = "CancelPartRequest", description = "取消分片上传")
16 | public class CancelPartRequest {
17 |
18 | /**
19 | * 上传唯一标识
20 | */
21 | @ApiModelProperty(name = "uploadId", value = "上传唯一标识")
22 | @NotBlank(message = "不能为空")
23 | private String uploadId;
24 | }
25 |
--------------------------------------------------------------------------------
/file-server/src/main/java/com/ykrenz/fileserver/model/request/CompletePartRequest.java:
--------------------------------------------------------------------------------
1 | package com.ykrenz.fileserver.model.request;
2 |
3 | import io.swagger.annotations.ApiModel;
4 | import io.swagger.annotations.ApiModelProperty;
5 | import lombok.Data;
6 |
7 | import javax.validation.constraints.NotBlank;
8 |
9 | /**
10 | * @Description 合并分片参数
11 | * @Author ren
12 | * @Since 1.0
13 | */
14 | @Data
15 | @ApiModel(value = "CompletePartRequest", description = "完成分片上传")
16 | public class CompletePartRequest {
17 |
18 | /**
19 | * 上传唯一标识
20 | */
21 | @ApiModelProperty(name = "uploadId", value = "上传唯一标识")
22 | @NotBlank(message = "不能为空")
23 | private String uploadId;
24 | /**
25 | * 文件md5
26 | */
27 | @ApiModelProperty(name = "fileMd5", value = "文件md5值 fastdfs只保存不做验证")
28 | private String fileMd5;
29 | /**
30 | * fastdfs可使用 保证数据完整性
31 | */
32 | @ApiModelProperty(name = "fileCrc32", value = "文件crc32值 fastdfs保证数据完整性")
33 | private Long fileCrc32;
34 |
35 | @ApiModelProperty(name = "info", value = "是否返回文件信息")
36 | private boolean info;
37 | }
38 |
--------------------------------------------------------------------------------
/file-server/src/main/java/com/ykrenz/fileserver/model/request/FileInfoRequest.java:
--------------------------------------------------------------------------------
1 | package com.ykrenz.fileserver.model.request;
2 |
3 | import io.swagger.annotations.ApiModel;
4 | import io.swagger.annotations.ApiModelProperty;
5 | import lombok.AllArgsConstructor;
6 | import lombok.Data;
7 | import lombok.NoArgsConstructor;
8 |
9 | import javax.validation.constraints.NotBlank;
10 |
11 | @Data
12 | @ApiModel(value = "FileInfoRequest", description = "文件信息")
13 | @AllArgsConstructor
14 | @NoArgsConstructor
15 | public class FileInfoRequest {
16 |
17 | @ApiModelProperty(name = "bucketName", value = "文件bucketName")
18 | @NotBlank(message = "存储桶不能为空")
19 | private String bucketName;
20 |
21 | @ApiModelProperty(name = "objectName", value = "文件objectName")
22 | @NotBlank(message = "文件路径不能为空")
23 | private String objectName;
24 | }
25 |
--------------------------------------------------------------------------------
/file-server/src/main/java/com/ykrenz/fileserver/model/request/InitUploadMultipartRequest.java:
--------------------------------------------------------------------------------
1 | package com.ykrenz.fileserver.model.request;
2 |
3 | import io.swagger.annotations.ApiModel;
4 | import io.swagger.annotations.ApiModelProperty;
5 | import lombok.Data;
6 |
7 | import javax.validation.constraints.NotBlank;
8 | import javax.validation.constraints.NotNull;
9 |
10 | /**
11 | * @Description 初始化分片上传参数
12 | * @Author ren
13 | * @Since 1.0
14 | */
15 | @Data
16 | @ApiModel(value = "InitUploadMultipartRequest", description = "初始化分片上传")
17 | public class InitUploadMultipartRequest {
18 |
19 | @ApiModelProperty(name = "md5", value = "文件md5", notes = "客户端秒传")
20 | private String fileMd5;
21 |
22 | @ApiModelProperty(name = "crc32", value = "文件crc32 fastdfs可结合md5秒传")
23 | private Long fileCrc32;
24 |
25 | @ApiModelProperty(name = "uploadId", value = "上传唯一标识 服务端返回的uploadId 可用于查询已经上传过的分片 断点续传")
26 | private String uploadId;
27 |
28 | @ApiModelProperty(name = "fileName", value = "文件名")
29 | @NotBlank(message = "不能为空")
30 | private String fileName;
31 |
32 | @ApiModelProperty(name = "fileSize", value = "文件大小")
33 | @NotNull(message = "文件大小不能为空")
34 | private Long fileSize;
35 |
36 | @ApiModelProperty(name = "partSize", value = "分片大小")
37 | @NotNull(message = "分片大小不能为空")
38 | private Long partSize;
39 | }
40 |
--------------------------------------------------------------------------------
/file-server/src/main/java/com/ykrenz/fileserver/model/request/SimpleUploadRequest.java:
--------------------------------------------------------------------------------
1 | package com.ykrenz.fileserver.model.request;
2 |
3 | import io.swagger.annotations.ApiModel;
4 | import io.swagger.annotations.ApiModelProperty;
5 | import lombok.Data;
6 | import org.springframework.web.multipart.MultipartFile;
7 |
8 | import javax.validation.constraints.NotNull;
9 |
10 | /**
11 | * @Description 简单上传参数
12 | * @Author ren
13 | * @Since 1.0
14 | */
15 | @Data
16 | @ApiModel(value = "SimpleUploadRequest", description = "上传简单文件")
17 | public class SimpleUploadRequest {
18 |
19 | /**
20 | * 文件
21 | */
22 | @ApiModelProperty(name = "file", value = "文件")
23 | @NotNull(message = "文件不能为空")
24 | private MultipartFile file;
25 |
26 | /**
27 | * md5验证
28 | */
29 | @ApiModelProperty(name = "md5", value = "文件md5值 fastdfs只保存不做验证")
30 | private String md5;
31 |
32 | /**
33 | * fastdfs crc32验证
34 | */
35 | @ApiModelProperty(name = "crc32", value = "文件crc32值 fastdfs保证数据完整性")
36 | private Long crc32;
37 |
38 | /**
39 | * 是否返回文件信息
40 | */
41 | @ApiModelProperty(name = "info", value = "是否返回文件信息")
42 | private boolean info;
43 | }
44 |
--------------------------------------------------------------------------------
/file-server/src/main/java/com/ykrenz/fileserver/model/request/UploadMultipartRequest.java:
--------------------------------------------------------------------------------
1 | package com.ykrenz.fileserver.model.request;
2 |
3 | import io.swagger.annotations.ApiModel;
4 | import io.swagger.annotations.ApiModelProperty;
5 | import lombok.Data;
6 | import org.springframework.web.multipart.MultipartFile;
7 |
8 | import javax.validation.constraints.NotBlank;
9 | import javax.validation.constraints.NotNull;
10 |
11 | /**
12 | * @Description 分片上传参数
13 | * @Author ren
14 | * @Since 1.0
15 | */
16 | @Data
17 | @ApiModel(value = "UploadMultipartRequest", description = "分片上传")
18 | public class UploadMultipartRequest {
19 |
20 | @ApiModelProperty(name = "uploadId", value = "分片上传标识")
21 | @NotBlank(message = "分片上传标识不能为空")
22 | private String uploadId;
23 |
24 | @ApiModelProperty(name = "partNumber", value = "分片索引 从0开始")
25 | @NotNull(message = "分片索引不能为空")
26 | private Integer partNumber;
27 |
28 | @ApiModelProperty(name = "file", value = "分片文件")
29 | @NotNull(message = "文件不能为空")
30 | private MultipartFile file;
31 | }
32 |
--------------------------------------------------------------------------------
/file-server/src/main/java/com/ykrenz/fileserver/model/result/FileInfoResult.java:
--------------------------------------------------------------------------------
1 | package com.ykrenz.fileserver.model.result;
2 |
3 | import io.swagger.annotations.ApiModel;
4 | import io.swagger.annotations.ApiModelProperty;
5 | import lombok.Data;
6 |
7 | import java.io.Serializable;
8 |
9 | @Data
10 | @ApiModel(value = "FileInfoResult", description = "文件信息")
11 | public class FileInfoResult implements Serializable {
12 | private static final long serialVersionUID = 1L;
13 |
14 | @ApiModelProperty(value = "主键")
15 | private String id;
16 |
17 | @ApiModelProperty(value = "文件md5值")
18 | private String md5;
19 |
20 | @ApiModelProperty(value = "文件crc32值")
21 | private Long crc32;
22 |
23 | @ApiModelProperty(value = "文件名称")
24 | private String fileName;
25 |
26 | @ApiModelProperty(value = "文件大小")
27 | private Long fileSize;
28 |
29 | @ApiModelProperty(value = "存储桶 fastdfs对应group")
30 | private String bucketName;
31 |
32 | @ApiModelProperty(value = "文件路径 fastdfs对应path")
33 | private String objectName;
34 |
35 | @ApiModelProperty(value = "文件预览路径", notes = "文件预览路径")
36 | private String webPath;
37 |
38 | @ApiModelProperty(value = "文件下载路径", notes = "文件下载路径")
39 | private String downloadPath;
40 | }
41 |
--------------------------------------------------------------------------------
/file-server/src/main/java/com/ykrenz/fileserver/model/result/InitMultipartResult.java:
--------------------------------------------------------------------------------
1 | package com.ykrenz.fileserver.model.result;
2 |
3 | import io.swagger.annotations.ApiModel;
4 | import io.swagger.annotations.ApiModelProperty;
5 | import lombok.Data;
6 |
7 | import java.io.Serializable;
8 | import java.util.ArrayList;
9 | import java.util.List;
10 |
11 | /**
12 | * @Description 分片上传检测返回
13 | * @Author ren
14 | * @Since 1.0
15 | */
16 | @ApiModel(value = "InitMultipartResult", description = "初始化分片上传结果")
17 | @Data
18 | public class InitMultipartResult implements Serializable {
19 | private static final long serialVersionUID = 1L;
20 |
21 | @ApiModelProperty("上传文件唯一标识")
22 | private String uploadId;
23 |
24 | @ApiModelProperty("是否存在 true:存在(秒传) false:不存在")
25 | private boolean exist;
26 |
27 | @ApiModelProperty("已经上传的分片数据 断点续传客户端可以跳过这些分片")
28 | private List parts = new ArrayList<>(0);
29 |
30 | public InitMultipartResult() {
31 | }
32 |
33 | public InitMultipartResult(String uploadId, boolean exist) {
34 | this.uploadId = uploadId;
35 | this.exist = exist;
36 | }
37 |
38 | public InitMultipartResult(String uploadId, List parts) {
39 | this.uploadId = uploadId;
40 | this.parts = parts;
41 | }
42 | }
43 |
--------------------------------------------------------------------------------
/file-server/src/main/java/com/ykrenz/fileserver/objectname/Md5Generator.java:
--------------------------------------------------------------------------------
1 | package com.ykrenz.fileserver.objectname;
2 |
3 | import lombok.Data;
4 |
5 | /**
6 | * @Description 根据md5文件名称生成
7 | * @Author ren
8 | * @Since 1.0
9 | */
10 | @Data
11 | public class Md5Generator implements ObjectNameGenerator {
12 |
13 | private String md5;
14 |
15 | private String ext;
16 |
17 | public Md5Generator(String md5, String ext) {
18 | this.md5 = md5;
19 | this.ext = ext;
20 | }
21 |
22 | @Override
23 | public String generator() {
24 | //https://help.aliyun.com/document_detail/64945.html?spm=a2c4g.11186623.6.1779.75e151b6GRk0Ab
25 | return md5.substring(0, 4) + "/" + md5 + "." + ext;
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/file-server/src/main/java/com/ykrenz/fileserver/objectname/ObjectNameGenerator.java:
--------------------------------------------------------------------------------
1 | package com.ykrenz.fileserver.objectname;
2 |
3 | import java.io.Serializable;
4 |
5 | /**
6 | * @Description 文件名称生成
7 | * @Author ren
8 | * @Since 1.0
9 | */
10 | public interface ObjectNameGenerator extends Serializable {
11 | /**
12 | * 创建文件名称
13 | *
14 | * @return
15 | */
16 | String generator();
17 | }
18 |
--------------------------------------------------------------------------------
/file-server/src/main/java/com/ykrenz/fileserver/objectname/TimestampGenerator.java:
--------------------------------------------------------------------------------
1 | package com.ykrenz.fileserver.objectname;
2 |
3 | import lombok.Data;
4 | import org.apache.commons.lang3.StringUtils;
5 |
6 | /**
7 | * @Description 根据时间戳文件名称生成
8 | * @Author ren
9 | * @Since 1.0
10 | */
11 | @Data
12 | public class TimestampGenerator implements ObjectNameGenerator {
13 |
14 | private String ext;
15 |
16 | public TimestampGenerator(String ext) {
17 | this.ext = ext;
18 | }
19 |
20 | @Override
21 | public String generator() {
22 | long millis = System.currentTimeMillis();
23 | return StringUtils.reverse(String.valueOf(millis)) + "." + ext;
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/file-server/src/main/java/com/ykrenz/fileserver/objectname/UuidGenerator.java:
--------------------------------------------------------------------------------
1 | package com.ykrenz.fileserver.objectname;
2 |
3 | import lombok.Data;
4 |
5 | import java.util.UUID;
6 |
7 | /**
8 | * @Description 根据uuid文件名称生成
9 | * @Author ren
10 | * @Since 1.0
11 | */
12 | @Data
13 | public class UuidGenerator implements ObjectNameGenerator {
14 |
15 | private String ext;
16 |
17 | public UuidGenerator(String ext) {
18 | this.ext = ext;
19 | }
20 |
21 | @Override
22 | public String generator() {
23 | String uuid = UUID.randomUUID().toString().replace("-", "");
24 | return uuid.substring(0, 4) + "/" + uuid + "." + ext;
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/file-server/src/main/java/com/ykrenz/fileserver/service/FileService.java:
--------------------------------------------------------------------------------
1 | package com.ykrenz.fileserver.service;
2 |
3 | import com.ykrenz.fileserver.model.request.CancelPartRequest;
4 | import com.ykrenz.fileserver.model.request.CompletePartRequest;
5 | import com.ykrenz.fileserver.model.request.FileInfoRequest;
6 | import com.ykrenz.fileserver.model.request.InitUploadMultipartRequest;
7 | import com.ykrenz.fileserver.model.request.SimpleUploadRequest;
8 | import com.ykrenz.fileserver.model.request.UploadMultipartRequest;
9 | import com.ykrenz.fileserver.model.result.FileInfoResult;
10 | import com.ykrenz.fileserver.model.result.InitMultipartResult;
11 |
12 | import java.io.Serializable;
13 |
14 | /**
15 | * @Description 文件接口
16 | * @Author ren
17 | * @Since 1.0
18 | */
19 | public interface FileService extends Serializable {
20 |
21 | /**
22 | * 上传简单文件
23 | *
24 | * @param request
25 | * @return
26 | */
27 | FileInfoResult upload(SimpleUploadRequest request);
28 |
29 | /**
30 | * 初始化分片上传任务
31 | *
32 | * @param request
33 | * @return
34 | */
35 | InitMultipartResult initMultipart(InitUploadMultipartRequest request);
36 |
37 | /**
38 | * 上传文件分片
39 | *
40 | * @param uploadMultipartRequest
41 | * @return
42 | */
43 | void uploadMultipart(UploadMultipartRequest uploadMultipartRequest);
44 |
45 | /**
46 | * 合并文件分片
47 | *
48 | * @param request
49 | * @return
50 | */
51 | FileInfoResult completeMultipart(CompletePartRequest request);
52 |
53 | /**
54 | * 取消分片上传
55 | *
56 | * @param request
57 | * @return
58 | */
59 | void cancelMultipart(CancelPartRequest request);
60 |
61 | /**
62 | * 查询文件信息
63 | *
64 | * @param id
65 | * @return
66 | */
67 | FileInfoResult info(FileInfoRequest id);
68 |
69 | /**
70 | * 清空所有文件 测试使用
71 | */
72 | void deleteAllFiles();
73 |
74 | }
75 |
--------------------------------------------------------------------------------
/file-server/src/main/java/com/ykrenz/fileserver/service/FileServiceImpl.java:
--------------------------------------------------------------------------------
1 | package com.ykrenz.fileserver.service;
2 |
3 | import com.ykrenz.fileserver.config.StorageProperties;
4 | import com.ykrenz.fileserver.entity.FileInfo;
5 | import com.ykrenz.fileserver.ex.ApiException;
6 | import com.ykrenz.fileserver.model.ErrorCode;
7 | import com.ykrenz.fileserver.model.request.CancelPartRequest;
8 | import com.ykrenz.fileserver.model.request.CompletePartRequest;
9 | import com.ykrenz.fileserver.model.request.FileInfoRequest;
10 | import com.ykrenz.fileserver.model.request.InitUploadMultipartRequest;
11 | import com.ykrenz.fileserver.model.request.SimpleUploadRequest;
12 | import com.ykrenz.fileserver.model.request.UploadMultipartRequest;
13 | import com.ykrenz.fileserver.model.result.FileInfoResult;
14 | import com.ykrenz.fileserver.model.result.InitMultipartResult;
15 | import com.ykrenz.fileserver.service.client.FileServerClient;
16 | import org.springframework.stereotype.Service;
17 |
18 | import java.io.IOException;
19 |
20 | /**
21 | * @author ykren
22 | * @date 2022/3/4
23 | */
24 | @Service
25 | public class FileServiceImpl implements FileService {
26 |
27 | private StorageProperties storageProperties;
28 |
29 | private FileServerClient fileServerClient;
30 |
31 | private final long maxUploadSize;
32 | private final long multipartMinSize;
33 | private final long multipartMaxSize;
34 |
35 | public FileServiceImpl(StorageProperties storageProperties, FileServerClient fileServerClient) {
36 | this.storageProperties = storageProperties;
37 | this.fileServerClient = fileServerClient;
38 | this.maxUploadSize = storageProperties.getMaxUploadSize().toBytes();
39 | this.multipartMinSize = storageProperties.getMultipartMinSize().toBytes();
40 | this.multipartMaxSize = storageProperties.getMultipartMaxSize().toBytes();
41 | }
42 |
43 | @Override
44 | public FileInfoResult upload(SimpleUploadRequest request) {
45 | try {
46 | // 限制文件大小
47 | if (request.getFile().getSize() > maxUploadSize) {
48 | String msg = String.format("文件限制%dM,请使用分片上传", maxUploadSize / 1024 / 1024);
49 | throw new ApiException(msg);
50 | }
51 | FileInfo fileInfo = fileServerClient.upload(request);
52 | if (request.isInfo()) {
53 | return info(new FileInfoRequest(fileInfo.getBucketName(), fileInfo.getObjectName()));
54 | }
55 | return new FileInfoResult();
56 | } catch (IOException e) {
57 | throw new ApiException(ErrorCode.UPLOAD_ERROR);
58 | }
59 | }
60 |
61 | @Override
62 | public InitMultipartResult initMultipart(InitUploadMultipartRequest request) {
63 | Long partSize = request.getPartSize();
64 | if (partSize < multipartMinSize || partSize > multipartMaxSize) {
65 | String msg = String.format("分片大小必须在%dM~%dM之间", multipartMinSize / 1024 / 1024, multipartMaxSize / 1024 / 1024);
66 | throw new ApiException(msg);
67 | }
68 | return fileServerClient.initMultipart(request);
69 | }
70 |
71 | @Override
72 | public void uploadMultipart(UploadMultipartRequest request) {
73 | try {
74 | // 前端index=0
75 | request.setPartNumber(request.getPartNumber() + 1);
76 | fileServerClient.uploadMultipart(request);
77 | } catch (IOException e) {
78 | throw new ApiException(ErrorCode.UPLOAD_ERROR);
79 | }
80 | }
81 |
82 | @Override
83 | public FileInfoResult completeMultipart(CompletePartRequest request) {
84 | FileInfo fileInfo = fileServerClient.completeMultipart(request);
85 | if (request.isInfo()) {
86 | return info(new FileInfoRequest(fileInfo.getBucketName(), fileInfo.getObjectName()));
87 | }
88 | return new FileInfoResult();
89 | }
90 |
91 | @Override
92 | public void cancelMultipart(CancelPartRequest request) {
93 | fileServerClient.cancelMultipart(request);
94 | }
95 |
96 | @Override
97 | public FileInfoResult info(FileInfoRequest request) {
98 | return fileServerClient.info(request);
99 | }
100 |
101 | @Override
102 | public void deleteAllFiles() {
103 | fileServerClient.deleteAllFiles();
104 | }
105 |
106 | }
107 |
--------------------------------------------------------------------------------
/file-server/src/main/java/com/ykrenz/fileserver/service/RedisService.java:
--------------------------------------------------------------------------------
1 | package com.ykrenz.fileserver.service;
2 |
3 | import lombok.extern.slf4j.Slf4j;
4 | import org.springframework.beans.factory.annotation.Autowired;
5 | import org.springframework.data.redis.core.RedisTemplate;
6 | import org.springframework.stereotype.Repository;
7 |
8 | import java.util.List;
9 | import java.util.Map;
10 | import java.util.Set;
11 | import java.util.concurrent.TimeUnit;
12 |
13 | @Slf4j
14 | @Repository
15 | public class RedisService {
16 |
17 | @Autowired
18 | private RedisTemplate