基于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

#\u670d\u52a1\u5668\u8def\u5f84
APP_SERVER_PATH=http://172.16.5.66:8080/newhouse

#\u8c03\u5ea6\u670d\u52a1\u5668\u8def\u5f84
SCHEDULE_SERVER_PATH=http://172.16.5.66:8080/newhouse

#\u641c\u7d22\u5f15\u64ce\u5730\u5740
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

#\u6587\u4ef6\u4e0a\u4f20\u8def\u5f84\u524d\u7f00
FILE_UPLOAD_HTTP=/diskfile/system/httpsurl
FILE_UPLOAD_HTTPS=/diskfile/system/httpsurl
ANDROID_UPLOAD_PREFIX=/mobile/android
IOS_UPLOAD_PREFIX=/mobile/ios

#\u8bfb\u53d6\u6587\u4ef6\u8def\u5f84\u524d\u7f00
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

#\u77ed\u4fe1\u76f8\u5173
SMS_URL=http://172.16.5.31:8000/api/sms
SMS_APPID=aadc9abe17f54007b5cca7a2513cb8b1

 

posted @ 2019-02-11 11:30  十月围城小童鞋  阅读(1565)  评论(0编辑  收藏  举报