【Java】【43】上传图片,重新命名并缩放到固定大小

前言:

1,我这边的需求是,用户上传图片,需要将图片的名称进行处理,并同时生成100*100,300*300大小的图片上传到服务器

2,当时做这个项目的时候是用的SpringMVC

正文:

JS部分在此不做记录

后端:

Controller层:

@ResponseBody
@RequestMapping(value = "uploadImage", method = RequestMethod.POST)
public String uploadImage(String membId, @RequestParam MultipartFile[] myfiles) throws IOException{ 
  return memberService.uploadImage(membId, myfiles);
}

Service层:

public String uploadImage(String membId, MultipartFile[] myfiles) {
    String path = "C:/img/";  //保存图片的文件夹路径 (最好写到配置文件里,包括下面一些参数是否要写到配置文件里,自己酌情处理)       
    File file = new File(path);
    if (!file.exists()) {  //判断文件夹是否存在 (可以先创建文件夹,免得每次上传都要判断)          
        file.mkdirs(); //mkdirs:会一步到位创建目录文件(即使目录不存在);mkdir:如果找不到上一级的目录,会创建失败
    } 
   
    for( MultipartFile myfile : myfiles) { 
        if (myfile.isEmpty()) {
            this.theService.log("找不到对应文件"); //可记录到日志表或者记录到日志文件,包括下面的代码是否要打日志,自己酌情处理
            continue;
        }

        if (myfile.getSize() <= 10*1024) {
            this.theService.log("文件大小不能超过10M");
            continue;
        }

        String originalFilename = myfile.getOriginalFilename(); //123.jpg → 123
        String fileFormat = originalFilename.substring(originalFilename.lastIndexOf(".")+1);  //123.jpg → jpg
        UUID uuid = UUID.randomUUID();
        String guid = uuid.toString(); //随机数     
             
        try {
            String newFileName = String.format("%s_%s.%s", membId, guid, fileFormat); 
            String newFile = path + newFileName; //C:/img/xxMembId_yyGuid.jpg
            FileUtils.copyInputStreamToFile(myfile.getInputStream(), new File(file, newFileName)); //下载了原图片 

            ImgCompress imgCom = new ImgCompress(newFile); 
            String MFile = String.format("%s%s_%s_%s_%s.%s", path, membId, guid, 100, 100, fileFormat);
            String LFile = String.format("%s%s_%s_%s_%s.%s", path, membId, guid, 300, 300, fileFormat);

            imgCom.resizeFix(100, 100, MFile, fileFormat); 
            imgCom.resizeFix(300, 300, LFile, fileFormat);

            String imgUrl = domain + "/img/" + newFileName; //返回图片路径,domain为项目的域名,img → "C:/img/",可在tomcat的conf - server.xml中配置,是一种映射关系
            return imgUrl;
        } catch (IOException e) {   
            e.printStackTrace();                    
        }                                
       
    } 
    return "";
}  

图片压缩工具类ImgCompress

package com.bf.health.util;

import java.io.*;  
import java.awt.*;  
import java.awt.image.*;  
import javax.imageio.ImageIO;

public class ImgCompress {  
    private Image img;  
    private int width;  
    private int height;
    
    /** 
     * 构造函数 
     */  
    public  ImgCompress(String fileName) throws IOException {  
        File file = new File(fileName);// 读入文件  
        img = ImageIO.read(file);      // 构造Image对象  
        width = img.getWidth(null);    // 得到源图宽  
        height = img.getHeight(null);  // 得到源图长  
    }
    
    /** 
     * 按照宽度还是高度进行压缩 
     * @param w int 最大宽度 
     * @param h int 最大高度 
     */  
    public void resizeFix(int w, int h, String path, String formatName) throws IOException {  
        w = (width > w) ? w : width;
        h = (height > h) ? h : height;
        if (width / height > w / h) {  
            resizeByWidth(w, path, formatName);  
        } else {  
            resizeByHeight(h, path, formatName);  
        }  
    }  

    /** 
     * 以宽度为基准,等比例放缩图片 
     * @param w int 新宽度 
     */  
    public void resizeByWidth(int w, String path, String formatName) throws IOException {  
        int h = height * w / width;       
        resize(w, h, path, formatName);  
    }  

    /** 
     * 以高度为基准,等比例缩放图片 
     * @param h int 新高度 
     */  
    public void resizeByHeight(int h, String path, String formatName) throws IOException {  
        int w = width * h / height;  
        resize(w, h, path, formatName);  
    }  

    /** 
     * 强制压缩/放大图片到固定的大小 
     * @param w int 新宽度 
     * @param h int 新高度 
     */  
    public void resize(int w, int h, String path, String formatName) throws IOException {        
        BufferedImage image = new BufferedImage(w, h, Image.SCALE_SMOOTH); //SCALE_SMOOTH 的缩略算法 生成缩略图片的平滑度的 优先级比速度高 生成的图片质量比较好 但速度慢    
        image.getGraphics().drawImage(img, 0, 0, w, h, null); // 绘制缩小后的图  
        File destFile = new File(path);  
        FileOutputStream out = new FileOutputStream(destFile); // 输出到文件流  
        ImageIO.write(image, formatName, new File(path));
        out.close();  
    }
 
}  

 spring-mvc-config.xml

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">  
    <!--1024*200即200k-->  
    <property name="maxUploadSize" value="204800"/>  
    <!--resolveLazily属性启用是为了推迟文件解析,以便在UploadAction 中捕获文件大小异常-->  
    <property name="resolveLazily" value="true"/>    
</bean> 

 参考博客:

Java中图片压缩处理 - java小强 - ITeye博客
https://cuisuqiang.iteye.com/blog/2045855

posted @ 2019-08-13 18:48  花生喂龙  阅读(818)  评论(0编辑  收藏  举报