参考博客:https://blog.csdn.net/andybegin/article/details/109215996
文件分片实体类FileUploadDTO
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import org.springframework.web.multipart.MultipartFile;
@Data
@Accessors(chain = true)
public class FileUploadDTO {
private Integer owerId;
private Integer tenantId;
//文件名
@ApiModelProperty("文件名")
private String name;
//md5码
@ApiModelProperty("md5码")
private String md5;
//文件总大小
@ApiModelProperty("文件总大小")
private Long size;
//文件一共被分了多少个片
@ApiModelProperty("文件一共被分了多少个片")
private Integer chunks;
//文件当前是第几个分片(第一个分片从0开始)
@ApiModelProperty("文件当前是第几个分片(第一个分片从0开始)")
private Integer chunk;
//文件的数据
@ApiModelProperty("文件数据")
private MultipartFile file;
}
import com.fasterxml.jackson.annotation.JsonInclude;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import java.util.Date;
文件分片实体类FileUploadVO
@Data
@Accessors(chain = true)
@JsonInclude(JsonInclude.Include.NON_NULL)
public class FileUploadVO {
@ApiModelProperty("站点id")
private Integer id;
@ApiModelProperty("文件类型 1图片 2 视频 3音频 4其他")
private Integer type;
@ApiModelProperty("文件名")
private String filename;
@ApiModelProperty("文件url")
private String url;
@ApiModelProperty("缩略图")
private String thumbnail;
@ApiModelProperty("文件大小")
private Long size;
@ApiModelProperty("文件path")
private String path;
}
文件分片上传工具类
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.multipart.MultipartFile;
import java.io.*;
import java.nio.channels.FileChannel;
import java.util.*;
public class FileUploadUtils {
private static final Logger logger = LoggerFactory.getLogger(FileUploadUtils.class);
private static String uploadFolder = "E:\\";
private static String realPath = "https://baidu.com/";
/**
* key = md5
* value = ChunkInfo
* <p>
* 通过md5记录文件分片数据
*/
private static Map<String, ChunkInfo> fileMap = new HashMap<>();
/**
* 生成一个与文件md5关联的数据信息
* <p>
* 根据md5生成一个唯一的文件名和每个chunk的初始上传状态false
*
* @param uploadDTO
* @return
*/
public static String getFilename(FileUploadDTO uploadDTO) {
String md5 = uploadDTO.getMd5();
if (!checkFile(md5)) {
synchronized (FileUploadUtils.class) {
if (!checkFile(md5)) {
fileMap.put(md5, new ChunkInfo(uploadDTO.getName(), uploadDTO.getChunks()));
}
}
}
return fileMap.get(md5).uniqueName;
}
/**
* 判断文件是否有分块
*
* @param md5
* @return
*/
public static Boolean checkFile(String md5) {
return fileMap.containsKey(md5);
}
/**
* 为文件的某个chunk添加上传完毕的分块记录
*
* @param md5 md5值
* @param chunk 分块号
*/
public static void addFileChunk(String md5, int chunk) {
fileMap.get(md5).chunkStatus[chunk] = true;
}
/**
* 删除文件信息
*
* @param md5
*/
public static void remove