先编写一个小工具类
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;//由于我的界面上输入的是百分比数据,所以要除以100ByteArrayOutputStream 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的图片数据输出。
实际操作界面请访问以下页面
gpt114,伴你左右!