package com.yihu.wlyy.web.common; import java.beans.Encoder; import java.io.*; import java.text.SimpleDateFormat; import java.util.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.sound.sampled.AudioFileFormat; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.AudioSystem; import com.fasterxml.jackson.databind.node.ObjectNode; import com.yihu.wlyy.util.CommonUtil; import com.yihu.wlyy.util.fastdfs.FastDFSUtil; import io.swagger.annotations.Api; import io.swagger.annotations.ApiParam; import org.apache.commons.codec.EncoderException; import org.apache.commons.io.FileUtils; import org.json.JSONObject; import org.springframework.http.MediaType; import org.springframework.stereotype.Controller; import org.springframework.util.FileCopyUtils; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartHttpServletRequest; import com.yihu.wlyy.util.DateUtil; import com.yihu.wlyy.util.ImageCompress; import com.yihu.wlyy.util.SystemConf; import com.yihu.wlyy.web.BaseController; @Controller @RequestMapping(value = "/upload", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) @Api(description = "文件上传") public class FileUploadController extends BaseController { @ApiParam FastDFSUtil fastDFSUtil; /** * 患者头像上传 * * @return * @throws IOException * @throws IllegalStateException */ @RequestMapping(value = "patientPhoto", method = RequestMethod.POST/* , headers = "Accept=image/png" */) @ResponseBody public String patientPhoto(HttpServletRequest request, HttpServletResponse response, String photo) { try { String fastUrl = SystemConf.getInstance().getSystemProperties().getProperty("fastdfs_file_url"); MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; Map fileMap = multipartRequest.getFileMap(); String fileName = null; String firstPhoto = null; for (Map.Entry entity : fileMap.entrySet()) { // 上传文件 MultipartFile mf = entity.getValue(); fileName = mf.getOriginalFilename(); String fileExt = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase(); // 重命名文件 firstPhoto = photo.substring(0, photo.lastIndexOf(".")) + "_small." + fileExt; File uploadFile = new File(SystemConf.getInstance().getTempPath() + File.separator + firstPhoto); // 拷贝文件流到指定文件路径 FileCopyUtils.copy(mf.getBytes(), uploadFile); } JSONObject json = new JSONObject(); json.put("status", 200); json.put("msg", "上传成功"); // 图片标识对象的HTTP链接 json.put("urls", String.join(",", firstPhoto)); System.out.println("图片上传:" + json.toString()); return json.toString(); } catch (Exception e) { error(e); return error(-1, "上传失败"); } } /** * 图片上传 * * @return * @throws IOException * @throws IllegalStateException */ @RequestMapping(value = "image", method = RequestMethod.POST/* , headers = "Accept=image/png" */) @ResponseBody public String image(HttpServletRequest request, HttpServletResponse response) { // 圖片列表 List images = new ArrayList(); List tempPaths = new ArrayList(); // 文件保存的临时路径 String tempPath = SystemConf.getInstance().getTempPath() + File.separator; // 拼接年月日路径 String datePath = DateUtil.getStringDate("yyyy") + File.separator + DateUtil.getStringDate("MM") + File.separator + DateUtil.getStringDate("dd") + File.separator; try { MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; Map fileMap = multipartRequest.getFileMap(); // 创建文件夹 File file = new File(tempPath + datePath); if (!file.exists()) { file.mkdirs(); } String fileName = null; for (Map.Entry entity : fileMap.entrySet()) { // 上传文件 MultipartFile mf = entity.getValue(); fileName = mf.getOriginalFilename(); String fileExt = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase(); // 重命名文件 SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss"); String newFileName = df.format(new Date()) + "_" + new Random().nextInt(1000) + "." + fileExt; File uploadFile = new File(tempPath + datePath + newFileName); // 拷贝文件流到指定文件路径 FileCopyUtils.copy(mf.getBytes(), uploadFile); // 生成缩略图 ImageCompress.compress(uploadFile.getAbsolutePath(), uploadFile.getAbsolutePath() + "_small", 300, 300); // 添加到上传成功数组中 images.add(uploadFile); tempPaths.add(datePath + newFileName); } String urls = ""; for (String image : tempPaths) { if (urls.length() == 0) { urls = image; } else { urls += "," + image; } } JSONObject json = new JSONObject(); json.put("status", 200); json.put("msg", "上传成功"); // 图片标识对象的HTTP链接 json.put("urls", urls); System.out.println("图片上传:" + json.toString()); return json.toString(); } catch (Exception e) { error(e); try { // 清除垃圾图片 for (File file : images) { FileUtils.forceDelete(file); } } catch (Exception e2) { error(e2); } return error(-1, "上传失败"); } } /** * 聊天附件上传 * * @return * @throws IOException * @throws IllegalStateException */ @RequestMapping(value = "chat", method = RequestMethod.POST) @ResponseBody public String chatFile(HttpServletRequest request, HttpServletResponse response) { List tempPaths = new ArrayList(); try { String fastUrl = SystemConf.getInstance().getSystemProperties().getProperty("fastdfs_file_url"); String type = request.getParameter("type"); MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; Map fileMap = multipartRequest.getFileMap(); String fileName = null; for (Map.Entry entity : fileMap.entrySet()) { // 上传文件 MultipartFile mf = entity.getValue(); fileName = mf.getOriginalFilename(); if("3".equals(type)){ String tempPath = CommonUtil.saveVoiceToDisk(mf.getInputStream(),fileName); String map3Path = tempPath.substring(0,tempPath.lastIndexOf(".")); CommonUtil.changeToMp3(tempPath,map3Path); File tempFile = new File(tempPath); File mp3File = new File(map3Path); ObjectNode objectNode = fastDFSUtil.upload(new FileInputStream(mp3File),"mp3",""); tempPaths.add(fastUrl + objectNode.get("groupName").toString().replaceAll("\"","") + "/" + objectNode.get("remoteFileName").toString().replaceAll("\"","")); if(tempFile!=null){ tempFile.delete(); } if(mp3File!=null){ mp3File.delete(); } }else if("4".equals(type)){ String tempPath = CommonUtil.saveVoiceToDisk(mf.getInputStream(),fileName); String pngPath = tempPath.substring(0,tempPath.lastIndexOf("."))+".png"; File tempFile = new File(tempPath); File pngFile = new File(pngPath); String times = CommonUtil.getVideoTimeAndImg(tempPath,pngPath); ObjectNode imgNode = fastDFSUtil.upload(new FileInputStream(pngPath),"png",""); String fileExt = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase(); ObjectNode videoNode = fastDFSUtil.upload(new FileInputStream(tempPath),fileExt,""); tempPaths.add(fastUrl + imgNode.get("groupName").toString().replaceAll("\"","") + "/" + imgNode.get("remoteFileName").toString().replaceAll("\"","")); tempPaths.add(fastUrl + videoNode.get("groupName").toString().replaceAll("\"","") + "/" + videoNode.get("remoteFileName").toString().replaceAll("\"","")); tempPaths.add(times); if(tempFile!=null){ tempFile.delete(); } if(pngFile!=null){ pngFile.delete(); } } else{ String fileExt = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase(); ObjectNode objectNode = fastDFSUtil.upload(mf.getInputStream() ,fileExt,""); tempPaths.add(fastUrl + objectNode.get("groupName").toString().replaceAll("\"","") + "/" + objectNode.get("remoteFileName").toString().replaceAll("\"","")); } } String urls = String.join(",", tempPaths); JSONObject json = new JSONObject(); json.put("status", 200); json.put("success",true); json.put("msg", "上传成功"); // 图片标识对象的HTTP链接 json.put("urls", urls); System.out.println("附件上传:" + json.toString()); return json.toString(); } catch (Exception e) { error(e); return error(-1, "上传失败"); } } /** * 语音上传 * * @param request * @param response * @return */ @RequestMapping(value = "voice", method = RequestMethod.POST) @ResponseBody public String voice(HttpServletRequest request, HttpServletResponse response) { // 圖片列表 List voices = new ArrayList(); List tempPaths = new ArrayList(); // 文件保存的临时路径 String tempPath = SystemConf.getInstance().getTempPath() + File.separator; // 拼接年月日路径 String datePath = DateUtil.getStringDate("yyyy") + File.separator + DateUtil.getStringDate("MM") + File.separator + DateUtil.getStringDate("dd") + File.separator; try { MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; Map fileMap = multipartRequest.getFileMap(); // 创建文件夹 File file = new File(tempPath + datePath); if (!file.exists()) { file.mkdirs(); } String fileName = null; for (Map.Entry entity : fileMap.entrySet()) { // 上传文件 MultipartFile mf = entity.getValue(); fileName = mf.getOriginalFilename(); String fileExt = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase(); // 重命名文件 SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss"); String newFileName = df.format(new Date()) + "_" + new Random().nextInt(1000) + "." + fileExt; File uploadFile = new File(tempPath + datePath + newFileName); // 拷贝文件流到指定文件路径 FileCopyUtils.copy(mf.getBytes(), uploadFile); // 添加到上传成功数组中 voices.add(uploadFile); tempPaths.add(datePath + newFileName); } String urls = ""; for (String voice : tempPaths) { if (urls.length() == 0) { urls = voice; } else { urls += "," + voice; } } JSONObject json = new JSONObject(); json.put("status", 200); json.put("msg", "上传成功"); // 图片标识对象的HTTP链接 json.put("urls", urls); System.out.println("语音上传:" + json.toString()); return json.toString(); } catch (Exception e) { error(e); try { // 清除垃圾图片 for (File file : voices) { FileUtils.forceDelete(file); } } catch (Exception e2) { error(e2); } return error(-1, "上传失败"); } } /** * 语音上传 * @param request * @param response * @return */ @RequestMapping(value = "test", method = RequestMethod.POST) @ResponseBody public String test(HttpServletRequest request, HttpServletResponse response) throws Exception { MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; Map fileMap = multipartRequest.getFileMap(); List tempPaths = new ArrayList(); String fastUrl = SystemConf.getInstance().getSystemProperties().getProperty("fastdfs_file_url"); for (Map.Entry entity : fileMap.entrySet()) { MultipartFile mf = entity.getValue(); String fileName = mf.getOriginalFilename(); String tempPath = CommonUtil.saveVoiceToDisk(mf.getInputStream(),fileName); String pngPath = tempPath.substring(0,tempPath.lastIndexOf("."))+".png"; File tempFile = new File(tempPath); File pngFile = new File(pngPath); String times = CommonUtil.getVideoTimeAndImg(tempPath,pngPath); ObjectNode imgNode = fastDFSUtil.upload(new FileInputStream(pngPath),"png",""); String fileExt = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase(); ObjectNode videoNode = fastDFSUtil.upload(new FileInputStream(tempPath),fileExt,""); tempPaths.add(fastUrl + imgNode.get("groupName").toString().replaceAll("\"","") + "/" + imgNode.get("remoteFileName").toString().replaceAll("\"","")); tempPaths.add(fastUrl + videoNode.get("groupName").toString().replaceAll("\"","") + "/" + videoNode.get("remoteFileName").toString().replaceAll("\"","")); tempPaths.add(times); if(tempFile!=null){ tempFile.delete(); } if(pngFile!=null){ pngFile.delete(); } } String urls = String.join(",", tempPaths); return urls; } }