java多图片上传--前端实现预览
前端代码:
https://pan.baidu.com/s/1cqKbmjBSXOhFX4HR1XGkyQ
解压后:
java后台:
commons-fileupload commons-fileupload 1.2.1 commons-io commons-io 1.4
图片压缩:需要倒入下面的依赖:
net.coobird thumbnailator 0.4.8
package com.zhl.push.controller;import com.alibaba.fastjson.JSON;import net.coobird.thumbnailator.Thumbnails;import org.apache.commons.fileupload.FileItem;import org.apache.commons.fileupload.FileUploadBase;import org.apache.commons.fileupload.ProgressListener;import org.apache.commons.fileupload.disk.DiskFileItemFactory;import org.apache.commons.fileupload.servlet.ServletFileUpload;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.RestController;import org.springframework.web.multipart.MultipartFile;import javax.servlet.http.HttpServletRequest;import java.io.File;import java.io.FileOutputStream;import java.io.InputStream;import java.text.SimpleDateFormat;import java.util.*;/** * @Author * @ClassName FileUpload * @Description TODO * @Date 2018/11/8 14:53 * @Version 1.0 */@RestController@RequestMapping("/file")public class FileUpload { @RequestMapping("/upload") //requestParam要写才知道是前台的那个数组 public String filesUpload(@RequestParam("files") MultipartFile[] files, HttpServletRequest request) { File targetFile=null; String msg="";//返回存储路径 List imgList=new ArrayList(); if (files!=null && files.length>0) { for (int i = 0; i < files.length; i++) { String fileName=files[i].getOriginalFilename();//获取文件名加后缀 if(fileName!=null&&fileName!=""){ String filela = fileName.substring(fileName.lastIndexOf("."), fileName.length());//文件后缀 String filef= fileName.substring(0,fileName.lastIndexOf("."));//文件前缀 fileName=filef+new Date().getTime()+"_"+new Random().nextInt(1000)+filela;//新的文件名 SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd", Locale.CHINA); String fileAdd = dateFormat.format(new Date()); //文件的保存路径 String addr="E:\\front\\fileUpload\\tinyImgUpload-master"+"/"+fileAdd; File file1 =new File(addr); //如果文件夹不存在则创建 if(!file1 .exists() && !file1 .isDirectory()){ file1 .mkdir(); } targetFile = new File(file1, fileName); try { //图片压缩并输出到指定文件夹: Thumbnails.of(files[i].getInputStream()).size(50,50).toFile(new File(file1,fileName)); // 如果不使用图片压缩直接保存:// files[i].transferTo(targetFile); //返回当前服务器存储路径,
msg=addr+"/"+fileName;
imgList.add(msg); } catch (Exception e) { e.printStackTrace(); } } } } return JSON.toJSONString(imgList); } }
封装成工具类使用:
package com.zhl.push.utils;import com.alibaba.fastjson.JSON;import net.coobird.thumbnailator.Thumbnails;import org.springframework.web.multipart.MultipartFile;import java.io.File;import java.text.SimpleDateFormat;import java.util.*;public class FileUploadUtil { /** * @Author * @Description //TODO 多文件上传工具类 * @Date 2018/11/9 13:42 * @Param files:接受前端传过来的文件数组 * saveUrl:上传文件的保存路径 * @return */ public static String filesUpload(MultipartFile[] files,String saveUrl) { File targetFile=null; String msg="";//返回存储路径 List imgList=new ArrayList(); //返回所有上传成功的图片路径 if (files!=null && files.length>0) { for (int i = 0; i < files.length; i++) { String fileName=files[i].getOriginalFilename();//获取文件名加后缀 if(fileName!=null&&fileName!=""){ String filela = fileName.substring(fileName.lastIndexOf("."), fileName.length());//文件后缀 String filef= fileName.substring(0,fileName.lastIndexOf("."));//文件前缀 fileName=filef+new Date().getTime()+"_"+new Random().nextInt(1000)+filela;//新的文件名 //fileAdd:以当前时间创建保存的文件夹名称 SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd", Locale.CHINA); String fileAdd = dateFormat.format(new Date()); //文件的保存路径// String addr="E:\\front\\fileUpload\\tinyImgUpload-master"+"/"+fileAdd; String addr=saveUrl+"/"+fileAdd; File file1 =new File(addr); //如果文件夹不存在则创建 if(!file1 .exists() && !file1 .isDirectory()){ file1 .mkdir(); } targetFile = new File(file1, fileName); try { //图片压缩后保存: Thumbnails.of(files[i].getInputStream()).size(80,80).toFile(new File(file1,fileName)); //不压缩直接保存// files[i].transferTo(targetFile); //返回当前服务器存储路径, msg=addr+"/"+fileName; imgList.add(msg); } catch (Exception e) { e.printStackTrace(); } } } } return JSON.toJSONString(imgList); }}
图片压缩 、图片缩放,区域裁剪,水印,旋转,保持比例。
图片处理是当今软件开发中非常重要的一环,然而处理图片的开源框架却并不多。现金网上流传的Java处理图片的代码,虽然可对图片进行简单处理,但效果并不理想。虽然也有些其他解决方案,但都摆脱不了繁琐,使用起来十分不方便。
为了解决这个问题,我也是在网上找了好久,看了很多资料,功夫不负有心人,最终找到了一个处理图片十分棒的开源框架。特此拿出来与大家分享。
Thumbnailator 是一个优秀的图片处理的Google开源Java类库。处理效果远比Java API的好。从API提供现有的图像文件和图像对象的类中简化了处理过程,两三行代码就能够从现有图片生成处理后的图片,且允许微调图片的生成方式,同时保持了需要写入的最低限度的代码量。还支持对一个目录的所有图片进行批量处理操作。
支持的处理操作:图片缩放,区域裁剪,水印,旋转,保持比例。
另外值得一提的是,Thumbnailator至今仍不断更新,怎么样,感觉很有保障吧!
Thumbnailator官网:http://code.google.com/p/thumbnailator/
下面我们介绍下如何使用Thumbnailator
缩略图压缩文件jar包:
net.coobird thumbnailator 0.4.8
1、指定大小进行缩放
//size(宽度, 高度) /* * 若图片横比200小,高比300小,不变 * 若图片横比200小,高比300大,高缩小到300,图片比例不变 * 若图片横比200大,高比300小,横缩小到200,图片比例不变 * 若图片横比200大,高比300大,图片按比例缩小,横为200或高为300 */Thumbnails.of("images/a380_1280x1024.jpg") .size(200, 300) .toFile("c:/a380_200x300.jpg"); Thumbnails.of("images/a380_1280x1024.jpg") .size(2560, 2048) .toFile("c:/a380_2560x2048.jpg");
2、按照比例进行缩放
//scale(比例)Thumbnails.of("images/a380_1280x1024.jpg") .scale(0.25f) .toFile("c:/a380_25%.jpg"); Thumbnails.of("images/a380_1280x1024.jpg") .scale(1.10f) .toFile("c:/a380_110%.jpg");
3、不按照比例,指定大小进行缩放
//keepAspectRatio(false)默认是按照比例缩放的Thumbnails.of("images/a380_1280x1024.jpg") .size(200,200) .keepAspectRatio(false) .toFile("c:/a380_200x200.jpg");
4、旋转
//rotate(角度),正数:顺时针负数:逆时针Thumbnails.of("images/a380_1280x1024.jpg") .size(1280,1024) .rotate(90) .toFile("c:/a380_rotate+90.jpg"); Thumbnails.of("images/a380_1280x1024.jpg") .size(1280,1024) .rotate(-90) .toFile("c:/a380_rotate-90.jpg");
5、水印:
//watermark(位置,水印图,透明度)Thumbnails.of("images/a380_1280x1024.jpg") .size(1280,1024) .watermark(Positions.BOTTOM_RIGHT,ImageIO.read(newFile("images/watermark.png")),0.5f) .outputQuality(0.8f) .toFile("c:/a380_watermark_bottom_right.jpg"); Thumbnails.of("images/a380_1280x1024.jpg") .size(1280,1024) .watermark(Positions.CENTER,ImageIO.read(newFile("images/watermark.png")),0.5f) .outputQuality(0.8f) .toFile("c:/a380_watermark_center.jpg");
6、裁剪
//sourceRegion() //图片中心400*400的区域Thumbnails.of("images/a380_1280x1024.jpg") .sourceRegion(Positions.CENTER,400,400) .size(200,200) .keepAspectRatio(false) .toFile("c:/a380_region_center.jpg"); //图片右下400*400的区域Thumbnails.of("images/a380_1280x1024.jpg") .sourceRegion(Positions.BOTTOM_RIGHT,400,400) .size(200,200) .keepAspectRatio(false) .toFile("c:/a380_region_bootom_right.jpg"); //指定坐标Thumbnails.of("images/a380_1280x1024.jpg") .sourceRegion(600,500,400,400) .size(200,200) .keepAspectRatio(false) .toFile("c:/a380_region_coord.jpg");
7、转化图像格式
//outputFormat(图像格式)Thumbnails.of("images/a380_1280x1024.jpg") .size(1280,1024) .outputFormat("png") .toFile("c:/a380_1280x1024.png"); Thumbnails.of("images/a380_1280x1024.jpg") .size(1280,1024) .outputFormat("gif") .toFile("c:/a380_1280x1024.gif");