src/main/java/com/ycl/jxkg/config/RuoYiConfig.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/ycl/jxkg/config/spring/mvc/WebMvcConfiguration.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/ycl/jxkg/controller/admin/UploadController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/ycl/jxkg/controller/common/UploadController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/resources/application-dev.yml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/resources/application-prod.yml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/resources/application.yml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/resources/mapper/ExamPaperAnswerMapper.xml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/main/java/com/ycl/jxkg/config/RuoYiConfig.java
New file @@ -0,0 +1,64 @@ package com.ycl.jxkg.config; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; /** * 读取项目相关配置 * * @author ruoyi */ @Component @ConfigurationProperties(prefix = "upload") public class RuoYiConfig { /** 上传路径 */ private String url; public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public void setProfile(String profile) { url = profile; } /** * 获取导入上传路径 */ public String getImportPath() { return url + "/import"; } /** * 获取头像上传路径 */ public String getAvatarPath() { return url + "/avatar"; } /** * 获取下载路径 */ public String getDownloadPath() { return url + "/download/"; } /** * 获取上传路径 */ public String getUploadPath() { return url + "/upload"; } } src/main/java/com/ycl/jxkg/config/spring/mvc/WebMvcConfiguration.java
@@ -1,11 +1,13 @@ package com.ycl.jxkg.config.spring.mvc; import com.ycl.jxkg.config.RuoYiConfig; import com.ycl.jxkg.config.property.SystemConfig; import com.ycl.jxkg.config.spring.wx.TokenHandlerInterceptor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.*; import java.io.File; import java.util.List; @@ -20,6 +22,7 @@ private final TokenHandlerInterceptor tokenHandlerInterceptor; private final SystemConfig systemConfig; private final RuoYiConfig ruoYiConfig; /** * Instantiates a new Web mvc configuration. @@ -28,9 +31,10 @@ * @param systemConfig the system config */ @Autowired public WebMvcConfiguration(TokenHandlerInterceptor tokenHandlerInterceptor, SystemConfig systemConfig) { public WebMvcConfiguration(TokenHandlerInterceptor tokenHandlerInterceptor, SystemConfig systemConfig, RuoYiConfig ruoYiConfig) { this.tokenHandlerInterceptor = tokenHandlerInterceptor; this.systemConfig = systemConfig; this.ruoYiConfig = ruoYiConfig; } @Override @@ -42,6 +46,8 @@ @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/api/files" + "/**") .addResourceLocations("file:" + ruoYiConfig.getUrl() + File.separator); registry.addResourceHandler("/**") .addResourceLocations("classpath:/static/") .setCachePeriod(31556926); src/main/java/com/ycl/jxkg/controller/admin/UploadController.java
@@ -3,23 +3,30 @@ import com.ycl.jxkg.base.BaseApiController; import com.ycl.jxkg.base.Result; import com.ycl.jxkg.config.RuoYiConfig; import com.ycl.jxkg.config.property.SystemConfig; import com.ycl.jxkg.service.FileUpload; import com.ycl.jxkg.service.UserService; import com.ycl.jxkg.domain.vo.admin.file.UeditorConfigVO; import com.ycl.jxkg.domain.vo.admin.file.UploadResultVO; import com.ycl.jxkg.service.FileUpload; import com.ycl.jxkg.service.UserService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; 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 javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.util.Arrays; import java.util.HashMap; import java.util.UUID; @RequestMapping("/api/admin/upload") @@ -32,12 +39,14 @@ private static final String IMAGE_UPLOAD = "imgUpload"; private static final String IMAGE_UPLOAD_FILE = "upFile"; private final UserService userService; private final RuoYiConfig ruoYiConfig; @Autowired public UploadController(FileUpload fileUpload, SystemConfig systemConfig, UserService userService) { public UploadController(FileUpload fileUpload, SystemConfig systemConfig, UserService userService, RuoYiConfig ruoYiConfig) { this.fileUpload = fileUpload; this.systemConfig = systemConfig; this.userService = userService; this.ruoYiConfig = ruoYiConfig; } @ResponseBody @@ -45,26 +54,45 @@ public Object upload(HttpServletRequest request, HttpServletResponse response) { String action = request.getParameter("action"); if (action.equals(IMAGE_UPLOAD)) { MultipartHttpServletRequest multipartHttpServletRequest = (MultipartHttpServletRequest) request; MultipartFile file = multipartHttpServletRequest.getFile(IMAGE_UPLOAD_FILE); // 检查文件是否为空 if (file.isEmpty()) { return Result.fail(500, "上传的文件为空"); } try { MultipartHttpServletRequest multipartHttpServletRequest = (MultipartHttpServletRequest) request; MultipartFile multipartFile = multipartHttpServletRequest.getFile(IMAGE_UPLOAD_FILE); long attachSize = multipartFile.getSize(); String imgName = multipartFile.getOriginalFilename(); String filePath; try (InputStream inputStream = multipartFile.getInputStream()) { filePath = fileUpload.uploadFile(inputStream, attachSize, imgName); // 获取文件名 String originalFileName = StringUtils.cleanPath(file.getOriginalFilename()); String randomName = UUID.randomUUID().toString().replace("-", "") + originalFileName.substring(originalFileName.lastIndexOf(".")); // 指定文件存储路径 String uploadDir = ruoYiConfig.getUrl(); // 修改为您希望存储的目录 // 如果目录不存在,则创建目录 File dir = new File(uploadDir); if (!dir.exists()) { dir.mkdirs(); } String imageType = imgName.substring(imgName.lastIndexOf(".")); // 构建目标文件的路径 String filePath = uploadDir + "/" + randomName; // 将文件保存到目标位置 file.transferTo(new File(filePath)); // 返回成功响应 HashMap hashMap = new HashMap(2); hashMap.put("name", originalFileName); hashMap.put("url", randomName); String imageType = randomName.substring(randomName.lastIndexOf(".")); UploadResultVO uploadResultVO = new UploadResultVO(); uploadResultVO.setOriginal(imgName); uploadResultVO.setName(imgName); uploadResultVO.setUrl(filePath); uploadResultVO.setSize(multipartFile.getSize()); uploadResultVO.setOriginal(randomName); uploadResultVO.setName(randomName); uploadResultVO.setUrl("/api/files/" + randomName); uploadResultVO.setSize(10L); uploadResultVO.setType(imageType); uploadResultVO.setState("SUCCESS"); return uploadResultVO; } catch (IOException e) { logger.error(e.getMessage(), e); e.printStackTrace(); // 返回失败响应 return Result.fail(500, "文件上传失败"); } } else { UeditorConfigVO ueditorConfigVO = new UeditorConfigVO(); @@ -79,7 +107,6 @@ ueditorConfigVO.setImagePathFormat(""); return ueditorConfigVO; } return null; } src/main/java/com/ycl/jxkg/controller/common/UploadController.java
New file @@ -0,0 +1,95 @@ package com.ycl.jxkg.controller.common; import com.ycl.jxkg.base.Result; import com.ycl.jxkg.config.RuoYiConfig; import lombok.RequiredArgsConstructor; import org.springframework.http.MediaType; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.util.HashMap; import java.util.UUID; /** * @author:xp * @date:2024/5/15 17:02 */ @RestController @RequiredArgsConstructor @RequestMapping("/api/upload") public class UploadController { private final RuoYiConfig ruoYiConfig; /** * 通用上传请求(单个) */ @PostMapping("/upload") public Result uploadFile(MultipartFile file) throws Exception { // 检查文件是否为空 if (file.isEmpty()) { return Result.fail(500, "上传的文件为空"); } try { // 获取文件名 String originalFileName = StringUtils.cleanPath(file.getOriginalFilename()); String randomName = UUID.randomUUID().toString().replace("-", "") + originalFileName.substring(originalFileName.lastIndexOf(".")); // 指定文件存储路径 String uploadDir = ruoYiConfig.getUrl(); // 修改为您希望存储的目录 // 如果目录不存在,则创建目录 File dir = new File(uploadDir); if (!dir.exists()) { dir.mkdirs(); } // 构建目标文件的路径 String filePath = uploadDir + "/" + randomName; // 将文件保存到目标位置 file.transferTo(new File(filePath)); // 返回成功响应 HashMap hashMap = new HashMap(2); hashMap.put("name", originalFileName); hashMap.put("url", randomName); return Result.ok(hashMap); } catch (IOException e) { e.printStackTrace(); // 返回失败响应 return Result.fail(500, "文件上传失败"); } } /** * 下载文件(单个) */ @GetMapping("/download") public void download(@RequestParam String url, @RequestParam String fileName, HttpServletResponse response) throws Exception { // 提取文件路径 String filePath = ruoYiConfig.getUrl() + File.separator + url; File file = new File(filePath); // 检查文件是否存在 if (!file.exists()) { throw new RuntimeException("文件不存在"); } // 读取文件内容 byte[] fileContent = Files.readAllBytes(file.toPath()); // 设置响应头 response.setHeader("Content-Disposition", "attachment; filename=" + fileName); response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); // 将文件内容写入响应输出流 response.getOutputStream().write(fileContent); response.getOutputStream().flush(); } } src/main/resources/application-dev.yml
@@ -1,6 +1,10 @@ logging: path: ./log/ upload: # 文件路径 示例( Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath) url: E:/ycl/file spring: datasource: url: jdbc:mysql://42.193.1.25:3306/xzs?useSSL=false&useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&allowPublicKeyRetrieval=true&allowMultiQueries=true src/main/resources/application-prod.yml
@@ -1,6 +1,10 @@ logging: path: /usr/log/xzs/ upload: # 文件路径 示例( Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath) url: /usr/local/file spring: datasource: url: jdbc:mysql://localhost:3306/xzs?useSSL=false&useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&allowPublicKeyRetrieval=true&allowMultiQueries=true src/main/resources/application.yml
@@ -70,6 +70,11 @@ hikari: idle-timeout: 600000 #10 min max-lifetime: 1800000 #30 min servlet: multipart: max-file-size: 50MB max-request-size: 500MB #runningtime environment profiles: active: dev src/main/resources/mapper/ExamPaperAnswerMapper.xml
@@ -71,6 +71,7 @@ question_correct, question_count, do_time, a.status, create_user, a.create_time, b.real_name AS userName FROM t_exam_paper_answer a LEFT JOIN t_user b ON a.create_user = b.id INNER JOIN t.exam c ON a.exam_paper_id = c.exam_paper_id AND c.status = 'finished' <where> <if test="examPaperId != null"> AND exam_paper_id = #{examPaperId}