文件分片上传工具类

该博客介绍了如何在Spring环境下使用Java实现文件分片上传的功能,包括文件分片实体类FileUploadDTO的定义、分片上传工具类的实现以及Controller层的调用方法和返回结果实体类的说明。
摘要由CSDN通过智能技术生成

参考博客: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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值