No Description

ImageService.java 9.6KB

    package com.ekexiu.portal.service; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.sql.SQLException; import java.util.concurrent.TimeUnit; import org.jfw.apt.web.annotation.Path; import org.jfw.apt.web.annotation.operate.Get; import org.jfw.apt.web.annotation.operate.Post; import org.jfw.util.JpgUtil; import org.jfw.util.StringUtil; import org.jfw.util.codec.Base64; import org.jfw.util.context.JfwAppContext; import org.jfw.util.exception.JfwBaseException; import org.jfw.util.io.IoUtil; @Path("/image") public class ImageService { private File tmpPath; private File imagePath; private File headPath; private File orgPath; private File resourcePath; private int largeHeadPhotoWidth = 200; private int largeHeadPhotoHeight = 200; private int middleHeadPhotoWidth = 200; private int middleHeadPhotoHeight = 200; private int smallHeadPhotoWidth = 200; private int smallHeadPhotoHeight = 200; private File defaultHeadPhoto; private File defaultOrgLogo; private File defaultResourcePhoto; private byte[] dli; private byte[] dmi; private byte[] dsi; private byte[] dol; private byte[] dsl; public File getDefaultHeadPhoto() { return defaultHeadPhoto; } public void setDefaultHeadPhoto(File defaultHeadPhoto) { this.defaultHeadPhoto = defaultHeadPhoto; } public File getDefaultOrgLogo() { return defaultOrgLogo; } public void setDefaultOrgLogo(File defaultOrgLogo) { this.defaultOrgLogo = defaultOrgLogo; } public File getTmpPath() { return tmpPath; } public void setTmpPath(File tmpPath) { this.tmpPath = tmpPath; } public File getImagePath() { return imagePath; } public void setImagePath(File imagePath) { this.imagePath = imagePath; this.headPath = new File(this.imagePath, "head"); this.orgPath = new File(this.imagePath, "org"); this.resourcePath = new File(this.resourcePath, "resource"); } public int getLargeHeadPhotoWidth() { return largeHeadPhotoWidth; } public void setLargeHeadPhotoWidth(int largeHeadPhotoWidth) { this.largeHeadPhotoWidth = largeHeadPhotoWidth; } public int getLargeHeadPhotoHeight() { return largeHeadPhotoHeight; } public void setLargeHeadPhotoHeight(int largeHeadPhotoHeight) { this.largeHeadPhotoHeight = largeHeadPhotoHeight; } public int getMiddleHeadPhotoWidth() { return middleHeadPhotoWidth; } public void setMiddleHeadPhotoWidth(int middleHeadPhotoWidth) { this.middleHeadPhotoWidth = middleHeadPhotoWidth; } public int getMiddleHeadPhotoHeight() { return middleHeadPhotoHeight; } public void setMiddleHeadPhotoHeight(int middleHeadPhotoHeight) { this.middleHeadPhotoHeight = middleHeadPhotoHeight; } public int getSmallHeadPhotoWidth() { return smallHeadPhotoWidth; } public void setSmallHeadPhotoWidth(int smallHeadPhotoWidth) { this.smallHeadPhotoWidth = smallHeadPhotoWidth; } public int getSmallHeadPhotoHeight() { return smallHeadPhotoHeight; } public void setSmallHeadPhotoHeight(int smallHeadPhotoHeight) { this.smallHeadPhotoHeight = smallHeadPhotoHeight; } public File getTmpDir() { return tmpPath; } public void setTmpDir(File tmpPath) { this.tmpPath = tmpPath; } public File getDefaultResourcePhoto() { return defaultResourcePhoto; } public void setDefaultResourcePhoto(File defaultResourcePhoto) { this.defaultResourcePhoto = defaultResourcePhoto; } @Post @Path("/saveHead") public boolean saveImage(String id, String base64) throws IOException { Base64 bs64 = new Base64(); byte[] bs = bs64.decode(base64.getBytes("UTF-8")); String fileName=this.headPath+"/"+id+".jpg"; FileOutputStream fos = new FileOutputStream(fileName); fos.write(bs); fos.flush(); fos.close(); return true; } /** * 判断是否有专家头像 * @param id 专家ID * @return 有头像返回1,没有返回0. */ public int hasProfessorImage(String id) { String headPath = this.headPath+"/"+id+"_l.jpg"; File file = new File(headPath); if(file.exists()){ return 1; }else{ return 0; } } private File getTemplateFielName(File path, String suffix) { File result = null; while (result == null) { String fn = StringUtil.buildUUID() + ".jpg"; result = new File(path, fn); if (result.exists()) result = null; } return result; } private void saveJpg(File file, byte[] data, int w, int h) throws IOException { ByteArrayInputStream in = new ByteArrayInputStream(data); FileOutputStream out = new FileOutputStream(file); try { JpgUtil.zoom(in, out, w, h); } finally { out.flush(); out.close(); } } private byte[] zoomImage(byte[] src, int w, int h) throws IOException { ByteArrayInputStream in = new ByteArrayInputStream(src); ByteArrayOutputStream out = new ByteArrayOutputStream(); JpgUtil.zoom(in, out, w, h); out.flush(); return out.toByteArray(); } private byte[] readTmpFile(String fn) throws JfwBaseException { File file = new File(this.tmpPath, fn); if (!file.exists()) throw new JfwBaseException(90, "head photo not exists"); try { InputStream in = new FileInputStream(file); ByteArrayOutputStream out = new ByteArrayOutputStream(); IoUtil.copy(in, out, true, true); return out.toByteArray(); } catch (IOException e) { throw new JfwBaseException(91, "read temp head photo error", e); } } @Path("/headPhoto/preview") @Get public String[] preview(int left, int right, int top, int bottom, String fn) throws JfwBaseException { byte[] fileData = this.readTmpFile(fn); try { ByteArrayOutputStream out = new ByteArrayOutputStream(); JpgUtil.cutByPerCent(new ByteArrayInputStream(fileData), out, top, bottom, left, right); fileData = out.toByteArray(); } catch (IOException e) { throw new JfwBaseException(0, "cart image error", e); } File small = this.getTemplateFielName(this.tmpPath, ".jpg"); File middle = this.getTemplateFielName(this.tmpPath, ".jpg"); File large = this.getTemplateFielName(this.tmpPath, ".jpg"); try { this.saveJpg(small, fileData, this.smallHeadPhotoWidth, this.smallHeadPhotoHeight); this.saveJpg(middle, fileData, this.middleHeadPhotoWidth, this.middleHeadPhotoHeight); this.saveJpg(large, fileData, this.largeHeadPhotoWidth, this.largeHeadPhotoHeight); } catch (IOException e) { small.delete(); middle.delete(); large.delete(); throw new JfwBaseException(92, "save tmp file error", e); } final String[] files = new String[] { small.getAbsolutePath(), middle.getAbsolutePath(), large.getAbsolutePath() }; JfwAppContext.getScheduledExecutorService().schedule(new Runnable() { @Override public void run() { for (String file : files) { new File(file).delete(); } } }, 30, TimeUnit.MINUTES); return new String[] { small.getName(), middle.getName(), large.getName() }; } private void initDefaultImage() { if (this.dli != null) return; synchronized (this) { if (this.dli != null) return; try { byte[] dd = IoUtil.readStream(new FileInputStream(this.defaultHeadPhoto), true); this.dli = this.zoomImage(dd, this.largeHeadPhotoWidth, this.largeHeadPhotoHeight); this.dmi = this.zoomImage(dd, this.middleHeadPhotoWidth, this.middleHeadPhotoHeight); this.dsi = this.zoomImage(dd, this.smallHeadPhotoWidth, this.smallHeadPhotoHeight); this.dol = IoUtil.readStream(new FileInputStream(this.defaultOrgLogo), true); this.dsl = IoUtil.readStream(new FileInputStream(this.defaultResourcePhoto), true); } catch (IOException e) { this.dli = null; this.dmi = null; this.dsi = null; this.dol = null; this.dsl = null; throw new RuntimeException("init image error", e); } } } public void saveDefaultHeadImage(String id) throws IOException { this.initDefaultImage(); IoUtil.saveStream(new FileOutputStream(new File(this.headPath, id + "_s.jpg")), dsi, true); IoUtil.saveStream(new FileOutputStream(new File(this.headPath, id + "_m.jpg")), dmi, true); IoUtil.saveStream(new FileOutputStream(new File(this.headPath, id + "_l.jpg")), dli, true); } public void saveDefaultOrgLogo(String id) throws IOException { this.initDefaultImage(); IoUtil.saveStream(new FileOutputStream(new File(this.orgPath, id + ".jpg")), this.dol, true); } public void saveDefaultResourcePhoto(String resourceId) throws IOException { this.initDefaultImage(); IoUtil.saveStream(new FileOutputStream(new File(this.resourcePath, resourceId + ".jpg")), this.dsl, true); } @Post @Path("/org") public void saveOrgLogo(String id, String fn) throws IOException { InputStream in = new FileInputStream(new File(this.tmpPath, fn)); try { IoUtil.copy(in, new FileOutputStream(new File(this.orgPath, id + ".jpg")), false, true); } finally { in.close(); } } @Post @Path("/head") public void saveHeadPhoto(String id, String fn,int x,int y,int w,int h) throws JfwBaseException, SQLException, IOException { byte[] src = this.readTmpFile(fn); src = JpgUtil.read(src); ByteArrayOutputStream os = new ByteArrayOutputStream(); JpgUtil.cutByPerCent(new ByteArrayInputStream(src), os, x, y, w, h); src = os.toByteArray(); byte[] li = this.zoomImage(src, this.largeHeadPhotoWidth, this.largeHeadPhotoHeight); byte[] mi = this.zoomImage(src, this.middleHeadPhotoWidth, this.middleHeadPhotoHeight); byte[] si = this.zoomImage(src, this.smallHeadPhotoWidth, this.smallHeadPhotoHeight); IoUtil.saveStream(new FileOutputStream(new File(this.headPath, id + "_s.jpg")), si, true); IoUtil.saveStream(new FileOutputStream(new File(this.headPath, id + "_m.jpg")), mi, true); IoUtil.saveStream(new FileOutputStream(new File(this.headPath, id + "_l.jpg")), li, true); } }