//多图片上传处理
public @ResponseBody String personInsure(HttpServletRequest request, @RequestParam("files") MultipartFile[] files,String policyFormerNo, String mobile, String ifCancelInsure){
//图片文件不能为null
if(files!=null&& files.length()>0){
//定义后缀
String suffix=".jpg";
//定义总大小标识
int totalSize=0;
//定义数组,将文件放入数组中
List
listf=new ArrayList
();
//循环图片,
for(MultipartFile f : file){
//根据现在的毫秒数创建一个.jPG格式的文件
String prefix=String.valueOf(DaateUtils.getMillis()); //前缀
File file=File.createTempFile(prefix,suffix);
//将MultipartFile转换成File文件、图片
f.transferTo(file);
//获取图片的绝对路径,以便下面压缩使用
String FileNamePreffix=file.getAbsolutePath().substring(0,file.getAbsolutePath().lastIndexOf("."));
//判断当前的file图片的大小是否满足 约定的文件大小
if(file.length()>100*1024){
//不满足,压缩图片,将压缩完的图片放回原路径
cutImg(file,fileNamePreffix.suffix,0.9);
}
listf.add(file);//添加到集合
//将图片的大小从String类型转换成Integer类型,计算图片的总大小
Integer in=Integer.valueOf(String.valueOf(file.length()));
totalSize+=in;
}
//判断图片的总大小是否超过预定上传的大小
if(totalSize+>2000*1024){ //上传图片的总大小不能超过200M
//压缩后还是超过规定的大小,返回提示
return;
}
//下面上传图片至服务器
//为了优化上传,先将图片进行压缩
//创建压缩文件存储名称以 .zip 结尾
String prefix = String.valueOf(DateUtils.getMillis());
File file=File.createTemFile("prefix",".zip");
FileOutputStream fileOutputStream=new FileOutputStream(file);//定义输出流
ZipOutputStream zipOutputStream=new ZipOutputStream(fileOutputStream);//定义压缩流
FileInputStream fileInputStream=null;//声明输入流
BufferedInputStream bufferInputStream=null;
byte[] byte=new byte[2000*1024];//创建用于存放数据的数组
//判断集合是否为空
if(listf!=null&&!listf.isEmpty()){
for(File files:listf){
//创建一个以System.currentTimeMillis() + suffix为名称的子文件
ZipEntry zipEntry=new ZipEntry(System.currentTimeMillis() + suffix);
//创建压缩的子文件,每一个子文件使用ZipEntry表示
zipOutputStream.putNextEntry(zipEntry);
//定义输入流对象
fileInputStream=new fileInputStream(files);
//创建具有指定缓冲区的bufferInputStream,并保存其参数
bufferInputStream=new bufferInputStream(fileInputStream,2000*1024);
int temp=0;
//读取内容
while((temp=bufferInputStream.read(byte,0,1024*2000))!=-1){
zipOutputStream.write(byte,0,temp);
}
files.delete();
}
}
//下面通过自己项目的接口将file作为参数,传到其他平台
}
}
//压缩图片
public void cutImg(File fiel,String FileNamePreffix,String suffix,double scale){
if(scale<=0){
return;//压缩比例<=0,返回
}
Thumbnails.of(file).scale(scale).outputFormat("jpg").toFile("fileNamePreffix");//按比例缩放,至fileNamePreffix路径下
//再次读取次路径下的图片,获取大小,不满足继续压缩
file=new File(fileNamePreffix+suffix);
if(file.length()>100*1024){
scale-=0.1;//缩放比例-0.1
cutImg(file,fileNamePreffix,suffix,scale);//递归
}
}
// Java图片处理 Thumbnails框架
第一步:导入maven的jar包
net.coobird
thumbnailator
0.4.8
第二步:直接在方法中调用:如Thumbnails.of(file).scale(scale).outputFormat("jpg").toFile("fileNamePreffix");
//下面是操作图片的各种方法,有的是借鉴别人的成果
加载图片源:Thumbnails.of(file)
1. File file = new File("/Users/qiangzi/data/img","beauty.jpg");
2. Builder
builder = Thumbnails.of(file);
缩放:
1. builder = builder.scale(0.9); //参数是浮点数,大于1表示放大,小于1表示缩小
质量压缩:
1. builder.outputQuality(0.9); //参数是浮点数,0-1之间
剪裁:
1. builder.sourceRegion(100, 100, 300, 300);
2. builder.sourceRegion(Positions.CENTER, 200, 200);
根据宽度来缩放:
1. builder.width(500);
根据高度来缩放:
1. builder.height(500);
在调整尺寸时保持比例:
1. builder.keepAspectRatio(true); //默认为true,如果要剪裁到特定的比例,设为false即可
根据宽度和高度进行缩放:
1. builder.size(600, 700);
2. //如果设置了keepAspectRatio(true),将按比例进行缩放,否则将强制按尺寸输出
3. 缩放策略:
4. 如果宽度缩放比>高度缩放比就以宽度来缩放,反之以高度缩放
将图片放入内存:
1. File file2 = new File("/Users/qiangzi/data/img","logo.png");
2. BufferedImage bufferedImage = Thumbnails.of(file2).scale(1.0).outputQuality(1.0).asBufferedImage();
3. *必须要指定scale
加水印:
1. builder.watermark(Positions.BOTTOM_RIGHT, bufferedImage, 1.0f);
2. //第一个参数是加水印的位置
3. //第二个参数是要加水印的图片
4. //第三个参数是水印图片的透明度
5. 经过测试:gif图片的彩色会变成黑白,所以尽量使用jpg或png图片吧
输出图片,不管对图片进行什么操作,只有输出才能看到效果:
1. builder.toFile(File file);
*注意:scale、width|height、size三者不能同时共存,但必须要有一个
转化图像格式
/**
* outputFormat(图像格式)
*/
Thumbnails.of("images/test.jpg").size(1280, 1024).outputFormat("png").toFile("C:/image_1280x1024.png");
Thumbnails.of("images/test.jpg").size(1280, 1024).outputFormat("gif").toFile("C:/image_1280x1024.gif");
案例:
1. //将原图缩放到宽度为500,压缩质量90%
2. Thumbnails.of(file).width(500).outputQuality(0.9).toFile(file);
3. //将原图按比例缩放,最宽300,最高400,不进行质量压缩
4. Thumbnails.of(file).size(300, 400).outputQuality(1.0).toFile(file);
//下面是解压的,注意文件的名称不能是中文,否则会异常。
//解压
//读取压缩文件
File file=new File("C:\\Users\\Administrator\\AppData\\Local\\Temp\\Excel.zip");
System.out.println(file.getName());
File file2=null;
//实例化ZipFile对象
ZipFile zipFile=new ZipFile(file);
System.out.println(zipFile.getName());// Excel.zip
//创建文件流
FileInputStream fileInputStream=new FileInputStream(file);
ZipInputStream zipInputStream=new ZipInputStream(fileInputStream);
//每一个压缩实体
ZipEntry entry=null;
while ((entry=zipInputStream.getNextEntry())!=null) {//得到一个压缩实体
file2=new File("C:\\\\Users\\\\Administrator\\\\AppData\\\\Local\\\\Temp\\\\"+entry.getName()); //定义文件的输出路径
//读取压缩文件
File file=new File("C:\\Users\\Administrator\\AppData\\Local\\Temp\\Excel.zip");
System.out.println(file.getName());
File file2=null;
//实例化ZipFile对象
ZipFile zipFile=new ZipFile(file);
System.out.println(zipFile.getName());// Excel.zip
//创建文件流
FileInputStream fileInputStream=new FileInputStream(file);
ZipInputStream zipInputStream=new ZipInputStream(fileInputStream);
//每一个压缩实体
ZipEntry entry=null;
while ((entry=zipInputStream.getNextEntry())!=null) {//得到一个压缩实体
file2=new File("C:\\\\Users\\\\Administrator\\\\AppData\\\\Local\\\\Temp\\\\"+entry.getName()); //定义文件的输出路径
System.out.println("entry.getName():"+entry.getName());
//entry.getName():Excel/WEIXIN_20170619.xls
//entry.getName():Excel/WEIXIN_201709.xls
//创建文件夹
if(!file2.getParentFile().exists()) { //返回此抽象路径名父目录的抽象路径名;如果此路径名没有指定父目录,则返回 null。
file2.getParentFile().mkdir();
}
if(!file2.exists()) {
file2.createNewFile();//创建文件
}
InputStream inputStream=zipFile.getInputStream(entry);//得到每一个实体的输入流
OutputStream outputStream=new FileOutputStream(file2);//实例化文件输出流
int temp=0;
while ((temp=inputStream.read())!=-1) {
outputStream.write(temp);
}
}
//entry.getName():Excel/WEIXIN_201709.xls
//创建文件夹
if(!file2.getParentFile().exists()) { //返回此抽象路径名父目录的抽象路径名;如果此路径名没有指定父目录,则返回 null。
file2.getParentFile().mkdir();
}
if(!file2.exists()) {
file2.createNewFile();//创建文件
}
InputStream inputStream=zipFile.getInputStream(entry);//得到每一个实体的输入流
OutputStream outputStream=new FileOutputStream(file2);//实例化文件输出流
int temp=0;
while ((temp=inputStream.read())!=-1) {
outputStream.write(temp);
}
}
http://blog.csdn.net/hanshileiai/article/details/6718375