controller
/**
* 上传文件
* @param file 【必填】 文件
* @param path 【必填】 路径
* @param name 文件名 不填默认为源文件名
* @param type 【必填】 对象存储服务代码 1 阿里云OSS
* @return
*/
@PostMapping("upload")
public ResultBody uploadFile(MultipartFile file, @RequestParam String path, String name, @RequestParam Integer type){
if(ObjectUtil.isNull(file)){
return ResultUtil.response(ResponseStatus.OSS_FILE_NOT_NULL);
}
String fileName = path;
if(StringUtils.isNotBlank(name)){
fileName = fileName + "/" + name;
}else {
fileName = fileName + "/" + file.getOriginalFilename();
}
// 提取扩展名
String ext = "";
if (fileName.lastIndexOf(".") > 0) {
ext = fileName.substring(fileName.lastIndexOf(".") + 1);
}
String url = ossContextHolder.getOssService(OSSConstant.obtainName(type)).uploadFile(file, fileName, ext);
return ResultUtil.success(url);
}
service:
/**
* 上传文件
* @param file 文件
* @param fileName 文件名
* @param ext 文件名后缀
* @return
*/
@Override
public String uploadFile(MultipartFile file, String fileName, String ext) {
// 替换当前的文件名,避免文件被覆盖(2021-05-31)
// 替换当前的文件名,避免文件被覆盖(2021-05-31)
fileName = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmSS")) + RandomUtil.randomNumbers(6);
if (StrUtil.isNotBlank(ext)) {
if (ext.startsWith(".")) {
fileName = fileName + ext;
} else {
fileName = fileName + "." + ext;
}
}
//基数 图片最大长度
int baseMax = 1024;
try {
System.out.println("原图片大小:" + file.getSize() / 1024 + "kb");
InputStream inputStream = file.getInputStream();
BufferedImage bufImg = ImageIO.read(inputStream);
int srcWidth = bufImg.getWidth();
int srcHeight = bufImg.getHeight();
// 指定大小(宽或高超出会才会被缩放)
ByteArrayInputStream byteArrayInputStream = null;
if (srcWidth > baseMax || srcHeight > baseMax) {
//计算缩放比
Boolean flag = srcWidth > srcHeight ? true :false;
BigDecimal ratio = new BigDecimal(0.8);
if(flag){
ratio = new BigDecimal(baseMax).divide(new BigDecimal(srcWidth), 6, BigDecimal.ROUND_HALF_UP);
}else{
ratio = new BigDecimal(baseMax).divide(new BigDecimal(srcHeight), 6, BigDecimal.ROUND_HALF_UP);
}
BigDecimal a = new BigDecimal(srcWidth).multiply(ratio);
BigDecimal b = new BigDecimal(srcHeight).multiply(ratio);
int desMaxWidth = a.intValue();
int desMaxHeight = b.intValue();
byte[] bytes = compressPictureForScale(file.getBytes(), desMaxWidth, desMaxHeight);
byteArrayInputStream = new ByteArrayInputStream(bytes);
return aliOssUploadUtil.uploadFile(byteArrayInputStream, fileName, ext);
}else{
return aliOssUploadUtil.uploadFile(file, fileName, ext);
}
} catch (Exception e) {
System.out.println("图片上传失败,重新上传!");
return aliOssUploadUtil.uploadFile(file, fileName, ext);
}
}
//压缩图片到指定大小
private byte[] compressPictureForScale(byte[] imageBytes,int width,int hight) throws IOException {
if (imageBytes == null || imageBytes.length <= 0) {
return imageBytes;
}
ByteArrayInputStream inputStream = new ByteArrayInputStream(imageBytes);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream(imageBytes.length);
Thumbnails.of(inputStream).size(width,hight).keepAspectRatio(false).toOutputStream(outputStream);
imageBytes = outputStream.toByteArray();
return imageBytes;
}