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

前端代码:

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

解压后:

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

java多图片上传--前端实现预览--图片压缩 、图片缩放,区域裁剪,水印,旋转,保持比例。的更多相关文章

  1. 图片上传(前端显示预览,后端php接收)

    html: <form action="{:Url('do_ls_law_upload')}" method="POST" accept-charset= ...

  2. web 图片上传实现本地预览

    在说上传之前先说说如何替换or美化浏览器自带的简陋上传按钮(自定义自己的上传按钮 如:img): 1.将自定义上传按钮上方添加 input file 框,实现input实现透明处理. 2.对自定义上传 ...

  3. jsp+springmvc实现文件上传、图片上传和及时预览图片

    1.多文件上传:http://blog.csdn.net/a1314517love/article/details/24183273 2.单文件上传的简单示例:http://blog.csdn.net ...

  4. 分离与继承的思想实现图片上传后的预览功能:ImageUploadView

    本文要介绍的是网页中常见的图片上传后直接在页面生成小图预览的实现思路,考虑到该功能有一定的适用性,于是把相关的逻辑封装成了一个ImageUploadView组件,实际使用效果可查看下一段的git效果图 ...

  5. 图片上传前的预览(PHP)

    1.先创建一个file表单域,我们需要用它来浏览本地文件.<form name="form1" id="form1" method="post& ...

  6. jquery实现图片上传前本地预览

    <!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8" ...

  7. file图片上传之前先预览

    链接:https://www.cnblogs.com/tandaxia/p/5125275.html 记得以前做网站时,曾经需要实现一个图片上传到服务器前,先预览的功能.当时用html的<inp ...

  8. js实现图片上传后即时预览

    //关于FileReader对象 http://blog.csdn.net/zk437092645/article/details/8745647 <!DOCTYPE html> < ...

  9. Asp.net中FileUpload控件实现图片上传并带预览显示

    单一图片上传——“选择”+“上传”,.NET默认模式: 1.实现原理:     采用FileUpload控件默认的使用方式,先由“选择”按钮选择图片,然后单击“上传”按钮完成上传,并可在“上传”按钮的 ...

随机推荐

  1. 模块简介:(random)(xml,json,pickle,shelve)(time,datetime)(os,sys)(shutil)(pyYamal,configparser)(hashlib)

    Random模块: #!/usr/bin/env python #_*_encoding: utf-8_*_ import random print (random.random()) #0.6445 ...

  2. day4-python基础-小数据池以及深浅copy浅讲

    今天的目录是 1.小数据池 2.深浅copy 正文开始 1.小数据池 在说明今天的内容前,先说明一个在今天重复用到的一个知识点 ###比较’=’俩边的数据是否完全相同,以及判断一个对象的内存地址是否完 ...

  3. Java MultipartFile 使用记录

    private void file(String path,MultipartFile file){ String separator = "/"; String originFi ...

  4. C#7.0中的解构功能---Deconstruct

    解构元组 C#7.0新增了诸多功能,其中有一项是新元组(ValueTuple),它允许我们可以返回多个值,并且配合解构能更加方便的进行工作,如下面例子 static void Main(string[ ...

  5. Generative Adversarial Nets[BEGAN]

    本文来自<BEGAN: Boundary Equilibrium Generative Adversarial Networks>,时间线为2017年3月.是google的工作. 作者提出 ...

  6. 在物理内存中观察CLR托管内存及GC行为

    虽然看了一些书,还网络上的一些博文,不过对CLR托管内存细节依然比较模糊.而且因为工作原因总会有很多质疑,想要亲眼看到内存里二进制数据的变化. 所以借助winhex直接查看内存以证实书上的描述或更进一 ...

  7. 即将发布的 ASP.NET Core 2.2 会有哪些新玩意儿?

    今年 6 月份的时候时候 .NET 团队就在 GitHub 公布了 ASP.NET Core 2.2 版本的 Roadmap(文末有链接),而前两天 ASP.NET Core 2.2 预览版 2 已经 ...

  8. Sublime 禁止自动升级

    打开SUblime   Prefreences  找到"设置-用户" 添加 "update_check":false, 即可禁用默认升级 此时完整如下 { &q ...

  9. 如何搭建SVN的客户端和使用

    1.下载安装TortoiseSVN 首先我们需要从官方网站下载TortoiseSVN客户端工具 可以选择32位和64位.也可以直接使用搜索引擎搜索TortoiseSVN 也会出现直接的下载方式.这里不 ...

  10. java valueOf()函数

    valueOf() 方法用于返回给定参数的原生 Number 对象值,参数可以是原生数据类型, String等. 该方法是静态方法.该方法可以接收两个参数一个是字符串,一个是基数. 语法 该方法有以下 ...