龚焕茏
2024-06-12 bf3dcc63f2884284e2ea195b0a6307734f9d4c52
feat:本地文件上传、预览
6个文件已修改
2个文件已添加
244 ■■■■■ 已修改文件
src/main/java/com/ycl/jxkg/config/RuoYiConfig.java 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ycl/jxkg/config/spring/mvc/WebMvcConfiguration.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ycl/jxkg/controller/admin/UploadController.java 63 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ycl/jxkg/controller/common/UploadController.java 95 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-dev.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-prod.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/ExamPaperAnswerMapper.xml 1 ●●●● 补丁 | 查看 | 原始文档 | 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}