package cn.huge.module.file.utils;
|
|
import cn.huge.base.common.constant.FileCatEnum;
|
import cn.huge.base.common.exception.ServiceException;
|
import cn.huge.base.common.utils.DateUtils;
|
import cn.huge.module.constant.BaseConsts;
|
import cn.huge.module.file.config.FtpFileConfig;
|
import cn.huge.module.file.domain.po.FileInfo;
|
import org.apache.commons.codec.digest.DigestUtils;
|
import org.apache.commons.lang3.StringUtils;
|
import org.springframework.web.multipart.MultipartFile;
|
|
import java.io.IOException;
|
import java.math.BigDecimal;
|
import java.math.RoundingMode;
|
import java.util.Calendar;
|
import java.util.Date;
|
|
/**
|
* @title: 上传附件包装处理类
|
* @description: 上传附件包装处理类
|
* @company: hugeinfo
|
* @author: liyj
|
* @time: 2021-11-05 16:51:48
|
* @version: 1.0.0
|
*/
|
public class FtpMultipartFileWrapper {
|
|
static final long kilobyte = 1024;
|
static final long megabyte = 1024 * 1024L;
|
static final long gigabyte = 1024 * 1024 * 1024L;
|
|
static final BigDecimal kilobyteDividend = new BigDecimal(kilobyte);
|
static final BigDecimal megabyteDividend = new BigDecimal(megabyte);
|
static final BigDecimal gigabyteDividend = new BigDecimal(gigabyte);
|
|
static final String SHOW_URL_WEB = "/api/web/fileInfo/show";
|
static final String DOWN_URL_WEB = "/api/web/fileInfo/down";
|
static final String SHOW_URL_WECHAT = "/api/wechat/fileInfo/show";
|
static final String DOWN_URL_WECHAT = "/api/wechat/fileInfo/down";
|
|
static final String STORE_WAY = "ftp";
|
|
private MultipartFile file;
|
|
public FtpMultipartFileWrapper(MultipartFile file) {
|
this.file = file;
|
}
|
|
/**
|
* web端上传附件
|
* @param fileId
|
* @return
|
*/
|
public FileInfo toWebFileInfo(String fileId) {
|
FileInfo fileInfo = new FileInfo();
|
fileInfo.setId(fileId);
|
fileInfo.setSuffix(this.getFileSuffix());
|
fileInfo.setTrueName(this.getFileName() + BaseConsts.DOT + fileInfo.getSuffix());
|
fileInfo.setFileName(this.getFileName() + BaseConsts.UNDER + fileInfo.getId() + BaseConsts.DOT + fileInfo.getSuffix());
|
fileInfo.setCat(FileCatEnum.getFileCat(fileInfo.getSuffix()));
|
fileInfo.setSize(this.getFileSize());
|
fileInfo.setUnit(this.getFileUnit());
|
fileInfo.setMd5Code(this.getFileVerifyCode());
|
fileInfo.setStoreWay(STORE_WAY);
|
fileInfo.setPath(this.getFileDir());
|
fileInfo.setFullPath(fileInfo.getPath() + BaseConsts.SLANT + fileInfo.getFileName());
|
fileInfo.setShowUrl(SHOW_URL_WEB + BaseConsts.SLANT + fileInfo.getId());
|
fileInfo.setDownUrl(DOWN_URL_WEB + BaseConsts.SLANT + fileInfo.getId());
|
// todo
|
fileInfo.setZipUrl(fileInfo.getShowUrl());
|
Date nowDate = DateUtils.getNowDate();
|
fileInfo.setCreateTime(nowDate);
|
fileInfo.setUpdateTime(nowDate);
|
fileInfo.setDeleteStatus(BaseConsts.DELETE_STATUS_0);
|
return fileInfo;
|
}
|
|
/**
|
* wechat上传附件
|
* @param fileId
|
* @return
|
*/
|
public FileInfo toWechatFileInfo(String fileId) {
|
FileInfo fileInfo = new FileInfo();
|
fileInfo.setId(fileId);
|
fileInfo.setSuffix(this.getFileSuffix());
|
fileInfo.setTrueName(this.getFileName() + BaseConsts.DOT + fileInfo.getSuffix());
|
// fileInfo.setFileName(this.getFileName() + BaseConsts.UNDER + fileInfo.getId() + BaseConsts.DOT + fileInfo.getSuffix());
|
fileInfo.setFileName(this.getFileVerifyCode() + BaseConsts.DOT + fileInfo.getSuffix());
|
fileInfo.setCat(FileCatEnum.getFileCat(fileInfo.getSuffix()));
|
fileInfo.setSize(this.getFileSize());
|
fileInfo.setUnit(this.getFileUnit());
|
fileInfo.setMd5Code(this.getFileVerifyCode());
|
fileInfo.setStoreWay(STORE_WAY);
|
fileInfo.setPath(this.getFileDir());
|
fileInfo.setFullPath(fileInfo.getPath() + BaseConsts.SLANT + fileInfo.getFileName());
|
fileInfo.setShowUrl(SHOW_URL_WECHAT + BaseConsts.SLANT + fileInfo.getId());
|
fileInfo.setDownUrl(DOWN_URL_WECHAT + BaseConsts.SLANT + fileInfo.getId());
|
// todo
|
fileInfo.setZipUrl(fileInfo.getShowUrl());
|
Date nowDate = DateUtils.getNowDate();
|
fileInfo.setCreateTime(nowDate);
|
fileInfo.setUpdateTime(nowDate);
|
fileInfo.setDeleteStatus(BaseConsts.DELETE_STATUS_0);
|
return fileInfo;
|
}
|
|
/**
|
* 获取文件名称
|
*/
|
public String getFileName() {
|
return StringUtils.substringBeforeLast(this.file.getOriginalFilename(), BaseConsts.DOT);
|
}
|
|
/**
|
* 获取文件后缀
|
*/
|
public String getFileSuffix() {
|
return StringUtils.substringAfterLast(this.file.getOriginalFilename(), BaseConsts.DOT);
|
}
|
|
/**
|
* 获取文件存储目录,以斜杠开头(/home/ftp/huge-dyh/2022/3)
|
*/
|
public String getFileDir() {
|
//按照年月构建目录
|
Calendar ca = Calendar.getInstance();
|
StringBuilder builder = new StringBuilder();
|
builder.append(FtpFileConfig.getRootdir());
|
builder.append(BaseConsts.SLANT);
|
builder.append(ca.get(Calendar.YEAR));
|
builder.append(BaseConsts.SLANT);
|
builder.append(ca.get(Calendar.MONTH) + 1);
|
return builder.toString();
|
}
|
|
/**
|
* 获取文件大小, 根据不同的单位进行运算
|
*/
|
public double getFileSize() {
|
long size = this.file.getSize();
|
BigDecimal divisor = new BigDecimal(size);
|
String unit = this.getFileUnit();
|
|
if (BaseConsts.B.equals(unit)) {
|
return size;
|
} else if (BaseConsts.KB.equals(unit)) {
|
return divisor.divide(kilobyteDividend, 2, RoundingMode.HALF_UP).doubleValue();
|
} else if (BaseConsts.MB.equals(unit)) {
|
return divisor.divide(megabyteDividend, 2, RoundingMode.HALF_UP).doubleValue();
|
} else if (BaseConsts.GB.equals(unit)) {
|
return divisor.divide(gigabyteDividend, 2, RoundingMode.HALF_UP).doubleValue();
|
}
|
return 0.0;
|
}
|
|
/**
|
* 获取文件单位, B|KB|MB|GB
|
*/
|
public String getFileUnit() {
|
long size = this.file.getSize();
|
if (size > 0 && size <= kilobyte) {
|
return BaseConsts.B;
|
} else if (size > kilobyte && size <= megabyte) {
|
return BaseConsts.KB;
|
} else if (size > megabyte && size <= gigabyte) {
|
return BaseConsts.MB;
|
} else if (size > gigabyte) {
|
return BaseConsts.GB;
|
}
|
return BaseConsts.B;
|
}
|
|
/**
|
* 获取文件校验码, MD5
|
*/
|
public String getFileVerifyCode() {
|
try {
|
return DigestUtils.md5Hex(this.file.getBytes());
|
} catch (IOException e) {
|
throw new ServiceException("MultipartFileWrapper.getFileVerifyCode", e);
|
}
|
}
|
}
|