前言
上传文件或者图片有很多种方式,今天为分享一下我所使用的
一、上菜
1.配置
image:
path: D:\oss
url: http://xxx.com/image
2.controller层
@RestController
@Api(value="文件上传", tags="文件上传")
@CrossOrigin(allowCredentials="true", maxAge= 86400)
public class UploadController {
@Autowired
private UploadService uploadService;
@ApiOperation(httpMethod = "POST", value = "上传照片", notes = "上传照片", produces = MediaType.APPLICATION_JSON_VALUE)
@PostMapping(value = "/upload")
public BaseResult<UploadImageVo> uploadFileToImg(@RequestParam MultipartFile multfile) {
// 上传照片
return uploadService.getCompressPicture(multfile);
}
}
3.service层
@Slf4j
@Service
public class UploadServiceImpl implements UploadService {
/** 文件存储目录 */
@NacosValue("${image.path}")
private String PATH;
/** 文件存储目录 */
@NacosValue("${image.url}")
private String URL;
@Override
public BaseResult getCompressPicture(MultipartFile multfile) {
UploadImageVo vo = new UploadImageVo();
if (Objects.isNull(multfile)) {
return BaseResult.fail("上传文件为空");
}
try {
// 图片名称
String fileName = multfile.getOriginalFilename();
// 文件后缀
String prefix = fileName.substring(fileName.lastIndexOf(".") + 1);
// 上传文件转换为Image
Image originalImage = ImagesUtils.transformMultipartFileToImage(multfile);
// 图片压缩
BufferedImage image = ImagesUtils.compressImage(originalImage);
if (Objects.isNull(image)) {
return BaseResult.fail("上传文件解析错误,请查看上传文件是否正确");
}
// 图片名称
String name = ImagesUtils.buildImageName(prefix);
// 按日期增加目录 < 这里更具自己的需要使用 >
// String dateTime = DateUtils.formatDateTimetoString(new Date(), DateUtils.FMT_yyyyMMdd);
// 目录绝对路径
// String direct = ImagesUtils.buildPath(PATH, dateTime);
// 目录不存在则新建目录
ImagesUtils.checkFildDirect(PATH);
// 转存文件到指定目录
String filePath = ImagesUtils.buildPath(PATH, name);
File file = new File(filePath);
ImageIO.write(image, prefix,file);
String url = ImagesUtils.buildPath(URL, null);
vo.setImagePath(filePath);
vo.setImageName(name);
vo.setImageUrl(String.format("%s/%s", url, name));
return BaseResult.success(vo);
} catch (Exception e) {
log.error("上传图片文件失败", e);
return BaseResult.fail("上传图片文件失败");
}
}
}
4.ImagesUtils工具🥱
@Slf4j
public class ImagesUtils {
/**
* 图片压缩
* @param image
* @return
*/
public static BufferedImage compressImage(Image image) {
if (Objects.isNull(image)) {
return null;
}
// 根据原图片 获取原图片宽度、高度
int originalWidth = image.getWidth(null);
int originalHeight = image.getHeight(null);
Double rate = 0.9;
int width = (int) (originalWidth * rate);
int height = (int) (originalHeight * rate);
BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
bufferedImage.getGraphics().drawImage(image, 0, 0, width, height, null);
return bufferedImage;
}
/**
* MultipartFile 转 Image
* @param multfile
* @return
*/
public static Image transformMultipartFileToImage(MultipartFile multfile){
Image image = null;
try {
// 文件名
String fileName = multfile.getOriginalFilename();
// 文件后缀
String prefix = fileName.substring(fileName.lastIndexOf("."));
// 流转换
File file = File.createTempFile(UUID.randomUUID().toString(), prefix);
multfile.transferTo(file);
image = ImageIO.read(file);
} catch (IOException e) {
log.error("文件转换流失败", e);
}
return image;
}
/**
* 生成图片文件名
* @param prefix
* @return
*/
public static String buildImageName(String prefix){
String ran = String.format("%03d", new Random().nextInt(999));
return String.format("IMG%s%s.%s", System.currentTimeMillis(), ran, prefix);
}
/**
* 构建路径
* @param path
* @param param
* @return
*/
public static String buildPath(String path, String param){
String direct = path.endsWith(File.separator) ? path.substring(0, path.length() - 1) : path;
if (StringUtils.isBlank(param)) {
return direct;
} else {
// File.separator 根据操作系统 判断 / 和 \
return direct+File.separator+param;
}
}
/**
* 检验目录是否存在 不存在则创建
* @param direct 目录绝对路径
*/
public static void checkFildDirect(String direct){
// 目录不存在则新建目录
File dictFile = new File(direct);
if (!dictFile.exists() || !dictFile.isDirectory()) {
dictFile.mkdir();
}
}
}
总结
代码虽好,可不要贪杯哦