Files
crmeb_java/crmeb/src/main/java/com/utils/UploadUtil.java
ָ·ìdeÑô¹â 10d83d7cff 1.3.2
2021-02-06 17:45:04 +08:00

328 lines
10 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package com.utils;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;
import com.constants.Constants;
import com.exception.CrmebException;
import com.zbkj.crmeb.upload.vo.FileResultVo;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang3.BooleanUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.util.List;
/**
* 上传工具类
* +----------------------------------------------------------------------
* | CRMEB [ CRMEB赋能开发者助力企业发展 ]
* +----------------------------------------------------------------------
* | Copyright (c) 2016~2020 https://www.crmeb.com All rights reserved.
* +----------------------------------------------------------------------
* | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
* +----------------------------------------------------------------------
* | Author: CRMEB Team <admin@crmeb.com>
* +----------------------------------------------------------------------
*/
public class UploadUtil {
private static UploadUtil uploadUtil = new UploadUtil();
//服务器存储地址
// private static String rootPath = "/www/wwwroot/upload";
private static String rootPath = "";
//类型
// private static String imagePath = "/image";
// private static String type = "/image";
private static String type = "/crmebimage";
//模块
// private static String modelPath = "/store";
private static String modelPath = "/public";
//扩展名
private static String extStr = "png,jpg";
//文件大小上限
private static int size = 2;
//是否压缩图片
private static boolean isCompress = false;
public static String getRootPath() {
return rootPath;
}
public static void setRootPath(String rootPath) {
UploadUtil.rootPath = (rootPath + "/").replace(" ", "").replace("//", "/");
}
public static String getType() {
return type;
}
public static void setType(String type) {
UploadUtil.type = type + "/";
}
public static String getModelPath() {
return modelPath;
}
public static void setModelPath(String modelPath) {
UploadUtil.modelPath = modelPath + "/";
}
public static String getExtStr() {
return extStr;
}
public static void setExtStr(String extStr) {
UploadUtil.extStr = extStr;
}
public static int getSize() {
return size;
}
public static void setSize(int size) {
UploadUtil.size = size;
}
public static boolean isIsCompress() {
return isCompress;
}
public static void setIsCompress(boolean isCompress) {
UploadUtil.isCompress = isCompress;
}
/**
* 获取单例
* @author Mr.Zhang
* @since 2020-05-08
*/
public static UploadUtil getInstance() {
if (uploadUtil == null) {
uploadUtil = new UploadUtil();
}
return uploadUtil;
}
/**
* 根据文件的绝对路径创建一个文件对象.
* @return 返回创建的这个文件对象
* @author Mr.Zhang
* @since 2020-05-08
*/
public static File createFile(String filePath) throws IOException {
// 获取文件的完整目录
String fileDir = FilenameUtils.getFullPath(filePath);
// 判断目录是否存在,不存在就创建一个目录
File file = new File(fileDir);
if (!file.isDirectory()) {
//创建失败返回null
if (!file.mkdirs()) {
throw new CrmebException("文件目录创建失败...");
}
}
// 判断这个文件是否存在,不存在就创建
file = new File(filePath);
if (!file.exists()) {
if (!file.createNewFile()) {
throw new CrmebException("目标文件创建失败...");
}
}
return file;
}
/**
* 判断文件扩展名是否合法
* @param extName 文件的后缀名
* @author Mr.Zhang
* @since 2020-05-08
*/
private static void isContains(String extName) {
if (StringUtils.isNotEmpty(getExtStr())) {
// 切割文件扩展名
List<String> extensionList = CrmebUtil.stringToArrayStr(getExtStr());
if (extensionList.size() > 0) {
//判断
if (!extensionList.contains(extName)) {
throw new CrmebException("上传文件的类型只能是:" + getExtStr());
}
} else {
throw new CrmebException("上传文件的类型只能是:" + getExtStr());
}
}
}
// /**
// * 图片压缩
// * @param serverPath 图片的绝对路径
// * @param childFile 子文件夹
// * @param extName 文件的后缀
// * @author Mr.Zhang
// * @since 2020-05-08
// */
// private static String thumbnails(String serverPath, String childFile, String extName) throws IOException {
// // 压缩后的相对路径文件名
// String toFilePath = getDestPath(extName);
//
// // scale图片缩放比例
// // outputQuality图片压缩比例
// // toFile图片位置
// // outputFormat文件输出后缀名
// // Thumbnails 如果用来压缩 png 格式的文件,会越压越大,
// // 得把png格式的图片转换为jpg格式
// if ("png".equalsIgnoreCase(extName)) {
// // 由于outputFormat会自动在路径后加上后缀名所以移除以前的后缀名
// String removeExtensionFilePath = FilenameUtils.removeExtension(toFilePath);
// Thumbnails.of(serverPath).scale(1f)
// .outputQuality(0.5f)
// .outputFormat("jpg")
// .toFile(getServerPath(removeExtensionFilePath));
// toFilePath = removeExtensionFilePath + ".jpg";
// } else {
// Thumbnails.of(serverPath).scale(1f).outputQuality(0.5f)
// .toFile(getServerPath(toFilePath));
// }
//
// // 删除被压缩的文件
// FileUtils.forceDelete(new File(serverPath));
//
// return toFilePath;
// }
/**
* 生成文件文件名
* @param fileName 文件名
* @author Mr.Zhang
* @since 2020-05-08
*/
public static String getDestPath(String fileName) {
//规则: 子目录/年/月/日.后缀名
return getServerPath() + fileName;
}
public static String fileName(String extName){
return CrmebUtil.getUuid() + RandomUtil.randomString(10) + "." + extName;
}
/**
* 生成文件在的实际的路径
* @author Mr.Zhang
* @since 2020-05-08
*/
public static String getServerPath() {
// 文件分隔符转化为当前系统的格式
return FilenameUtils.separatorsToSystem( getRootPath() + getWebPath());
}
/**
* web目录可访问的路径
* @author Mr.Zhang
* @since 2020-05-08
*/
public static String getWebPath() {
// 文件分隔符转化为当前系统的格式
return getType() + getModelPath() + DateUtil.nowDate(Constants.DATE_FORMAT_DATE).replace("-", "/") + "/";
}
/**
* 检测文件大小上限
* @author Mr.Zhang
* @since 2020-05-08
*/
private static void checkSize(Long size) {
// 文件分隔符转化为当前系统的格式
float fileSize = (float)size / 1024 / 1024;
String fs = String.format("%.2f", fileSize);
if( fileSize > getSize()){
throw new CrmebException("最大允许上传" + getSize() + " MB的文件, 当前文件大小为 " + fs + " MB");
}
}
/**
* 上传文件
* @param multipartFile 上传的文件对象,必传
* @author Mr.Zhang
* @since 2020-05-08
*/
private static FileResultVo saveFile(MultipartFile multipartFile) throws IOException {
if (null == multipartFile || multipartFile.isEmpty()) {
throw new CrmebException("上传的文件对象不存在...");
}
// 文件名
String fileName = multipartFile.getOriginalFilename();
System.out.println("fileName = " + fileName);
// 文件后缀名
String extName = FilenameUtils.getExtension(fileName);
if (StringUtils.isEmpty(extName)) {
throw new RuntimeException("文件类型未定义不能上传...");
}
if (fileName.length() > 99) {
fileName = StrUtil.subPre(fileName, 90).concat(".").concat(extName);
}
//文件大小验证
checkSize(multipartFile.getSize());
// 判断文件的后缀名是否符合规则
isContains(extName);
//文件名
String newFileName = fileName(extName);
// 创建目标文件的名称规则请看destPath方法
String destPath = getDestPath(newFileName);
// 创建文件
File file = createFile(destPath);
// 保存文件
multipartFile.transferTo(file);
// 拼装返回的数据
FileResultVo result = new FileResultVo();
//如果是图片,就进行图片处理
if (BooleanUtils.isTrue(isIsCompress())) {
// // 图片处理
// String toFilePath = thumbnails(serverPath, childFile, extName);
// // 得到处理后的图片文件对象
// File file = new File(getServerPath());
// // 压缩后的文件后缀名
// String extExtName = FilenameUtils.getExtension(toFilePath);
// // 源文件=源文件名.压缩后的后缀名
// String extFileName = FilenameUtils.getBaseName(fileName) + "." + FilenameUtils.getExtension(toFilePath);
// result.setFileSize(file.length());
// result.setServerPath(toFilePath);
// result.setFileName(extFileName);
// result.setExtName(extExtName);
} else {
result.setFileSize(multipartFile.getSize());
result.setFileName(fileName);
result.setExtName(extName);
result.setServerPath(destPath);
result.setUrl(getWebPath() + newFileName);
result.setType(multipartFile.getContentType());
}
return result;
}
/**
* 上传
* @param multipartFile 上传的文件对象,必传
* @since 2020-05-08
* @author Mr.Zhang
*/
public static FileResultVo file(MultipartFile multipartFile) throws IOException {
return saveFile(multipartFile);
}
}