服务接口
import org.springframework.web.multipart.MultipartFile;
/**
* 文件服务
*
* @author Zhenfeng Li
* @version 1.0
* @date 2020-11-23 14:17
*/
public interface FileService {
/**
* 保存/更新图片
*
* @param multipartFile 图片
* @param basePath 路径
* @param id 主键Id
* @param fileName 图片名称
* @return 保存后的全路径
* @throws Exception
*/
String imgSaveOrUpdate(MultipartFile multipartFile, String basePath, Long id, String fileName) throws Exception;
/**
* 保存/更新图片
*
* @param byte64 图片base64
* @param basePath 路径
* @param id 主键Id
* @param fileName 图片名称
* @return 保存后的全路径
* @throws Exception
*/
String imgSaveOrUpdate(String byte64, String basePath, Long id, String fileName) throws Exception;
}
服务接口
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.FileOutputStream;
/**
* 文件服务
*
* @author Zhenfeng Li
* @version 1.0
* @date 2020-11-23 14:25
*/
@Service
@Slf4j
public class FileServiceImpl implements FileService {
/**
* 图片存储绝对路径
*/
@Value("${absolute.path}")
private String absolutePath;
/**
* 图片服务器域名
*/
@Value("${img.domain-name}")
private String imgDomainName;
@Override
public String imgSaveOrUpdate(MultipartFile multipartFile,String basePath, Long id, String fileName) throws Exception {
return saveOrUpdate(multipartFile, basePath, id, fileName);
}
@Override
public String imgSaveOrUpdate(String byte64,String basePath, Long id, String fileName) throws Exception {
return saveOrUpdate(byte64, basePath, id, fileName);
}
/**
* @param multipartFile 图片文件
* @param path 路径
* @param id 用户/商户/商品/司机Id
* @param fileName 文件存储名称
* @return 文件保存后的url
* @throws Exception 目录创建异常
*/
private String saveOrUpdate(MultipartFile multipartFile, String path, Long id, String fileName) throws Exception {
String suffix = Utils.getMultipartFileType(multipartFile);
File file = makeDir(path, id, fileName, suffix);
multipartFile.transferTo(file);
return imgDomainName + "/" + path + "/" + id + "/" + fileName + "." + suffix;
}
/**
* @param base64 图片base64
* @param path 路径
* @param id 用户/商户/商品/司机Id
* @param fileName 文件存储名称
* @return 文件保存后的url
* @throws Exception 目录创建异常
*/
private String saveOrUpdate(String base64, String path, Long id, String fileName) throws Exception {
Base64Image base64Image = Base64Image.build(base64);
byte[] bytes = base64Image.getBytes();
String suffix = base64Image.getExtName();
File file = makeDir(path, id, fileName, suffix);
try (FileOutputStream writer = new FileOutputStream(file)) {
writer.write(bytes);
}
return imgDomainName + "/" + path + "/" + id + "/" + fileName + "." + suffix;
}
/**
* 创建目录
*
* @param path 文件路径
* @param id 用户/商户/商品/司机Id
* @param fileName 文件存储名称
* @param suffix 文件后缀
* @return 文件保存后的url
* @throws Exception 目录创建异常
*/
private File makeDir(String path, Long id, String fileName, String suffix) throws Exception {
File file = new File(absolutePath + "/" + path + "/" + id + "/" + fileName + "." + suffix);
if (!file.getParentFile().exists()) {
if (!file.getParentFile().mkdirs()) {
log.error("目录创建失败,[{}]", file.getPath());
throw new Exception("目录创建失败");
}
}
return file;
}
}
工具类
import lombok.Data;
import java.util.Base64;
/**
* Base64图片类
*
* @author Zhenfeng Li
* @version 1.0
* @date 2019-09-23 14:46
*/
@Data
public class Base64Image {
/**
* 图片数据
*/
private byte[] bytes;
/**
* 图片后缀
*/
private String extName;
private Base64Image(byte[] bytes, String extName) {
this.bytes = bytes;
this.extName = extName;
}
public static Base64Image build(String base64) {
byte[] bytes = base64ToByte(base64);
String imgFormat = getImgFormat(base64);
return new Base64Image(bytes, imgFormat);
}
/**
* 图片base64获取图片格式
*/
private static String getImgFormat(String base64) {
String[] split = base64.split(",");
if (split.length < 2) {
return null;
}
if (split[0].toLowerCase().contains("/png")) {
return "png";
} else if (split[0].toLowerCase().contains("/jpeg")) {
return "jpeg";
} else if (split[0].toLowerCase().contains("/jpg")) {
return "jpg";
} else if (split[0].toLowerCase().contains("/gif")) {
return "gif";
} else if (split[0].toLowerCase().contains("/bmp")) {
return "bmp";
} else if (split[0].toLowerCase().contains("/tiff")) {
return "tiff";
}
return null;
}
/**
* 转换图片为byte
*
* @param base64 base64字符串
* @return 返回byte[]
*/
private static byte[] base64ToByte(String base64) {
byte[] dataByte = Base64.getDecoder().decode(base64.split(",")[1].replace("\n", "").replace("\r", ""));
for (int i = 0; i < dataByte.length; ++i) {
//调整异常数据
if (dataByte[i] < 0) {
dataByte[i] += 256;
}
}
return dataByte;
}
}