package com.nanjing.water.host.controller.base; import com.google.gson.Gson; import com.nanjing.water.common.ConstantFactory; import com.nanjing.water.common.ExecutedResult; import com.nanjing.water.common.config.SysConfig; import com.nanjing.water.common.enums.EContentType; import com.nanjing.water.common.util.FileUtil; import com.nanjing.water.common.util.LocalDateTimeUtil; import com.nanjing.water.common.util.ParameterUtil; import com.nanjing.water.common.util.StringUtil; import com.nanjing.water.common.validator.EParameterValidateType; import com.nanjing.water.entity.dto.NameValueDTO; import com.nanjing.water.entity.dto.UploadResultVo; import com.nanjing.water.host.api.NonLogin; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.io.ResourceLoader; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartHttpServletRequest; import javax.servlet.http.HttpServletRequest; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.stream.Collectors; /** * 01.æ–‡ä»¶ä¸Šä¼ * @author lin.liu * @date 2021/11/26 * @order 01 */ @NonLogin @RestController @RequestMapping("/file") public class FileController { @Autowired private ResourceLoader resourceLoader; /** * ä¸Šä¼ æ–‡ä»¶ * * @param requestMultipart 夿‚请求对象 */ @PostMapping(value = "upload") @NonLogin public ExecutedResult<UploadResultVo> upload(MultipartHttpServletRequest requestMultipart, HttpServletRequest request) throws Exception { UploadResultVo result = this.defaultResult(); Map<String, MultipartFile> mapFile = requestMultipart.getFileMap(); if (mapFile.isEmpty()) { return ExecutedResult.failed("è¯·æ±‚ä¸æ²¡æœ‰æ‰¾åˆ°æ–‡ä»¶ã€‚"); } if (mapFile.size() > 1) { return ExecutedResult.failed("仅支æŒå•ä¸ªæ–‡ä»¶ä¸Šä¼ ã€‚"); } String fileId = requestMultipart.getParameter("fileId"); String toPath = requestMultipart.getParameter("path"); if (StringUtil.isNullOrEmpty(toPath)) { return ExecutedResult.failed(ParameterUtil.named("path") + EParameterValidateType.NOT_NULLOREMPTY.getDesc()); } Iterator<Map.Entry<String, MultipartFile>> iterator = mapFile.entrySet().iterator(); Map.Entry<String, MultipartFile> fileEntry = iterator.next(); MultipartFile file = fileEntry.getValue(); String contentType = file.getContentType(); InputStream fConfig = resourceLoader.getResource("classpath:upload_allow.json").getInputStream(); String allowStr = FileUtil.readFileContent(fConfig); Map<String, String> map = new Gson().fromJson(allowStr, Map.class); List<NameValueDTO<String>> listConfig = map.entrySet().stream().map(c -> new NameValueDTO<>(c.getKey(), c.getValue())) .collect(Collectors.toList()); NameValueDTO<String> findConfig = listConfig.stream().filter(c -> c.getName().equals(contentType)) .findAny().orElse(null); if (Objects.isNull(findConfig)) { return ExecutedResult.failed(file.getOriginalFilename() + ", 䏿”¯æŒçš„æ–‡ä»¶ç±»åž‹ã€‚" + file.getContentType()); } if (null != file.getOriginalFilename() && !file.getOriginalFilename().contains(findConfig.getValue())) { return ExecutedResult.failed(file.getOriginalFilename() + ", 䏿”¯æŒçš„æ–‡ä»¶ç±»åž‹ã€‚" + file.getContentType()); } EContentType type = EContentType.getByValue(file.getContentType()); String filePath = "/" + toPath + "/files/"; boolean isMultimedia = false; long size = file.getSize() / ConstantFactory.FILE_UNIT; if (null != type) { switch (type) { case GIF: case JPG: case PNG: case JPEG: filePath = "/" + toPath + "/images/"; if (size > ConstantFactory.FILE_SIZE_20M) { return ExecutedResult.failed("图片ä¸èƒ½è¶…过20Mï¼"); } break; case GZ: case RAR: case X7Z: case ZIP: if (size > ConstantFactory.FILE_SIZE_20M) { return ExecutedResult.failed("压缩文件ä¸èƒ½è¶…过20Mï¼"); } break; case MP3: isMultimedia = true; if (size > ConstantFactory.FILE_SIZE_20M) { return ExecutedResult.failed("音频文件ä¸èƒ½è¶…过20Mï¼"); } break; case MP4: isMultimedia = true; if (size > ConstantFactory.FILE_SIZE_20M) { return ExecutedResult.failed("视频文件ä¸èƒ½è¶…过20Mï¼"); } break; default: break; } } filePath += LocalDateTimeUtil.toFormatString(LocalDateTimeUtil.todayFirst(), "yyyyMMdd") + "/"; InputStream fsIn = file.getInputStream(); String fileSuffix = "." + findConfig.getValue(); File directory = new File(SysConfig.fileUploadBasic() + filePath); //如果路径ä¸å˜åœ¨ï¼Œæ–°å»º if (!directory.exists() && !directory.isDirectory()) { directory.mkdirs(); } String newFileName = filePath + StringUtil.md5(file.getOriginalFilename() + LocalDateTimeUtil.nowDateTimeFullStr() + SysConfig.fileDisturbStr()) + fileSuffix; File newFile = new File(SysConfig.fileUploadBasic() + newFileName); if (!newFile.exists()) { //æ¯æ¬¡å†™å…¥1MB byte[] buffer = new byte[ConstantFactory.FILE_UNIT * ConstantFactory.FILE_SIZE_1M]; int len; FileOutputStream fsOut = null; try { fsOut = new FileOutputStream(newFile); while ((len = fsIn.read(buffer)) != -1) { fsOut.write(buffer, 0, len); fsOut.flush(); } } finally { if (Objects.nonNull(fsOut)) { fsOut.close(); } } } if (Objects.nonNull(fsIn)) { fsIn.close(); } result.setFileId(fileId); result.setName(file.getOriginalFilename()); result.setNewFileName(newFileName); result.setSize(size); result.setFileType(findConfig.getValue()); result.setContentType(findConfig.getName()); result.setNewFileView(SysConfig.fileViewBasic() + newFileName); file = null; newFile = null; return ExecutedResult.success(result); } private UploadResultVo defaultResult() { UploadResultVo result = new UploadResultVo(); result.setFileId(""); result.setName(""); result.setNewFileName(""); result.setNewFileView(""); result.setFileType(""); result.setContentType(""); result.setSize(0L); return result; } }