//多圖片上傳處理
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.coobirdthumbnailator0.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()); //定義文件的輸出路徑
//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