多图片上传,涉及图片的压缩处理(未完)

来源:互联网 发布:通达信选股源码 编辑:程序博客网 时间:2024/05/17 03:40
//多图片上传处理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());  //定义文件的输出路径
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);
}

}




http://blog.csdn.net/hanshileiai/article/details/6718375


原创粉丝点击