package com.zzg.web.controller.common; import com.alibaba.excel.EasyExcelFactory; import com.alibaba.excel.write.builder.ExcelWriterBuilder; import com.zzg.common.config.RuoYiConfig; import com.zzg.common.constant.Constants; import com.zzg.common.core.domain.AjaxResult; import com.zzg.common.enums.HouseProductionTypeEnum; import com.zzg.common.enums.HouseUsingTypeEnum; import com.zzg.common.utils.StringUtils; import com.zzg.common.utils.Threads; import com.zzg.common.utils.file.FileUploadUtils; import com.zzg.common.utils.file.FileUtils; import com.zzg.framework.config.ServerConfig; import com.zzg.system.convert.easyExcel.MultiDropdownWriteHandler; import com.zzg.system.domain.SysCity; import com.zzg.system.service.system.ISysCityService; import com.zzg.web.core.enums.TemplateFileTypeEnum; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.lang.reflect.Method; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; /** * 通用请求处理 * * @author ruoyi */ @RestController @RequestMapping("/common") public class CommonController { private static final Logger log = LoggerFactory.getLogger(CommonController.class); @Autowired private ServerConfig serverConfig; @Autowired private ISysCityService sysCityService; @Value("${server.config}") String myServerConfig; private static final String FILE_DELIMETER = ","; /** * 通用下载请求 * * @param fileName 文件名称 * @param delete 是否删除 */ @GetMapping("/download") public void fileDownload(String fileName, Boolean delete, HttpServletResponse response, HttpServletRequest request) { try { if (!FileUtils.checkAllowDownload(fileName)) { throw new Exception(StringUtils.format("文件名称({})非法,不允许下载。 ", fileName)); } String realFileName = System.currentTimeMillis() + fileName.substring(fileName.indexOf("_") + 1); String filePath = RuoYiConfig.getDownloadPath() + fileName; response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); FileUtils.setAttachmentResponseHeader(response, realFileName); FileUtils.writeBytes(filePath, response.getOutputStream()); if (delete) { FileUtils.deleteFile(filePath); } } catch (Exception e) { log.error("下载文件失败", e); } } @GetMapping("/download/template") public void fileDownload(@RequestParam Integer fileType, HttpServletResponse response) { try { TemplateFileTypeEnum pathByFileType = TemplateFileTypeEnum.getEnumByFileType(fileType); Method generateExampleDataMethod = pathByFileType.getClazz().getMethod("generateExampleData"); Object exampleData = generateExampleDataMethod.invoke(null); Object headerData; if (fileType.equals(TemplateFileTypeEnum.FILE_2.getFileType())) { headerData = generateHeaderData(); } else { Method generateHeaderDataMethod = pathByFileType.getClazz().getMethod("generateHeaderData"); headerData = generateHeaderDataMethod.invoke(null); } FileUtils.setExcelResponseHeader(response, pathByFileType.getFileName()); ExcelWriterBuilder write = EasyExcelFactory.write(response.getOutputStream(), pathByFileType.getClazz()); if (Objects.nonNull(headerData)) { write.registerWriteHandler((MultiDropdownWriteHandler) headerData); } write.sheet("sheet") .doWrite(Collections.singletonList(exampleData)); response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); Threads.sleep(1000); } catch (Exception e) { log.error("下载文件失败", e); } } public MultiDropdownWriteHandler generateHeaderData() { Map dropdownOptionsMap = new HashMap<>(); dropdownOptionsMap.put(0, Arrays.stream(HouseUsingTypeEnum.values()) .map(HouseUsingTypeEnum::getText) .toArray(String[]::new)); dropdownOptionsMap.put(10, Arrays.stream(HouseProductionTypeEnum.values()) .map(HouseProductionTypeEnum::getText) .toArray(String[]::new)); List towns = sysCityService.getTowns(); dropdownOptionsMap.put(12, towns.stream().map(SysCity::getName).toArray(String[]::new)); return new MultiDropdownWriteHandler(dropdownOptionsMap); } /** * 通用上传请求(单个) */ @PostMapping("/upload") public AjaxResult uploadFile(MultipartFile file) throws Exception { try { // 上传文件路径 String filePath = RuoYiConfig.getUploadPath(); // 上传并返回新文件名称 String fileName = FileUploadUtils.upload(filePath, file); String url = myServerConfig + fileName; AjaxResult ajax = AjaxResult.success(); ajax.put("url", url); ajax.put("fileName", fileName); ajax.put("newFileName", FileUtils.getName(fileName)); ajax.put("originalFilename", file.getOriginalFilename()); return ajax; } catch (Exception e) { return AjaxResult.error(e.getMessage()); } } /** * 通用上传请求(多个) */ @PostMapping("/uploads") public AjaxResult uploadFiles(List files) throws Exception { try { // 上传文件路径 String filePath = RuoYiConfig.getUploadPath(); List urls = new ArrayList(); List fileNames = new ArrayList(); List newFileNames = new ArrayList(); List originalFilenames = new ArrayList(); for (MultipartFile file : files) { // 上传并返回新文件名称 String fileName = FileUploadUtils.upload(filePath, file); String url = serverConfig.getUrl() + fileName; urls.add(url); fileNames.add(fileName); newFileNames.add(FileUtils.getName(file.getOriginalFilename())); originalFilenames.add(file.getOriginalFilename()); } AjaxResult ajax = AjaxResult.success(); ajax.put("urls", StringUtils.join(urls, FILE_DELIMETER)); ajax.put("fileNames", StringUtils.join(fileNames, FILE_DELIMETER)); ajax.put("newFileNames", StringUtils.join(newFileNames, FILE_DELIMETER)); ajax.put("originalFilenames", StringUtils.join(originalFilenames, FILE_DELIMETER)); return ajax; } catch (Exception e) { return AjaxResult.error(e.getMessage()); } } /** * 本地资源通用下载 */ @GetMapping("/download/resource") public void resourceDownload(String resource, HttpServletRequest request, HttpServletResponse response) throws Exception { try { if (!resource.contains("profile")) { // 提取日期部分:20240521 String datePart = resource.substring(resource.indexOf('/') + 1, resource.indexOf('/') + 9); String formattedDate = formatDate(datePart); resource = "/profile/upload/" + formattedDate + resource.replace("upload", ""); } if (!FileUtils.checkAllowDownload(resource)) { throw new Exception(StringUtils.format("资源文件({})非法,不允许下载。 ", resource)); } // 本地资源路径 String localPath = RuoYiConfig.getProfile(); // 数据库资源地址 String downloadPath = localPath + StringUtils.substringAfter(resource, Constants.RESOURCE_PREFIX); // 下载名称 String downloadName = StringUtils.substringAfterLast(downloadPath, "/"); response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); FileUtils.setAttachmentResponseHeader(response, downloadName); FileUtils.writeBytes(downloadPath, response.getOutputStream()); } catch (Exception e) { log.error("下载文件失败", e); } } public static String formatDate(String inputDate) { try { SimpleDateFormat inputFormat = new SimpleDateFormat("yyyyMMdd"); Date date = inputFormat.parse(inputDate); SimpleDateFormat outputFormat = new SimpleDateFormat("yyyy/MM/dd"); return outputFormat.format(date); } catch (ParseException e) { return null; } } }