java多图片上传--前端实现预览

前端代码:

https://pan.baidu.com/s/1cqKbmjBSXOhFX4HR1XGkyQ

 解压后:

java 图片上传压缩 hutool java实现图片压缩_java 图片上传压缩 hutool

 

java后台:

 


<!--文件上传-->
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.2.1</version>
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>1.4</version>
        </dependency>

 

 

 

 图片压缩:需要倒入下面的依赖:


<!-- 图片缩略图 -->
            <dependency>
                <groupId>net.coobird</groupId>
                <artifactId>thumbnailator</artifactId>
                <version>0.4.8</version>
            </dependency>


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包:


<!-- 图片缩略图 -->
            <dependency>
                <groupId>net.coobird</groupId>
                <artifactId>thumbnailator</artifactId>
                <version>0.4.8</version>
            </dependency>



 

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");