先编写一个小工具类
package com.ai157.aigc.utils;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
public class MyFileUtils {
public static File convert(MultipartFile multipartFile) throws IOException {
File file = new File(multipartFile.getOriginalFilename());
try (InputStream is = multipartFile.getInputStream()) {
org.apache.commons.io.FileUtils.copyInputStreamToFile(is, file);
}
return file;
}
}
从前端页面上传上来,后端处理类
package com.ai157.aigc.controller;
import com.ai157.aigc.utils.MyFileUtils;
import org.apache.commons.io.FileUtils;
import org.csource.common.MyException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.Base64;
@RestController
public class FileSmallController {
@PostMapping("/api/file/small")
public String handleFileUpload(@RequestParam("file") MultipartFile file,
@RequestParam("scale") Float scale,
@RequestParam("fileType") String fileType
) {
try {
scale = scale/100;//由于我的界面上输入的是百分比数据,所以要除以100
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
compress(MyFileUtils.convert(file),byteArrayOutputStream,scale);
return Base64.getEncoder().encodeToString( byteArrayOutputStream.toByteArray());
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
throw new RuntimeException(e);
}
return "File uploaded successfully!";
}
/**
*这个是处理方法
*/
public static void compress(File srcFile, ByteArrayOutputStream byteArrayOutputStream, float scale) {
scale = (float) Math.sqrt(scale);
try {
BufferedImage srcImage = ImageIO.read(srcFile);
int width = (int) (srcImage.getWidth() * scale);
int height = (int) (srcImage.getHeight() * scale);
BufferedImage destImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
destImage.getGraphics().drawImage(srcImage.getScaledInstance(width, height, BufferedImage.SCALE_SMOOTH), 0, 0, null);
ImageIO.write(destImage, "png", byteArrayOutputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
}
注意下:
1、scale = scale/100;这个为什么除以100,由于前端上传的不是小数,是百分比数值。
2、由于长度和宽度是等比缩小,如果长度是a,宽度是b,那(ax)*(bx)= scale*a*b
所以x平方等于scale。所以在计算前要开方下。
3、由于前端是以图片的方式渲染,所以以Base64的图片数据输出。