Java上传图片到服务器,以及切割图片

575 阅读2分钟

1、上传图片功能

@ApiOperation(value = "切割图片", notes = "切割图片,返回base64")
@RequestMapping(value = "/cutImageBase64", method = RequestMethod.POST)
public void cutImageBase64(@RequestBody @RequestParam("file") MultipartFile file, HttpServletResponse response) {
//1.文件后缀过滤,只允许部分后缀
//文件的完整名称,如spring.jpeg
String filename = file.getOriginalFilename();
//文件名,如spring
String name = filename.substring(0, filename.indexOf("."));
//文件后缀,如.jpeg
String suffix = filename.substring(filename.lastIndexOf("."));
String allowSuffix = ".bmp.jpg.jpeg.png.gif.pdf.doc.zip.rar.gz";
if (allowSuffix.indexOf(suffix) == -1) return null;
//创建年月文件夹
Calendar date = Calendar.getInstance();
File dateDirs = new File(date.get(Calendar.YEAR)
      + File.separator + (date.get(Calendar.MONTH) + 1));

//目标文件
File descFile = new File(AppConst.UPLOAD_PATH + File.separator + dateDirs + File.separator + filename);
int i = 1;
//若文件存在重命名
String newFilename = filename;
while (descFile.exists()) {
   newFilename = name + "(" + i + ")" + suffix;
   String parentPath = descFile.getParent();
   descFile = new File(parentPath + File.separator + newFilename);
   i++;
}
//判断目标文件所在的目录是否存在
if (!descFile.getParentFile().exists()) {
   //如果目标文件所在的目录不存在,则创建父目录
   descFile.getParentFile().mkdirs();
}
//3.存储文件
try {
   file.transferTo(descFile);
} catch (Exception e) {
   e.printStackTrace();
}
// return  descFile;
}

2、上传文件前端代码,参数传输方式

    handleUpload (file) {
      const params = new FormData()
      params.append('file', file)
      cutImageBase64(params).then(r => {}
    }

3、切割图片

package com.dmc.util;

import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.imageio.ImageIO;
import sun.misc.BASE64Encoder;

import java.util.Calendar;
import org.springframework.web.multipart.MultipartFile;
import com.dmc.util.AppConst;

/**
 * 图片工具类
 * 
 *
 */
public class ImageUtil {

   /**
    * 切割图片
    * @param sourceFilePath 源文件路径
    * @param index 水平方向等分切割数
    * @return List<String>   base64编码数组
    */
   public static List<String> cutImageToBase64(String sourceFilePath,int index){
      File file = new File(sourceFilePath);
      if (file.exists()) {
         return cutImageToBase64(file,index);
      }else{
         return null;
      }
   }

   /**
    * 切割图片
    * @param sourceFilePath 源文件路径
    * @param sourceFilePath 保存文件路径
    * @param index 水平方向等分切割数
    * @return List<File>   File数组
    */
   public static List<File> cutImageToFile(String sourceFilePath,int index){
      File file = new File(sourceFilePath);
      if (file.exists()) {
         return cutImageToFile(file, index);
      }else{
         return null;
      }
   }
   
   /**
    * 切割图片
    *
    * @param sourceFile
    *            源文件
    * @param index
    *            水平方向等分切割数
    * @return List<String> base64编码数组
    */
   public static List<String> cutImageToBase64(File sourceFile,int index) {
      List<String> list = new ArrayList<String>();
      int suffixIndex = sourceFile.getName().lastIndexOf(".");
      String suffix = sourceFile.getName().substring(suffixIndex+1);
      try {
         BufferedImage source = ImageIO.read(sourceFile);
         int width = source.getWidth(); // 图片宽度
         int height = source.getHeight(); // 图片高度
         if (index>1) {
            int cWidth = width/index; // 切片宽度
            BufferedImage image = null;
            for (int i = 0; i < index; i++) {
               // x坐标,y坐标,宽度,高度
               BASE64Encoder encoder = new BASE64Encoder();
               int cw = i*cWidth;
               ByteArrayOutputStream baos = new ByteArrayOutputStream();
               image = source.getSubimage(cw,0,cWidth,height);
               ImageIO.write(image, "PNG", baos);
               byte[] bytes = baos.toByteArray();
               list.add("data:image/"+suffix+";base64,"+encoder.encodeBuffer(bytes));
               baos.close();
            }
         }
      } catch (IOException e) {
         e.printStackTrace();
      }
      return list;
   }

   /**
    * 切割图片
    *
    * @param sourceFile
    *            源文件
    * @param index
    *            水平方向等分切割数
    * @return List<String> base64编码数组
    */
   public static List<File> cutImageToFile(File sourceFile,int index) {
      List<File> list = new ArrayList<File>();
      int suffixIndex = sourceFile.getName().lastIndexOf(".");
      String suffix = sourceFile.getName().substring(suffixIndex+1);
      String name =  sourceFile.getName().substring(0,suffixIndex);
      try {
         BufferedImage source = ImageIO.read(sourceFile);
         int width = source.getWidth(); // 图片宽度
         int height = source.getHeight(); // 图片高度
         if (index>1) {
            int cWidth = width/index; // 切片宽度
            BufferedImage image = null;
            File file = new File(AppConst.UPLOAD_PATH);
            if (!file.exists()) { // 存储目录不存在,则创建目录
               file.mkdirs();
            }
            int num =(int)(Math.random()*100000000);
            for (int i = 0; i < index; i++) {
               // x坐标,y坐标,宽度,高度
               int cw = i*cWidth;
               image = source.getSubimage(cw,0,cWidth,height);
               String fileName = AppConst.UPLOAD_PATH + "/"+name+"_"+num+"_"+i+ "."+suffix;
               file = new File(fileName);
               ImageIO.write(image,"PNG", file);
               list.add(file);
            }
         }
      } catch (IOException e) {
         e.printStackTrace();
      }
      return list;
   }

   /**
    * 上传文件
    * @param file
    * @return
    */
   public static File uploadFile(MultipartFile file) {
      //1.文件后缀过滤,只允许部分后缀
      //文件的完整名称,如spring.jpeg
      String filename = file.getOriginalFilename();
      //文件名,如spring
      String name = filename.substring(0, filename.indexOf("."));
      //文件后缀,如.jpeg
      String suffix = filename.substring(filename.lastIndexOf("."));
      String allowSuffix = ".bmp.jpg.jpeg.png.gif.pdf.doc.zip.rar.gz";
      if (allowSuffix.indexOf(suffix) == -1) return null;
      //创建年月文件夹
      Calendar date = Calendar.getInstance();
      File dateDirs = new File(date.get(Calendar.YEAR)
            + File.separator + (date.get(Calendar.MONTH) + 1));

      //目标文件
      File descFile = new File(AppConst.UPLOAD_PATH + File.separator + dateDirs + File.separator + filename);
      int i = 1;
      //若文件存在重命名
      String newFilename = filename;
      while (descFile.exists()) {
         newFilename = name + "(" + i + ")" + suffix;
         String parentPath = descFile.getParent();
         descFile = new File(parentPath + File.separator + newFilename);
         i++;
      }
      //判断目标文件所在的目录是否存在
      if (!descFile.getParentFile().exists()) {
         //如果目标文件所在的目录不存在,则创建父目录
         descFile.getParentFile().mkdirs();
      }
      //3.存储文件
      try {
         file.transferTo(descFile);
      } catch (Exception e) {
         e.printStackTrace();
      }
      return  descFile;
   }
}