package com.paic.pad.info.common.utils; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLConnection; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.web.multipart.MultipartFile; import com.paic.pad.info.common.dto.LabelValueDTO; /** * 文件的上传和下载的工具类 * */ public class FileUtils { static Log logger = LogFactory.getLog(FileUtils.class); public static String RESULT = "RESULT";// 校验结果 public static String MESSAGE = "MESSAGE";// 校验不通过 public static String VALID_PASS = "1";// 校验通过 public static String VALID_NOT_PASS = "0";// 校验不通过 // 文件上传路径 public static enum FILEPATHS { SUGGESTION_LOCAL_FILE_DIR("1", SystemConstant.SUGGESTION_LOCAL_FILE_DIR, "需求上报", SystemConstant.UPLOAD_FILE_ALLOW_SUFFIX, SystemConstant.UPLOAD_FILE_ALLOW_SIZE), // 需求上报路径 EXPERTS_LOCAL_FILE_DIR("2", SystemConstant.EXPERTS_LOCAL_FILE_DIR, "专家咨询提问附件", SystemConstant.UPLOAD_FILE_ALLOW_SUFFIX, SystemConstant.UPLOAD_FILE_ALLOW_SIZE), // 专家咨询提问附件路径 SCENE_LOCAL_FILE_DIR("3", SystemConstant.SCENE_LOCAL_FILE_DIR, "场景图片", SystemConstant.UPLOAD_SCENE_IMGFILE_ALLOW_SUFFIX, SystemConstant.UPLOAD_SCENE_IMGFILE_ALLOW_SIZE), // 场景图片上传路径 SCENE_LOCAL_FILE_TMP_DIR("4", SystemConstant.SCENE_LOCAL_FILE_TMP_DIR, "临时文件", SystemConstant.UPLOAD_SCENE_IMGFILE_ALLOW_SUFFIX, SystemConstant.UPLOAD_SCENE_IMGFILE_ALLOW_SIZE), // 文件上传临时路径 USERINFO_IMAGES_LOCAL_FILE_DIR("5", SystemConstant.USERINFO_IMAGES_LOCAL_FILE_DIR, " 用户头像", SystemConstant.UPLOAD_SCENE_IMGFILE_ALLOW_SUFFIX, SystemConstant.UPLOAD_SCENE_IMGFILE_ALLOW_SIZE), // 用户图片上传路径 DATAEXPORT_TEMPLATE_LOCAL_FILE_DIR("6", SystemConstant.DATAEXPORT_TEMPLATE_LOCAL_FILE_DIR, "数据模板", SystemConstant.UPLOAD_FILE_ALLOW_SUFFIX, SystemConstant.UPLOAD_FILE_ALLOW_SIZE);// 导出数据模板 private String typeKey; private String typeValue; private String typeDesc; private String allowSuffix; private String allowSize; public String getTypeKey() { return typeKey; } public void setTypeKey(String typeKey) { this.typeKey = typeKey; } public String getTypeValue() { return typeValue; } public void setTypeValue(String typeValue) { this.typeValue = typeValue; } public String getTypeDesc() { return typeDesc; } public void setTypeDesc(String typeDesc) { this.typeDesc = typeDesc; } public String getAllowSuffix() { return allowSuffix; } public void setAllowSuffix(String allowSuffix) { this.allowSuffix = allowSuffix; } public String getAllowSize() { return allowSize; } public void setAllowSize(String allowSize) { this.allowSize = allowSize; } public static List<LabelValueDTO> getTypes() { List<LabelValueDTO> results = new ArrayList<LabelValueDTO>(); for (FILEPATHS val : FILEPATHS.values()) { LabelValueDTO labelValueDTO = new LabelValueDTO(); labelValueDTO.setKey(val.getTypeKey()); labelValueDTO.setValue(val.getTypeDesc()); results.add(labelValueDTO); } return results; } public static FILEPATHS getFilePath(String typeKey) { FILEPATHS result = null; for (FILEPATHS val : FILEPATHS.values()) { if (StringUtils.equals(val.getTypeKey(), typeKey)) { result = val; } } return result; } private FILEPATHS(String typeKey, String typeValue, String typeDesc, String allowSuffix, String allowSize) { this.typeKey = typeKey; this.typeValue = typeValue; this.typeDesc = typeDesc; this.allowSuffix = allowSuffix; this.allowSize = allowSize; } @Override public String toString() { // 覆盖了父类Enum的toString() return super.toString() + "(" + typeKey + "," + typeValue + "," + typeDesc + ")"; } } /** * 上传文件 -- * * @param request * @param file * @param propPath * @return 文件新名称 * @throws Exception */ public static String upload(MultipartFile file, String propPath, String umId) throws Exception { if (file == null) { return null; } String suffix = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".") + 1); String fileNameNew = umId + getFileNameNew() + "." + suffix; logger.info("文件上传--开始--文件名称为:" + propPath + File.separator + fileNameNew); File f = new File(propPath + File.separator + fileNameNew); file.transferTo(f); f.createNewFile(); return fileNameNew; } public static void uploadFile(MultipartFile file, String propPath) throws Exception { if (file == null) { return; } String fileNameNew = file.getOriginalFilename(); logger.info("文件上传--开始--文件名称为:" + propPath + File.separator + fileNameNew); File f = new File(propPath + File.separator + fileNameNew); file.transferTo(f); f.createNewFile(); } /** * 文件校验 * * @param file * @param settingParam * @return 校验结果及校验信息 * @throws Exception */ public static Map<String, Object> valid(MultipartFile file, Map<String, String> settingParam) throws Exception { if (file == null) { return null; } String message = ""; String validpass = VALID_PASS; String allowSuffix = settingParam.get(SystemConstant.UPLOAD_FILE_ALLOW_SUFFIX) == null ? "" : settingParam.get(SystemConstant.UPLOAD_FILE_ALLOW_SUFFIX); String allowSizeTmp = settingParam.get(SystemConstant.UPLOAD_FILE_ALLOW_SIZE) == null ? "0" : settingParam.get(SystemConstant.UPLOAD_FILE_ALLOW_SIZE); if (file.getOriginalFilename().lastIndexOf(".") == -1) { message = "请上传允许格式的文件:" + allowSuffix; validpass = VALID_NOT_PASS; } else { String suffix = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".") + 1); double allowSize = Double.parseDouble(allowSizeTmp); int length = allowSuffix.toUpperCase().indexOf(suffix.toUpperCase()); if (length == -1) { message = "请上传允许格式的文件:" + allowSuffix; validpass = VALID_NOT_PASS; } else if (file.getSize() > (allowSize * 1024 * 1024)) { message = "您上传的文件大小已经超出规定范围:" + allowSize + "M"; validpass = VALID_NOT_PASS; } } Map<String, Object> result = new HashMap<String, Object>(); result.put(MESSAGE, message); result.put(RESULT, validpass); return result; } /** * 文件的下载 * * @param request * @param response * @param downLoadPath * @throws Exception */ public static void download(HttpServletRequest request, HttpServletResponse response, String fileName, String path) throws Exception { response.setContentType("text/html;charset=UTF-8"); request.setCharacterEncoding("UTF-8"); String fileNameTmp = path + "/" + fileName; BufferedInputStream bis = null; BufferedOutputStream bos = null; try { File downloadFile = new File(fileNameTmp); long fileLength = downloadFile.length(); response.setContentType("application/x-download"); response.setHeader("Content-disposition", "attachment; filename=" + new String(fileName.getBytes("gbk"), "ISO8859-1")); response.setHeader("Content-Length", String.valueOf(fileLength)); bis = new BufferedInputStream(new FileInputStream(fileNameTmp)); bos = new BufferedOutputStream(response.getOutputStream()); byte[] buff = new byte[2048]; int bytesRead; while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) { bos.write(buff, 0, bytesRead); } } finally { if(bis != null) { bis.close(); } if(bos != null) { bos.close(); } } } /** * 获取资讯内容 * * @param resourceUrl * @return * @throws Exception */ public static String getResourceContent(String resourceUrl) throws Exception { URL url = new URL(resourceUrl); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setDoOutput(true); String contenttype = connection.getContentType(); String charSet = getCharset(contenttype); BufferedReader br = null; StringBuilder result = null; InputStreamReader isr = new InputStreamReader(connection.getInputStream(), charSet); try { br = new BufferedReader(isr); String str = null; result = new StringBuilder(); while ((str = br.readLine()) != null) { result.append(str); } } catch (Exception e) { logger.error("获取资讯内容异常", e); } finally{ if(br != null) { br.close(); } } return result.toString(); } /** * 获取页面编码 * * @param str * @return */ private static String getCharset(String str) { Pattern pattern = Pattern.compile("charset=.*"); if (str == null) { return "UTF-8"; } Matcher matcher = pattern.matcher(str); if (matcher.find()) { return matcher.group(0).split("charset=")[1]; } return "UTF-8"; } /** * 检测网络资源是否存在 * * @param strUrl * @return */ public static boolean isNetFileAvailable(String strUrl) { InputStream netFileInputStream = null; try { URL url = new URL(strUrl); URLConnection urlConn = url.openConnection(); netFileInputStream = urlConn.getInputStream(); if (null != netFileInputStream) { return true; } else { return false; } } catch (IOException e) { return false; } finally { try { if (netFileInputStream != null) { netFileInputStream.close(); } } catch (IOException e) { } } } /** * 文档是否存在 * * @param strUrl * @return */ public static boolean isFileAvailable(String strUrl) { File saveFile = new File(strUrl); if (saveFile.exists()) { return true; } else { return false; } } /** * 获取新的文件名 * * @return */ private static String getFileNameNew() { SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMddHHmmssSSS"); return fmt.format(new Date()); } /** * 删除文件 -- * * @param request * @param filePath * @throws Exception */ public static void delFile(String filePath) throws Exception { File delFile = new File(filePath); if (delFile.exists()) { delFile.delete(); } } /** * 删除多个文件 -- * * @param request * @param filePath * @throws Exception */ public static void delFileList(List<String> filePathList,String basePath) throws Exception { if(CommonUtils.listNotNull(filePathList)) { for (int i = 0; i < filePathList.size(); i++) { File delFile = new File(basePath + File.separator + filePathList.get(i)); if (delFile.exists()) { delFile.delete(); } } } } /** * 复制文件 -- * * @param request * @param temFilePath * @param realFilePath * @throws Exception */ public static void copyFile(String temFilePath, String realFilePath) throws Exception { int byteRead = 0; File oldfile = new File(temFilePath); InputStream inputStream = null; FileOutputStream fileOutputStream = null; try { if (oldfile.exists()) { inputStream = new FileInputStream(temFilePath); fileOutputStream = new FileOutputStream(realFilePath); byte[] buffer = new byte[2048]; while ((byteRead = inputStream.read(buffer)) != -1) { fileOutputStream.write(buffer, 0, byteRead); } } } finally { if (inputStream != null) { inputStream.close(); } if (fileOutputStream != null) { fileOutputStream.close(); } } } }