• 基于cxf的app文件上传接口(带回显功能)


    1.SaleImpl

    @Override
        public String uploadPic(final List<Attachment> attachments) {
            return this.filterException(new MethodCallBack() {
                
                @Override
                public String doProcessMethod() throws Exception {
                    List<FileUploadVo> fileVos = transform2FileUploadVo(attachments);
                    String rs = nhSalePerformancePicIService.saveUploadPic(fileVos);
                    return rs;
                }
            });
        }

    这里的实体 Attachment 类是cxf提供的附件类  org.apache.cxf.jaxrs.ext.multipart.Attachment

    2.附件转换方法 transform2FileUploadVo   BaseWsServer.java

    package cn.maitian.newhouse.framework.core.base.ws;
    
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.Date;
    import java.util.List;
    
    import javax.activation.DataHandler;
    
    import org.apache.cxf.jaxrs.ext.multipart.Attachment;
    import org.apache.cxf.message.Message;
    import org.apache.cxf.phase.PhaseInterceptorChain;
    import org.apache.log4j.Logger;
    
    import cn.maitian.core.persistence.db.JugHelper;
    import cn.maitian.newhouse.framework.core.base.bean.MethodCallBack;
    import cn.maitian.newhouse.framework.core.base.bean.WsResultJson;
    import cn.maitian.newhouse.framework.core.base.vo.FileUploadVo;
    import cn.maitian.newhouse.framework.core.exception.AppClientException;
    import cn.maitian.newhouse.framework.core.exception.AppSysException;
    import cn.maitian.newhouse.framework.core.i18n.IAppPropertiesMsg;
    import cn.maitian.newhouse.framework.core.util.AppFileUploadUtils;
    import cn.maitian.newhouse.framework.system.model.NhAttachment;
    
    /**
     * WebService服务端基础类
     * 
     * @author LXINXIN
     * @company MAITIAN
     * @version 1.0
     */
    public class BaseWsServer {
    
        /**
         * 日志
         */
        protected final Logger logger = Logger.getLogger(getClass());
    
        /**
         * 处理客服端异常信息
         */
        private IAppPropertiesMsg appExceptionClientMsg;
    
        /**
         * 处理系统端异常信息
         */
        private IAppPropertiesMsg appExceptionSystemMsg;
    
        /**
         * 过滤文本格式
         */
        final static String[] TEXT_TYPE = new String[] { "text/plain", "text/plain;charset=utf-8" };
    
        /**
         * <h1>统一处理异常和记录日志</h1>
         *
         * @param callback
         *            MethodCallBack 通过doProcessMethod进行逻辑的处理
         * @return ResultJson
         */
        public String filterException(MethodCallBack callback) {
            String msg = "";
            String code = "";
            try {
                // 获取拦截器message内容
                Message message = PhaseInterceptorChain.getCurrentMessage();
                AppSysException se = message.getContent(AppSysException.class);
                // 内容不为空,则证明拦截器异常,抛出异常信息
                if (se != null) {
                    // 不要再注释掉提交到CVS上了,个人调试可以注释掉
                    throw se;
                }
                return callback.doProcessMethod();
            } catch (AppClientException ce) {
                ce.printStackTrace();
                logger.error(ce);
                code = ce.getCode();
                String[] params = ce.getParams();
                msg = appExceptionClientMsg.getMessage(code, params);
            } catch (AppSysException se) {
                se.printStackTrace();
                logger.error(se);
                code = se.getCode();
                String[] params = se.getParams();
                msg = appExceptionSystemMsg.getMessage(code, params);
            } catch (Exception e) {
                e.printStackTrace();
                logger.error(e);
                code = "CE900000";
                msg = appExceptionClientMsg.getMessage(code);
            }
            return WsResultJson.failure(msg, null, code);
        }
    
        /**
         * 附件转换
         * 
         * @param attachments
         *            附件集合
         * @return List 文件上传的值对象集合
         */
        protected List<FileUploadVo> transform2FileUploadVo(List<Attachment> attachments) throws IOException {
            if (attachments == null || attachments.size() <= 0) {
                return null;
            }
            List<FileUploadVo> result = new ArrayList<FileUploadVo>();
            for (Attachment attachment : attachments) {
                FileUploadVo fuv = new FileUploadVo();
                // 获取表单文本域类型
                String contentType = attachment.getContentType().toString();
                // 过滤非文件类型
                if (Arrays.asList(TEXT_TYPE).contains(contentType.toLowerCase())) {
                    continue;
                }
                DataHandler dh = attachment.getDataHandler();
                fuv.setInputStream(dh.getInputStream());
                // 获取上传的原文件名
                String oldFileName = dh.getName();
                String originalFileName = AppFileUploadUtils.getOriginalFileName(oldFileName);
                // 获取文件源文件后缀名
                String fileExtendName = AppFileUploadUtils.getFileExtension(oldFileName);
                // 生成新文件名
                String newFileName = JugHelper.generalUUID();
                NhAttachment lvAttachment = new NhAttachment();
                lvAttachment.setId(newFileName);
                lvAttachment.setOriginalFileName(originalFileName);
                lvAttachment.setStorageFileName(newFileName);
                lvAttachment.setFileExtendName(fileExtendName);
                lvAttachment.setFileSize(null);
                lvAttachment.setUploadFilePath(null);
                lvAttachment.setUploadTime(null);
                lvAttachment.setStateSign(NhAttachment.STATE_SIGN_USE);
                fuv.setAttachment(lvAttachment);
                result.add(fuv);
            }
            return result;
        }
    
        /**
         * @return the appExceptionClientMsg
         */
        public IAppPropertiesMsg getAppExceptionClientMsg() {
            return appExceptionClientMsg;
        }
    
        /**
         * @param appExceptionClientMsg
         *            the appExceptionClientMsg to set
         */
        public void setAppExceptionClientMsg(IAppPropertiesMsg appExceptionClientMsg) {
            this.appExceptionClientMsg = appExceptionClientMsg;
        }
    
        /**
         * @return the appExceptionSystemMsg
         */
        public IAppPropertiesMsg getAppExceptionSystemMsg() {
            return appExceptionSystemMsg;
        }
    
        /**
         * @param appExceptionSystemMsg
         *            the appExceptionSystemMsg to set
         */
        public void setAppExceptionSystemMsg(IAppPropertiesMsg appExceptionSystemMsg) {
            this.appExceptionSystemMsg = appExceptionSystemMsg;
        }
    
        protected String getThreadId() {
            String qid = "[" + Thread.currentThread().getId() + ":@" + new Date().getTime() + "@]";
            logger.error("---action in---> " + qid);
            return qid;
        }
    
        protected String getMethodDebugMsg(String qid, long startTime, String msg) {
            long endTime = System.currentTimeMillis();
            logger.error(msg + "---aticon method out---> " + qid + " {" + (endTime - startTime) + "}");
            return qid;
        }
    
        protected String getActionDebugMsg(String qid, long startTime, String msg) {
            long endTime = System.currentTimeMillis();
            logger.error(msg + "---action out total time---> " + qid + " {" + (endTime - startTime) + "}");
            return qid;
        }
    
    }

    FileUploadVo.java

    package cn.maitian.newhouse.framework.core.base.vo;
    
    import java.io.InputStream;
    import java.io.Serializable;
    
    import cn.maitian.newhouse.framework.system.model.NhAttachment;
    
    /**
     * 文件上传的值对象
     * 
     * @author LXINXIN
     * @company MAITIAN
     * @version 1.0
     */
    public class FileUploadVo implements Serializable{
    
        /**
         * 
         */
        private static final long serialVersionUID = -3384430691991762476L;
    
        /**
         * 文件的IO流
         */
        private InputStream inputStream;
    
        /**
         * 附件
         */
        private NhAttachment attachment;
    
        /**
         * @return the inputStream
         */
        public InputStream getInputStream() {
            return inputStream;
        }
    
        /**
         * @param inputStream
         *            the inputStream to set
         */
        public void setInputStream(InputStream inputStream) {
            this.inputStream = inputStream;
        }
    
        /**
         * @return the attachment
         */
        public NhAttachment getAttachment() {
            return attachment;
        }
    
        /**
         * @param attachment
         *            the attachment to set
         */
        public void setAttachment(NhAttachment attachment) {
            this.attachment = attachment;
        }
    
    }

    NhAttachment.java

    package cn.maitian.newhouse.framework.system.model;
    
    import java.io.Serializable;
    
    import cn.maitian.newhouse.framework.core.base.model.BaseEntity;
    import cn.maitian.webx.model.IDomainObject;
    
    /**
     * 附件数据信息实体
     * 
     * @author MGS
     * @company ISOFTSTONE
     * @version 1.0
     */
    public class NhAttachment extends BaseEntity implements IDomainObject, Serializable {
    
        private static final long serialVersionUID = 875425364068338655L;
    
        /**
         * 状态标志 0表示正常,1代表停用,默认是0
         */
        public static final int STATE_SIGN_USE = 0;
        /**
         * 不可用状态
         */
        public static final int STATE_SIGN_STOP = 1;
    
        /**
         * 文件ID号
         */
        private String id;
    
        /**
         * 原始文件名
         */
        private String originalFileName;
    
        /**
         * 新文件名
         */
        private String storageFileName;
    
        /**
         * 文件扩展名
         */
        private String fileExtendName;
    
        /**
         * 文件尺寸,按字节存储
         */
        private Long fileSize;
    
        /**
         * 上传文件路径
         */
        private String uploadFilePath;
    
        /**
         * 上传时间
         */
        private java.util.Date uploadTime;
    
        /**
         * 状态标志,此字段预留,0表示正常,1代表停用,默认是0
         */
        private Integer stateSign;
    
        /**
         * 临时字段、存储当前图片是第几张
         */
        private Integer sortNum;
        /**
         * 上传后图片服务器访问路径
         */
        private String accessFilePath;
    
        /**
         * @return the id
         */
        public String getId() {
            return id;
        }
    
        /**
         * @param id
         *            the id to set
         */
        public void setId(String id) {
            this.id = id;
        }
    
        /**
         * @return the originalFileName
         */
        public String getOriginalFileName() {
            return originalFileName;
        }
    
        /**
         * @param originalFileName
         *            the originalFileName to set
         */
        public void setOriginalFileName(String originalFileName) {
            this.originalFileName = originalFileName;
        }
    
        /**
         * @return the storageFileName
         */
        public String getStorageFileName() {
            return storageFileName;
        }
    
        /**
         * @param storageFileName
         *            the storageFileName to set
         */
        public void setStorageFileName(String storageFileName) {
            this.storageFileName = storageFileName;
        }
    
        /**
         * @return the fileExtendName
         */
        public String getFileExtendName() {
            return fileExtendName;
        }
    
        /**
         * @param fileExtendName
         *            the fileExtendName to set
         */
        public void setFileExtendName(String fileExtendName) {
            this.fileExtendName = fileExtendName;
        }
    
        /**
         * @return the uploadFilePath
         */
        public String getUploadFilePath() {
            return uploadFilePath;
        }
    
        /**
         * @param uploadFilePath
         *            the uploadFilePath to set
         */
        public void setUploadFilePath(String uploadFilePath) {
            this.uploadFilePath = uploadFilePath;
        }
    
        /**
         * @return the uploadTime
         */
        public java.util.Date getUploadTime() {
            return uploadTime;
        }
    
        /**
         * @param uploadTime
         *            the uploadTime to set
         */
        public void setUploadTime(java.util.Date uploadTime) {
            this.uploadTime = uploadTime;
        }
    
        /**
         * @return the stateSign
         */
        public Integer getStateSign() {
            return stateSign;
        }
    
        /**
         * @param stateSign
         *            the stateSign to set
         */
        public void setStateSign(Integer stateSign) {
            this.stateSign = stateSign;
        }
    
        /**
         * @return the fileSize
         */
        public Long getFileSize() {
            return fileSize;
        }
    
        /**
         * @param fileSize
         *            the fileSize to set
         */
        public void setFileSize(Long fileSize) {
            this.fileSize = fileSize;
            // 设置默认值
            if (this.fileSize == null) {
                this.fileSize = 0L;
            }
        }
    
        /**
         * 拼接为完整文件名
         * 
         * @return 完整文件名
         */
        public String getFullFileName() {
            return this.storageFileName + "." + this.fileExtendName;
        }
    
        /**
         * @return the sortNum
         */
        public Integer getSortNum() {
            return sortNum;
        }
    
        /**
         * @param sortNum
         *            the sortNum to set
         */
        public void setSortNum(Integer sortNum) {
            this.sortNum = sortNum;
        }
    
        /**
         * @return the accessFilePath
         */
        public String getAccessFilePath() {
            return accessFilePath;
        }
    
        /**
         * @param accessFilePath
         *            the accessFilePath to set
         */
        public void setAccessFilePath(String accessFilePath) {
            this.accessFilePath = accessFilePath;
        }
    
    }

    3.上传方法 saveUploadPic

    NhSalePerformancePicServiceImpl

    package cn.maitian.newhouse.modules.salePerformancepic.service.impl;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import cn.maitian.newhouse.framework.core.base.bean.WsResultJson;
    import cn.maitian.newhouse.framework.core.base.service.impl.BaseServiceImpl;
    import cn.maitian.newhouse.framework.core.base.vo.FileUploadVo;
    import cn.maitian.newhouse.framework.core.exception.AppSysException;
    import cn.maitian.newhouse.framework.core.util.AppFileUploadUtils;
    import cn.maitian.newhouse.framework.core.util.AppFileUploadUtils.ImageType;
    import cn.maitian.newhouse.framework.core.util.AppPropUtil;
    import cn.maitian.newhouse.framework.system.dao.NhAttachmentIDao;
    import cn.maitian.newhouse.framework.system.model.NhAttachment;
    import cn.maitian.newhouse.modules.salePerformancepic.dao.NhSalePerformancePicIDao;
    import cn.maitian.newhouse.modules.salePerformancepic.model.NhSalePerformancePic;
    import cn.maitian.newhouse.modules.salePerformancepic.service.NhSalePerformancePicIService;
    import cn.maitian.webx.support.Page;
    
    
    /**
     * 
     * 
     * @company  
     * @version 1.0
     */
    public class NhSalePerformancePicServiceImpl extends BaseServiceImpl implements NhSalePerformancePicIService {
        
        /**
         * Spring注入
         */
        private NhSalePerformancePicIDao nhSalePerformancePicIDao;
    
        private NhAttachmentIDao nhAttachmentIDao;
        
        
        
        
        @Override
        public String saveUploadPic(List<FileUploadVo> fileVos) {
            if (fileVos == null || fileVos.isEmpty()) {
                return null;
            }
            // 返回的结果信息
            List<Map<String,Object>> rs = new ArrayList<Map<String,Object>>();
            // 按日期生成文件夹
            Integer sortNum = 1;
            for (FileUploadVo fuv : fileVos) {
                InputStream ins = fuv.getInputStream();
                NhAttachment attachment = fuv.getAttachment();
                String fullFileName = attachment.getStorageFileName() + "." + attachment.getFileExtendName();
                // 文件上传
                Map<String, String> uploadResult = null;
                try {
                    uploadResult = AppFileUploadUtils.upload(ins, fullFileName);
                } catch (IOException e) {
                    e.printStackTrace();
                    throw new AppSysException("SE101007");
                }
                attachment.setFileSize(Long.valueOf(uploadResult.get(AppFileUploadUtils.KEY_FILE_SIZE)));
                attachment.setUploadFilePath(uploadResult.get(AppFileUploadUtils.KEY_RELATIVE_PATH));
                attachment.setUploadTime(new Date());
                String webServerUrl =    AppPropUtil.getPropValue(AppPropUtil.Keys.DOWNLOAD_FILE_HTTP );
                String accessPath =webServerUrl+AppFileUploadUtils.genThubnFilePath(attachment.getUploadFilePath(), ImageType.MIDDLE) ;
                attachment.setAccessFilePath(accessPath);
                
                nhAttachmentIDao.doSave(attachment);
                attachment.setSortNum(sortNum);
                sortNum++;
                Map<String,Object> picRs = new HashMap<String, Object>();
                picRs.put("picId", attachment.getId());
                
                String webAccessUrl =webServerUrl+  AppFileUploadUtils.genThubnFilePath(attachment.getUploadFilePath(),ImageType.SMALL);
                 
                picRs.put("url", webAccessUrl);
                rs.add(picRs);
            }
            Page page = new Page();
            page.setResult(rs);
            return  WsResultJson.success(page);
        }
    
        @Override
        public void saveOrUpdate(NhSalePerformancePic vo) {
            nhSalePerformancePicIDao.saveOrUpdateNhSalePerformancePic(vo);
        }
    
        @Override
        public NhSalePerformancePic findById(String id) {
            return nhSalePerformancePicIDao.findNhSalePerformancePicById(id);
        }
    
        @Override
        public void deleteById(String id) {
            nhSalePerformancePicIDao.deleteNhSalePerformancePicById(id);
        }
        
        @Override
        public void deleteByIds(String[] ids) {
            nhSalePerformancePicIDao.deleteNhSalePerformancePicByIds(ids);
        }
        @Override
        public List<NhSalePerformancePic> findAll() {
            return nhSalePerformancePicIDao.findAllNhSalePerformancePic();
        }
    
        @Override
        public Page searchPage(int pageNo, int pageSize, String orderByStr) {
            return nhSalePerformancePicIDao.searchNhSalePerformancePic(pageNo, pageSize, orderByStr);
        }
        
        @Override
        public Page searchPage(int pageNo, int pageSize, String orderByStr, NhSalePerformancePic vo) {
            return nhSalePerformancePicIDao.searchNhSalePerformancePic(pageNo, pageSize, orderByStr, vo);
        }
        
        /**
         * @param nhSalePerformancePicIDao
         *            the nhSalePerformancePicIDao to set
         */
        public void setNhSalePerformancePicIDao(NhSalePerformancePicIDao nhSalePerformancePicIDao) {
            this.nhSalePerformancePicIDao = nhSalePerformancePicIDao;
        }
        
        /**
         * 
         * @param nhAttachmentIDao 
         *             nhAttachmentIDao to set
         */
        public void setNhAttachmentIDao(NhAttachmentIDao nhAttachmentIDao) {
            this.nhAttachmentIDao = nhAttachmentIDao;
        }
    
        @Override
        public List<NhSalePerformancePic> findAllNhSalePerformancePicByPerformacneId(
                String performancceId) {
            // TODO Auto-generated method stub
            return nhSalePerformancePicIDao.findAllNhSalePerformancePicByPerformacneId(performancceId);
        }
        
        
    }

    4.AppFileUploadUtils

    /**
     * 
     */
    package cn.maitian.newhouse.framework.core.util;
    
    import java.awt.AlphaComposite;
    import java.awt.Graphics2D;
    import java.awt.Image;
    import java.awt.RenderingHints;
    import java.awt.image.BufferedImage;
    import java.io.BufferedInputStream;
    import java.io.BufferedOutputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.HttpURLConnection;
    import java.net.URL;
    import java.util.Calendar;
    import java.util.Enumeration;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.zip.ZipEntry;
    import java.util.zip.ZipException;
    import java.util.zip.ZipFile;
    
    import javax.imageio.ImageIO;
    import javax.swing.ImageIcon;
    
    import org.apache.commons.fileupload.util.Streams;
    import org.apache.commons.lang.StringUtils;
    
    import cn.maitian.newhouse.framework.core.exception.AppClientException;
    import net.coobird.thumbnailator.Thumbnails;
    
    /**
     * 文件上传通用方法
     * 
     * @author MGS
     * @company ISOFTSTONE
     * @version 1.0
     */
    public class AppFileUploadUtils {
        /**
         * 附件上传目录
         */
        private static final String FILE_TYPE_UPLOAD = "/upload";
        /**
         * 头像上传目录
         */
        private static final String FILE_TYPE_HEADPIC = "/headpic";
        /**
         * 附件上传临时目录
         */
        private static final String FILE_TYPE_TMP = "/tmp";
        /**
         * 文件分隔符
         */
        private static final String SEPARATOR = "/";
    
        /**
         * 头像扩展名
         */
        private static final String HEAD_EXT = ".jpg";
    
        /**
         * key:文件大小
         */
        public static final String KEY_FILE_SIZE = "fileSize";
        /**
         * key:文件相对路径
         */
        public static final String KEY_RELATIVE_PATH = "relativePath";
        /**
         * key:下载文件相对路径
         */
        public static final String KEY_RELATIVE_DOWNLOAD_PATH = "relativeDownloadPath";
        /**
         * ipa文件
         */
        public static final String PLIST_FILE = "plist";
        /**
         * ipa文件
         */
        public static final String IPA_FILE = "ipa";
    
        /**
         * 图片类型
         */
        public enum ImageType {
            /**
             * 小图片连接名
             */
            SMALL("_s"),
            /**
             * 中图片连接名
             */
            MIDDLE("_m"),
            /**
             * 大图片连接名
             */
    
            LARGE("_l"),
            /**
             * banner图片
             */
            BANNER("_b");
    
            private String val;
    
            private ImageType(String val) {
                this.val = val;
            }
    
            /**
             * 输出值
             * 
             * @return Integer
             */
            public String value() {
                return this.val;
            }
        }
    
        /**
         * 文件上传
         * 
         * @param inputStream
         *            文件流
         * @param fullFileName
         *            完整文件名
         * @return 相对路径
         * @throws IOException
         *             异常
         */
        public static String uploadHead(InputStream inputStream, String fullFileName) throws IOException {
            String relativePath = FILE_TYPE_HEADPIC + getFileDatePath();
            if (AppStringUtils.isEmpty(relativePath)) {
                return null;
            }
            if (AppStringUtils.isEmpty(fullFileName)) {
                return null;
            }
            fullFileName = getOriginalFileName(fullFileName) + HEAD_EXT;
            BufferedInputStream in = null;
            BufferedOutputStream out = null;
            // 文件上传基础路径
            String basePath = AppPropUtil.getPropValue(AppPropUtil.Keys.FILE_UPLOAD_HTTP);
            // 文件上传的相对路径
            String relativeFilePath = "";
            // 文件上传的完整路径
            String fullFilePath = "";
            // 返回上传附件信息
            try {
                // 获得文件输入流
                in = new BufferedInputStream(inputStream);
                // 文件的相对路径
                File file = new File(basePath + relativePath);
                // 若文件夹不存在,则递归创建文件夹
                if (!file.exists()) {
                    file.mkdirs();
                }
                relativeFilePath = relativePath + SEPARATOR + fullFileName;
                fullFilePath = basePath + relativeFilePath;
                // 获得文件输出流
                out = new BufferedOutputStream(new FileOutputStream(new File(basePath + relativeFilePath)));
                // 写入文件
                Streams.copy(in, out, true);
            } finally {
                try {
                    if (out != null) {
                        out.close();
                    }
                } finally {
                    if (in != null) {
                        in.close();
                    }
                }
            }
    
            // 生成头像小图
            genSmallThumbPic(fullFilePath, genThubnFilePath(fullFilePath, ImageType.SMALL));
            // 生成头像中图
            genMiddleThumbPic(fullFilePath, genThubnFilePath(fullFilePath, ImageType.MIDDLE));
            // 生成头像大图
            genLargeThumbPic(fullFilePath, genThubnFilePath(fullFilePath, ImageType.LARGE));
            return relativeFilePath;
        }
    
        /**
         * 根据类型生成缩率图路径
         * 
         * @param srcFilePath
         *            原始文件名
         * @param it
         *            图片类型
         * @return String
         */
        public static String genThubnFilePath(String srcFilePath, ImageType it) {
            if (srcFilePath == null || srcFilePath.trim().length() == 0) {
                return null;
            }
            // . 之前的字符串
            String prefix = getOriginalFileName(srcFilePath);
            // . 之后的字符串
            String suffix = getFileExtension(srcFilePath);
            // 根据类型生成缩率图路径
            String thubnFilePath = prefix + it.value() + "." + suffix;
            return thubnFilePath;
        }
    
        /**
         * 文件上传
         * 
         * @param inputStream
         *            文件流
         * @param fullFileName
         *            完整文件名
         * @return 相对路径
         * @throws IOException
         *             异常
         */
        public static Map<String, String> upload(InputStream inputStream, String fullFileName) throws IOException {
            Map<String, String> result = new HashMap<String, String>();
            String fileSize = "0";
            BufferedInputStream in = null;
            BufferedOutputStream out = null;
            // 文件上传路径前缀
            String basePath = AppPropUtil.getPropValue(AppPropUtil.Keys.FILE_UPLOAD_HTTP);
            String relativePath = FILE_TYPE_UPLOAD + getFileDatePath();
            // 完整文件名称
            String fullFilePath = "";
            // 返回上传附件信息
            try {
                // 获得文件输入流
                in = new BufferedInputStream(inputStream);
                // 文件的相对路径
                File file = new File(basePath + relativePath);
                // 若文件夹不存在,则递归创建文件夹
                if (!file.exists()) {
                    file.mkdirs();
                }
                // 文件全路径
                fullFilePath = basePath + relativePath + SEPARATOR + fullFileName;
                File f = new File(fullFilePath);
                // 获得文件输出流
                out = new BufferedOutputStream(new FileOutputStream(f));
                // 写入文件
                Streams.copy(in, out, true);
                fileSize = String.valueOf(f.length());
            } finally {
                try {
                    if (out != null) {
                        out.close();
                    }
                } finally {
                    if (in != null) {
                        in.close();
                    }
                }
            }
            // 如果是图片,生成大中小图片
            if (isImage(fullFileName)) {
                // 生成头像小图
                genSmallThumbPic(fullFilePath, genThubnFilePath(fullFilePath, ImageType.SMALL));
                // 生成头像中图
                genMiddleThumbPic(fullFilePath, genThubnFilePath(fullFilePath, ImageType.MIDDLE));
                // 生成头像大图
                genLargeThumbPic(fullFilePath, genThubnFilePath(fullFilePath, ImageType.LARGE));
            }
            // 大小
            result.put(KEY_FILE_SIZE, fileSize);
            // 相对路径
            result.put(KEY_RELATIVE_PATH, relativePath + SEPARATOR + fullFileName);
    
            return result;
        }
    
        /**
         * @param inputStream
         *            流
         * @param fullFileName
         *            文件名
         * @return Map<String, String>
         * @throws IOException
         *             异常
         */
        public static Map<String, String> uploadTemp(InputStream inputStream, String fullFileName) throws IOException {
            Map<String, String> result = new HashMap<String, String>();
            String fileSize = "0";
            BufferedInputStream in = null;
            BufferedOutputStream out = null;
            // 文件上传路径前缀
            String basePath = AppPropUtil.getPropValue(AppPropUtil.Keys.FILE_UPLOAD_HTTP);
            String relativePath = FILE_TYPE_TMP + getFileDatePath();
            // 完整文件名称
            String fullFilePath = "";
            // 返回上传附件信息
            try {
                // 获得文件输入流
                in = new BufferedInputStream(inputStream);
                // 文件的相对路径
                File file = new File(basePath + relativePath);
                // 若文件夹不存在,则递归创建文件夹
                if (!file.exists()) {
                    file.mkdirs();
                }
                // 文件全路径
                fullFilePath = basePath + relativePath + SEPARATOR + fullFileName;
                File f = new File(fullFilePath);
                // 获得文件输出流
                out = new BufferedOutputStream(new FileOutputStream(f));
                // 写入文件
                Streams.copy(in, out, true);
                fileSize = String.valueOf(f.length());
            } finally {
                try {
                    if (out != null) {
                        out.close();
                    }
                } finally {
                    if (in != null) {
                        in.close();
                    }
                }
            }
            // 大小
            result.put(KEY_FILE_SIZE, fileSize);
            // 相对路径
            result.put(KEY_RELATIVE_PATH, relativePath + SEPARATOR + fullFileName);
    
            return result;
        }
    
        /**
         * 安卓文件上传
         * 
         * @param inputStream
         *            文件流
         * @param fullFileName
         *            完整文件名
         * @param version
         *            版本号
         * @return 相对路径
         * @throws IOException
         *             异常
         */
        public static Map<String, Object> uploadAndroid(InputStream inputStream, String fullFileName, String version)
                throws IOException {
            Map<String, Object> result = new HashMap<String, Object>();
            int fileSize = 0;
            BufferedInputStream in = null;
            BufferedOutputStream out = null;
            // 文件上传路径前缀
            String basePath = AppPropUtil.getPropValue(AppPropUtil.Keys.FILE_UPLOAD_HTTP);
            // 安卓上传路径
            String androidUploadPath = AppPropUtil.getPropValue(AppPropUtil.Keys.ANDROID_UPLOAD_PREFIX);
            String relativePath = androidUploadPath + SEPARATOR + version;
            // 完整文件名称
            String fullFilePath = "";
            // 返回上传附件信息
            try {
                // 获得文件输入流
                in = new BufferedInputStream(inputStream);
                // 文件的相对路径
                File file = new File(basePath + relativePath);
                // 若文件夹不存在,则递归创建文件夹
                if (!file.exists()) {
                    file.mkdirs();
                }
                // 文件全路径
                fullFilePath = basePath + relativePath + SEPARATOR + fullFileName;
                File f = new File(fullFilePath);
                // 获得文件输出流
                out = new BufferedOutputStream(new FileOutputStream(f));
                // 写入文件
                Streams.copy(in, out, true);
                fileSize = (int) f.length();
            } finally {
                try {
                    if (out != null) {
                        out.close();
                    }
                } finally {
                    if (in != null) {
                        in.close();
                    }
                }
            }
            // 大小
            result.put(KEY_FILE_SIZE, fileSize);
            // 相对路径
            result.put(KEY_RELATIVE_PATH, relativePath + SEPARATOR + fullFileName);
            return result;
        }
    
        /**
         * 把文件写到固定目标文件夹下,返回目标文件路径
         * 
         * @param is
         *            流
         * @param fullFileName
         *            文件名
         * @param version
         *            版本
         * 
         * 
         * @return Map<String, Object>
         * @throws IOException
         *             异常
         */
        public static Map<String, Object> uploadIos(InputStream is, String fullFileName, String version)
                throws IOException {
            // 目标文件路径
            String targetPath = "";
            BufferedInputStream in = null;
            BufferedOutputStream out = null;
            // 文件上传路径前缀
            String basePath = AppPropUtil.getPropValue(AppPropUtil.Keys.FILE_UPLOAD_HTTP);
            // ios上传路径
            String isoUpload = AppPropUtil.getPropValue(AppPropUtil.Keys.IOS_UPLOAD_PREFIX);
            String relativePath = isoUpload + SEPARATOR + version;
            try {
                // 获得文件输入流
                in = new BufferedInputStream(is);
                // 文件的相对路径
                File file = new File(basePath + relativePath);
                // 若文件夹不存在,则递归创建文件夹
                if (!file.exists()) {
                    file.mkdirs();
                }
                // 文件全路径
                targetPath = basePath + relativePath + SEPARATOR + fullFileName;
                File f = new File(targetPath);
                // 获得文件输出流
                out = new BufferedOutputStream(new FileOutputStream(f));
                // 写入文件
                Streams.copy(in, out, true);
            } finally {
                try {
                    if (out != null) {
                        out.close();
                    }
                } finally {
                    if (in != null) {
                        in.close();
                    }
                }
            }
            String basePathHttps = AppPropUtil.getPropValue(AppPropUtil.Keys.FILE_UPLOAD_HTTPS);
            return unzip(targetPath, basePathHttps + relativePath, false);
        }
    
        /**
         * 解压缩zip包
         * 
         * @param zipFilePath
         *            zip文件的全路径
         * @param unzipFilePath
         *            解压后的文件保存的路径
         * @param includeZipFileName
         *            解压后的文件保存的路径是否包含压缩文件的文件名。true-包含;false-不包含
         * @return Map<String, Object>
         * @throws IOException
         *             异常
         * @throws ZipException
         *             异常
         */
        @SuppressWarnings("resource")
        public static Map<String, Object> unzip(String zipFilePath, String unzipFilePath, boolean includeZipFileName)
                throws ZipException, IOException {
            Map<String, Object> map = new HashMap<String, Object>();
            if (AppStringUtils.isEmpty(zipFilePath) || AppStringUtils.isEmpty(unzipFilePath)) {
                return map;
            }
            File zipFile = new File(zipFilePath);
            // 如果解压后的文件保存路径包含压缩文件的文件名,则追加该文件名到解压路径
            if (includeZipFileName) {
                String fileName = zipFile.getName();
                if (AppStringUtils.isNotEmpty(fileName)) {
                    fileName = fileName.substring(0, fileName.lastIndexOf("."));
                }
                unzipFilePath = unzipFilePath + File.separator + fileName;
            }
            // 创建解压缩文件保存的路径
            File unzipFileDir = new File(unzipFilePath);
            if (!unzipFileDir.exists() || !unzipFileDir.isDirectory()) {
                unzipFileDir.mkdirs();
            }
    
            // 开始解压
            ZipEntry entry = null;
            String entryFilePath = null, entryDirPath = null;
            File entryFile = null, entryDir = null;
            int index = 0, count = 0, bufferSize = 1024;
            byte[] buffer = new byte[bufferSize];
            BufferedInputStream bis = null;
            BufferedOutputStream bos = null;
            ZipFile tempZip = new ZipFile(zipFile);
            @SuppressWarnings("unchecked")
            Enumeration<ZipEntry> entries = (Enumeration<ZipEntry>) tempZip.entries();
            boolean isNoHasIpa = true;
            boolean isNoHasPlist = true;
            // 循环对压缩包里的每一个文件进行解压
            while (entries.hasMoreElements()) {
                entry = entries.nextElement();
                String fileName = entry.getName();
                // 构建压缩包中一个文件解压后保存的文件全路径
                entryFilePath = unzipFilePath + SEPARATOR + fileName;
                // 构建解压后保存的文件夹路径
                index = entryFilePath.lastIndexOf(SEPARATOR);
                if (index != -1) {
                    entryDirPath = entryFilePath.substring(0, index);
                } else {
                    entryDirPath = "";
                }
                entryDir = new File(entryDirPath);
                // 如果文件夹路径不存在,则创建文件夹
                if (!entryDir.exists() || !entryDir.isDirectory()) {
                    entryDir.mkdirs();
                }
    
                // 创建解压文件
                entryFile = new File(entryFilePath);
                // if (entryFile.exists()) {
                // 检测文件是否允许删除,如果不允许删除,将会抛出SecurityException
                // SecurityManager securityManager = new SecurityManager();
                // securityManager.checkDelete(entryFilePath);
                // 删除已存在的目标文件
                // entryFile.delete();
                // }
    
                // 写入文件
                bos = new BufferedOutputStream(new FileOutputStream(entryFile));
                bis = new BufferedInputStream(tempZip.getInputStream(entry));
                while ((count = bis.read(buffer, 0, bufferSize)) != -1) {
                    bos.write(buffer, 0, count);
                }
                bos.flush();
                bos.close();
    
                // 获取文件后缀名
                String suffix = fileName.substring(fileName.lastIndexOf(".") + 1);
                if (IPA_FILE.equalsIgnoreCase(suffix)) {
                    isNoHasIpa = false;
                }
                // plist文件
                if (PLIST_FILE.equalsIgnoreCase(suffix)) {
                    isNoHasPlist = false;
                    // 大小
                    map.put(KEY_FILE_SIZE, (int) zipFile.length());
                    String basePath = AppPropUtil.getPropValue(AppPropUtil.Keys.FILE_UPLOAD_HTTPS);
                    entryFilePath = entryFilePath.replace(basePath, "");
                    // plist相对路径
                    map.put(KEY_RELATIVE_PATH, entryFilePath);
                }
            }
            if (isNoHasIpa || isNoHasPlist) {
                throw new AppClientException("CE104008");
            }
            String bph = AppPropUtil.getPropValue(AppPropUtil.Keys.FILE_UPLOAD_HTTP);
            map.put(KEY_RELATIVE_DOWNLOAD_PATH, zipFilePath.replace(bph, ""));
            return map;
        }
    
        /**
         * @param targetPath
         *            文件的相对路径
         */
        public static void deleteOriginalFile(String targetPath) {
            // 文件的相对路径
            File file = new File(targetPath);
            // 若文件存在,则删除文件
            if (file.exists()) {
                file.delete();
            }
        }
    
        /**
         * 获取文件的名称(不包括后缀)
         * 
         * @param fileName
         *            文件全名称
         * @return 文件名(不含后缀)
         */
        public static String getOriginalFileName(String fileName) {
            // 文件名中不包括 . 则认为文件非法
            if (!fileName.contains(".")) {
                return "";
            }
            // 截取文件后缀
            return fileName.substring(0, fileName.lastIndexOf("."));
        }
    
        /**
         * 获取文件名称后缀
         * 
         * @param fileName
         *            文件全名称
         * @return 文件后缀
         */
        public static String getFileExtension(String fileName) {
            // 文件名中不包括 . 则认为文件非法
            if (!fileName.contains(".")) {
                return "";
            }
            // 截取文件后缀
            return fileName.substring(fileName.lastIndexOf(".") + 1);
        }
    
        /**
         * 根据用户ID生成用户头像地址
         * 
         * @param userId
         *            用户ID
         * @return 头像地址
         */
        public static String getHeadFilePathByUserId(String userId) {
            if (AppStringUtils.isEmpty(userId)) {
                return "";
            }
            String substrValue = userId.substring(userId.length() - 2);
            int value = hexadecimalConvertDecimalism(substrValue);
            int cal = value % 50;
            return SEPARATOR + String.valueOf(cal);
        }
    
        /**
         * 十六进制转换成十进制
         * 
         * @param hexadecimal
         *            十六进制参数值
         * @return 十进制值
         */
        public static int hexadecimalConvertDecimalism(String hexadecimal) {
            // 十六进制转化为十进制
            return Integer.parseInt(hexadecimal, 16);
        }
    
        /**
         * 按 /年/月日/小时 创建附件上传路径
         * 
         * @return 附件上传路径
         */
        public static String getFileDatePath() {
            Calendar calendar = Calendar.getInstance();
            int yearInt = calendar.get(Calendar.YEAR);
            int monthInt = calendar.get(Calendar.MONTH) + 1;
            int dayInt = calendar.get(Calendar.DAY_OF_MONTH);
            int hourInt = calendar.get(Calendar.HOUR_OF_DAY);
            String monthStr = monthInt >= 10 ? String.valueOf(monthInt) : "0" + monthInt;
            String dayStr = dayInt >= 10 ? String.valueOf(dayInt) : "0" + dayInt;
            String hourStr = hourInt >= 10 ? String.valueOf(hourInt) : "0" + hourInt;
            // 按 /年/月日/小时 创建附件上传路径
            return SEPARATOR + yearInt + SEPARATOR + monthStr + dayStr + SEPARATOR + hourStr;
        }
    
        /**
         * 获取相应的地址
         * 
         * @return 附件上传路径
         */
        public static String getFilePath() {
            Calendar calendar = Calendar.getInstance();
            int yearInt = calendar.get(Calendar.YEAR);
            int monthInt = calendar.get(Calendar.MONTH) + 1;
            int dayInt = calendar.get(Calendar.DAY_OF_MONTH);
            int hourInt = calendar.get(Calendar.HOUR_OF_DAY);
            String monthStr = monthInt >= 10 ? String.valueOf(monthInt) : "0" + monthInt;
            String dayStr = dayInt >= 10 ? String.valueOf(dayInt) : "0" + dayInt;
            String hourStr = hourInt >= 10 ? String.valueOf(hourInt) : "0" + hourInt;
            // 按 /年/月日/小时 创建附件上传路径
            return SEPARATOR + yearInt + SEPARATOR + monthStr + dayStr + SEPARATOR + hourStr;
        }
    
        /**
         * 从网络URL中下载文件
         * 
         * @param urlStr
         *            图片网络路径
         * @param fileName
         *            图片存储名称
         * @param savePath
         *            图片保存路径
         * @throws IOException
         *             异常
         */
        public static void downLoadFromUrl(String urlStr, String fileName, String savePath) throws IOException {
            URL url;
            // 得到输入流
            InputStream inputStream = null;
            FileOutputStream fos = null;
            try {
                url = new URL(urlStr);
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                // 设置超时间为3秒
                conn.setConnectTimeout(3 * 1000);
                // 防止屏蔽程序抓取而返回403错误
                conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
                inputStream = conn.getInputStream();
                // 获取自己数组
                byte[] getData = readInputStream(inputStream);
                // 文件保存位置
                File saveDir = new File(savePath);
                if (!saveDir.exists()) {
                    saveDir.mkdir();
                }
                File file = new File(saveDir + File.separator + fileName);
                fos = new FileOutputStream(file);
                fos.write(getData);
            } finally {
                if (fos != null) {
                    fos.close();
                }
                if (inputStream != null) {
                    inputStream.close();
                }
            }
        }
    
        /**
         * 从输入流中获取字节数组
         * 
         * @param inputStream
         *            流
         * @return byte数组
         * @throws IOException
         *             异常
         */
        public static byte[] readInputStream(InputStream inputStream) throws IOException {
            ByteArrayOutputStream bos = null;
            try {
                byte[] buffer = new byte[1024];
                int len = 0;
                bos = new ByteArrayOutputStream();
                while ((len = inputStream.read(buffer)) != -1) {
                    bos.write(buffer, 0, len);
                }
    
                return bos.toByteArray();
            } finally {
                if (bos != null) {
                    bos.close();
                }
            }
        }
    
        /**
         * 生成小缩率图
         * 
         * @param srcFilePath
         *            原图路径
         * @param thumbFilePath
         *            缩率图路径
         * @throws IOException
         */
        private static void genSmallThumbPic(String srcFilePath, String thumbFilePath) throws IOException {
            int width = AppPropPublicUtil.getIntegerValue(AppPropPublicUtil.Keys.APP_IMAGE_S_W);
            int height = AppPropPublicUtil.getIntegerValue(AppPropPublicUtil.Keys.APP_IMAGE_S_H);
            genThumbPic(srcFilePath, thumbFilePath, width, height);
        }
    
        /**
         * 生成中缩率图
         * 
         * @param srcFilePath
         *            原图路径
         * @param thumbFilePath
         *            缩率图路径
         * @throws IOException
         */
        private static void genMiddleThumbPic(String srcFilePath, String thumbFilePath) throws IOException {
            int width = AppPropPublicUtil.getIntegerValue(AppPropPublicUtil.Keys.APP_IMAGE_M_W);
            int height = AppPropPublicUtil.getIntegerValue(AppPropPublicUtil.Keys.APP_IMAGE_M_H);
            genThumbPic(srcFilePath, thumbFilePath, width, height);
        }
    
        /**
         * 生成大缩率图
         * 
         * @param srcFilePath
         *            原图路径
         * @param thumbFilePath
         *            缩率图路径
         * @throws IOException
         */
        private static void genLargeThumbPic(String srcFilePath, String thumbFilePath) throws IOException {
            int width = AppPropPublicUtil.getIntegerValue(AppPropPublicUtil.Keys.APP_IMAGE_L_W);
            int height = AppPropPublicUtil.getIntegerValue(AppPropPublicUtil.Keys.APP_IMAGE_L_H);
            genThumbPic(srcFilePath, thumbFilePath, width, height);
        }
    
        /**
         * 生成缩率图
         * 
         * @param filePath
         *            原图路径
         * @param pathSuffix
         *            文件名后缀
         * @throws IOException
         */
        private static void genThumbPic(String srcFilePath, String thumbFilePath, int width, int height)
                throws IOException {
            if (srcFilePath == null || srcFilePath.trim().length() == 0) {
                return;
            }
            if (thumbFilePath == null || thumbFilePath.trim().length() == 0) {
                return;
            }
            // 按指定大小把图片进行缩和放(会遵循原图高宽比例)
            Thumbnails.of(new File(srcFilePath)).size(width, height).toFile(new File(thumbFilePath));
        }
    
        /**
         * 判断文件是否是图片
         * 
         * @param fullFilePath
         *            完整的文件路径
         * @return String
         */
        private static boolean isImage(String fileName) {
            // 获取配置中支持的扩展名
            String supportImageExts = AppPropPublicUtil.getPropValue(AppPropPublicUtil.Keys.APP_SUPPORT_IMAGE_EXT);
            if (supportImageExts == null || supportImageExts.trim().length() == 0) {
                return false;
            }
            // 获取配置中支持的扩展名
            String fileExt = getFileExtension(fileName);
            if (fileExt == null || fileExt.trim().length() == 0) {
                return false;
            }
            return supportImageExts.toLowerCase().contains(fileExt.toLowerCase() + SEPARATOR);
        }
    
        /**
         * 测试获取网络图片到本地
         * 
         * @param args
         *            参数
         * 
         */
        public static void main(String[] args) {
            String path = "C:/Users/Administrator/Pictures/ab111.jpg";
            System.out.println(isImage(path));
        }
    
        /**
         * 保存户型图
         * @param ins  输入流
         * @param fullFileName  全路径
         * @param waterMakerPath  水印路径
         * @return   相对路径
         * @exception IOException 路径错误
         */
        public static Map<String, String> uploadHousePic(InputStream ins, String fullFileName, String waterMakerPath) throws IOException {
            if(StringUtils.isBlank(waterMakerPath)){
                throw new IOException("户型图水印文件路径未配置,key为"+AppPropPublicUtil.Keys.APP_HOUSE_WATERMARKER);
            }
            Map<String, String> result = new HashMap<String, String>();
            String fileSize = "0";
            BufferedInputStream in = null;
            BufferedOutputStream out = null;
            // 文件上传路径前缀
            String basePath = AppPropUtil.getPropValue(AppPropUtil.Keys.FILE_UPLOAD_HTTP);
            String relativePath = FILE_TYPE_UPLOAD + getFileDatePath();
            // 完整文件名称
            String fullFilePath = "";
            // 返回上传附件信息
            try {
                // 获得文件输入流
                in = new BufferedInputStream(ins);
                // 文件的相对路径
                File file = new File(basePath + relativePath);
                // 若文件夹不存在,则递归创建文件夹
                if (!file.exists()) {
                    file.mkdirs();
                }
                // 文件全路径
                fullFilePath = basePath + relativePath + SEPARATOR + fullFileName;
                File f = new File(fullFilePath);
                // 获得文件输出流
                out = new BufferedOutputStream(new FileOutputStream(f));
                // 写入文件
                Streams.copy(in, out, true);
                fileSize = String.valueOf(f.length());
            } finally {
                try {
                    if (out != null) {
                        out.close();
                    }
                } finally {
                    if (in != null) {
                        in.close();
                    }
                }
            }
            // 如果是图片,生成大中小图片
            if (isImage(fullFileName)) {
                
                waterMarkHousePic(fullFilePath,null,waterMakerPath);
                // 生成头像小图
                genSmallThumbPic(fullFilePath, genThubnFilePath(fullFilePath, ImageType.SMALL));
                // 生成头像中图
                genMiddleThumbPic(fullFilePath, genThubnFilePath(fullFilePath, ImageType.MIDDLE));
                waterMarkHousePic(genThubnFilePath(fullFilePath, ImageType.MIDDLE), genThubnFilePath(fullFilePath, ImageType.MIDDLE), waterMakerPath);
                // 生成头像大图
                genLargeThumbPic(fullFilePath, genThubnFilePath(fullFilePath, ImageType.LARGE));
                waterMarkHousePic(genThubnFilePath(fullFilePath, ImageType.LARGE), genThubnFilePath(fullFilePath, ImageType.LARGE), waterMakerPath);
            }
            // 大小
            result.put(KEY_FILE_SIZE, fileSize);
            // 相对路径
            result.put(KEY_RELATIVE_PATH, relativePath + SEPARATOR + fullFileName);
    
            return result;
        }
    
        /**
         * 给户型图原图打水印
         * @param fullFilePath 路径名
         * @param waterMakerPath  水印路径印
         * @return  打水印后的大图的路径
         */
        private static String waterMarkHousePic(String fullFilePath,String targetPath, String waterMakerPath) throws IOException {
             OutputStream os = null;   
                try {   
                    File sourceFile = new File(fullFilePath);
                    Image srcImg = ImageIO.read(sourceFile);  
                    
          
                    BufferedImage buffImg = new BufferedImage(srcImg.getWidth(null),   
                            srcImg.getHeight(null), BufferedImage.TYPE_INT_RGB);   
          
                    // 得到画笔对象   
                    Graphics2D g = buffImg.createGraphics();   
          
                    // 设置对线段的锯齿状边缘处理   
                    g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,   
                            RenderingHints.VALUE_INTERPOLATION_BILINEAR);   
          
                    g.drawImage(srcImg.getScaledInstance(srcImg.getWidth(null), srcImg   
                            .getHeight(null), Image.SCALE_SMOOTH), 0, 0, null);   
          
                      
          
                    // 水印图象的路径 水印一般为gif或者png的,这样可设置透明度   e
                    ImageIcon imgIcon = new ImageIcon(waterMakerPath);   
          
                    // 得到Image对象。   
                    Image img = imgIcon.getImage();   
          
                    float alpha =1f; // 透明度   
                    g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,   
                            alpha));   
          
                    // 表示水印图片的位置   
                    g.drawImage(img, 0, 0, null);   
          
                    g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));   
          
                    g.dispose();  
                    
                    if(StringUtils.isBlank(targetPath)){
                        targetPath =fullFilePath.substring(0, fullFilePath.lastIndexOf("."))+"_b"+fullFilePath.substring(fullFilePath.lastIndexOf(".")) ;
                    }
                     
                    os = new FileOutputStream(targetPath);   
          
                    // 生成图片   
                    ImageIO.write(buffImg, "JPG", os);   
          
                }  finally {   
                    try {   
                        if (null != os)   
                            os.close();   
                       
                    } catch (Exception e) {   
                        e.printStackTrace();   
                    }   
                }
                return targetPath;
        }
    
        /**
         * 
         * @param ins 输入流
         * @param fullFileName  文件名
         * @param waterMakerPath  水印路径
         * @return  信息
         * @exception  IOException  路径没找到
         */
        public static Map<String, String> uploadPicWithWaterMarker(InputStream ins, String fullFileName,
                String waterMakerPath) throws IOException {
            if(StringUtils.isBlank(waterMakerPath)){
                throw new IOException("一般图水印文件路径未配置,key为"+AppPropPublicUtil.Keys.APP_WATERMARKER);
            }
            Map<String, String> result = new HashMap<String, String>();
            String fileSize = "0";
            BufferedInputStream in = null;
            BufferedOutputStream out = null;
            // 文件上传路径前缀
            String basePath = AppPropUtil.getPropValue(AppPropUtil.Keys.FILE_UPLOAD_HTTP);
            String relativePath = FILE_TYPE_UPLOAD + getFileDatePath();
            // 完整文件名称
            String fullFilePath = "";
            // 返回上传附件信息
            try {
                // 获得文件输入流
                in = new BufferedInputStream(ins);
                // 文件的相对路径
                File file = new File(basePath + relativePath);
                // 若文件夹不存在,则递归创建文件夹
                if (!file.exists()) {
                    file.mkdirs();
                }
                // 文件全路径
                fullFilePath = basePath + relativePath + SEPARATOR + fullFileName;
                File f = new File(fullFilePath);
                // 获得文件输出流
                out = new BufferedOutputStream(new FileOutputStream(f));
                // 写入文件
                Streams.copy(in, out, true);
                fileSize = String.valueOf(f.length());
            } finally {
                try {
                    if (out != null) {
                        out.close();
                    }
                } finally {
                    if (in != null) {
                        in.close();
                    }
                }
            }
            // 如果是图片,生成大中小图片
            if (isImage(fullFileName)) {
                
                 waterMarkPic(fullFilePath,null,waterMakerPath);
                // 生成头像小图
                genSmallThumbPic(fullFilePath, genThubnFilePath(fullFilePath, ImageType.SMALL));
                // 生成头像中图
                genMiddleThumbPic(fullFilePath, genThubnFilePath(fullFilePath, ImageType.MIDDLE));
                waterMarkPic(genThubnFilePath(fullFilePath, ImageType.MIDDLE), genThubnFilePath(fullFilePath, ImageType.MIDDLE), waterMakerPath);
                // 生成头像大图
                genLargeThumbPic(fullFilePath, genThubnFilePath(fullFilePath, ImageType.LARGE));
                waterMarkPic(genThubnFilePath(fullFilePath, ImageType.LARGE), genThubnFilePath(fullFilePath, ImageType.LARGE), waterMakerPath);
            }
            // 大小
            result.put(KEY_FILE_SIZE, fileSize);
            // 相对路径
            result.put(KEY_RELATIVE_PATH, relativePath + SEPARATOR + fullFileName);
    
            return result;
        }
    
        private static String waterMarkPic(String fullFilePath,String targetPath ,String waterMakerPath) throws IOException {
            OutputStream os = null; 
            try {   
                Image srcImg = ImageIO.read(new File(fullFilePath));   
      
                BufferedImage buffImg = new BufferedImage(srcImg.getWidth(null),   
                        srcImg.getHeight(null), BufferedImage.TYPE_INT_RGB);   
      
                // 得到画笔对象   
                Graphics2D g = buffImg.createGraphics();   
      
                // 设置对线段的锯齿状边缘处理   
                g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,   
                        RenderingHints.VALUE_INTERPOLATION_BILINEAR);   
      
                g.drawImage(srcImg.getScaledInstance(srcImg.getWidth(null), srcImg   
                        .getHeight(null), Image.SCALE_SMOOTH), 0, 0, null);   
      
                 
      
                // 水印图象的路径 水印一般为gif或者png的,这样可设置透明度   e
                ImageIcon imgIcon = new ImageIcon(waterMakerPath);   
      
                // 得到Image对象。   
                Image img = imgIcon.getImage();   
      
                float alpha =1f; // 透明度   
                g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,   
                        alpha));   
      
                // 表示水印图片的位置   
                g.drawImage(img, (buffImg.getWidth()-img.getWidth(null))/2, (buffImg.getHeight()-img.getHeight(null))/2, null);   
      
                g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));   
      
                g.dispose();   
                
                if(StringUtils.isBlank(targetPath)){
                    targetPath =fullFilePath.substring(0, fullFilePath.lastIndexOf("."))+"_b"+fullFilePath.substring(fullFilePath.lastIndexOf(".")) ;
                }
                
                os = new FileOutputStream(targetPath);   
      
                // 生成图片   
                ImageIO.write(buffImg, "JPG", os);   
      
            } catch (Exception e) {   
                e.printStackTrace();   
            } finally {   
                try {   
                    if (null != os)   
                        os.close();   
                } catch (Exception e) {   
                    e.printStackTrace();   
                }   
            } 
            return targetPath;
        }
        
        /**
         * @param inputStream 输入流
         * @param fullFileName  文件名
         * @return  信息
         * @exception  IOException  路径没找到
         */
        public static Map<String, String> bannerUpload(InputStream inputStream, String fullFileName) throws IOException {
            Map<String, String> result = new HashMap<String, String>();
            String fileSize = "0";
            BufferedInputStream in = null;
            BufferedOutputStream out = null;
            // 文件上传路径前缀
            String basePath = AppPropUtil.getPropValue(AppPropUtil.Keys.FILE_UPLOAD_HTTP);
            String relativePath = FILE_TYPE_UPLOAD + getFileDatePath();
            // 完整文件名称
            String fullFilePath = "";
            // 返回上传附件信息
            try {
                // 获得文件输入流
                in = new BufferedInputStream(inputStream);
                // 文件的相对路径
                File file = new File(basePath + relativePath);
                // 若文件夹不存在,则递归创建文件夹
                if (!file.exists()) {
                    file.mkdirs();
                }
                // 文件全路径
                fullFilePath = basePath + relativePath + SEPARATOR + fullFileName;
                File f = new File(fullFilePath);
                // 获得文件输出流
                out = new BufferedOutputStream(new FileOutputStream(f));
                // 写入文件
                Streams.copy(in, out, true);
                fileSize = String.valueOf(f.length());
            } finally {
                try {
                    if (out != null) {
                        out.close();
                    }
                } finally {
                    if (in != null) {
                        in.close();
                    }
                }
            }
            // 如果是图片,生成大中小图片
            if (isImage(fullFileName)) {
                int width = AppPropPublicUtil.getIntegerValue(AppPropPublicUtil.Keys.BANNER_IMAGE_W);
                int height = AppPropPublicUtil.getIntegerValue(AppPropPublicUtil.Keys.BANNER_IMAGE_H);
                // 生成banner图
                genThumbPic(fullFilePath, genThubnFilePath(fullFilePath, ImageType.BANNER), width, height);
            }
            // 大小
            result.put(KEY_FILE_SIZE, fileSize);
            // 相对路径
            result.put(KEY_RELATIVE_PATH, relativePath + SEPARATOR + fullFileName);
    
            return result;
        }
    
    }

    5.app-config-dev.properties

    #u670du52a1u5668u8defu5f84
    APP_SERVER_PATH=http://172.16.5.66:8080/newhouse
    
    #u8c03u5ea6u670du52a1u5668u8defu5f84
    SCHEDULE_SERVER_PATH=http://172.16.5.66:8080/newhouse
    
    #u641cu7d22u5f15u64ceu5730u5740
    SEARCH_ES_SERVER=http://172.16.5.153:8083/EsQuery/query/
    #SEARCH_ES_SERVER=http://127.0.0.1:8071/EsQuery/query/
    SEARCH_ES_ClUSTER_NAME=maimai-es-test
    
    #u6587u4ef6u4e0au4f20u8defu5f84u524du7f00
    FILE_UPLOAD_HTTP=/diskfile/system/httpsurl
    FILE_UPLOAD_HTTPS=/diskfile/system/httpsurl
    ANDROID_UPLOAD_PREFIX=/mobile/android
    IOS_UPLOAD_PREFIX=/mobile/ios
    
    #u8bfbu53d6u6587u4ef6u8defu5f84u524du7f00
    DOWNLOAD_FILE_HTTP=http://192.168.183.47:8090/pic
    DOWNLOAD_FILE_HTTPS=http://192.168.183.47:8090/pic
    ANDROID_DEFAULT_INSTALL=https://mmdev1.maitian.cn/newhouse_100/default/newhouse.apk
    IOS_DEFAULT_INSTALL=https://mmdev1.maitian.cn/newhouse_100/default/newhouse.plist
    
    #u77edu4fe1u76f8u5173
    SMS_URL=http://172.16.5.31:8000/api/sms
    SMS_APPID=aadc9abe17f54007b5cca7a2513cb8b1
  • 相关阅读:
    oracle中文显示为问号
    oracle 11g 安装报错(agent_nmhs)
    yum源配置
    ora-00020
    mysql停止正在执行的SQL语句
    linux root用户被锁定
    MySQL8.0 根据ibd文件恢复表结构
    mysql 8.x 开启远程访问和修改root密码、
    个人博客迁移到github
    postman断言方式
  • 原文地址:https://www.cnblogs.com/pypua/p/10361292.html
Copyright © 2020-2023  润新知