文件上传及静态资源映射

工具类:


/**
 * 文件上传本地服务器工具类
 *
 * @Author:H
 * @Date :2024/8/16 9:30
 */

@Slf4j
public class FileUploadUtils {
    /**
     * 单文件上传
     * 上传到指定路径
     * @param file 上传的文件
     * @param dir 分配的存放路径(商品:goods)
     */
    public static Result<UploadFileVO> upload(MultipartFile file, String dir) {
        if(file.isEmpty()) {
            return Result.fail("上传文件不能为空");
        }
        log.debug("LocalUploadConfig.getMaxSize():{}"+LocalUploadConfig.getMaxSize());
        log.debug(" LocalUploadConfig.getPatchPrefix():{}"+ LocalUploadConfig.getPrefix());
        if(LocalUploadConfig.getMaxSize() != null && LocalUploadConfig.getMaxSize() > 0) {//文件大小
            long size = file.getSize();
            if(size > LocalUploadConfig.getMaxSize() * 1024 * 1024) {
                return Result.fail("上传文件大小不能超过" + LocalUploadConfig.getMaxSize() + "MB!");
            }
        }
        //获取当前时间年/月/日
        String date = DateUtil.format(DateUtil.date(), "yyyy/MM/dd");


        // 文件保存路径
        String savePath = LocalUploadConfig.getPrefix() + File.separator +  dir + File.separator + date;

        if(savePath == null || "".equals(savePath.trim())) {
            return Result.fail("上传文件失败:存放路径为空!");
        }

        //创建存放目录
        File saveFiles=new File(savePath);
        if(!saveFiles.exists()){
            saveFiles.mkdirs();//创建文件夹,如果上级目录不存在,则挨个创建目录
        }

        //原始文件名
        String originalName = file.getOriginalFilename();
        // 获取原始文件名的后缀
        String extension = originalName.substring(originalName.lastIndexOf('.') + 1);
        // 构建新文件名
        String newFileName = IdUtil.simpleUUID() + "." + extension;
        //指定需要保存的文件名称和路径
        File saveFile = FileUtil.newFile(savePath + File.separator + newFileName);
        try {
//            file.transferTo(saveFile);//保存文件到指定目录
            FileUtil.writeBytes(file.getBytes(), saveFile);

            String url = "/" +  dir + "/" + date+"/"+newFileName;
            UploadFileVO uploadFileVO = new UploadFileVO();
            uploadFileVO.setUrl(url);
            uploadFileVO.setNewFileName(newFileName);
            uploadFileVO.setOriginalFilename(originalName);
            uploadFileVO.setUploadTime(LocalDateTime.now());

            return Result.success("文件上传成功", uploadFileVO);
        } catch (Exception e) {
            log.error("文件保存到临时目录失败!" + e.getMessage());
            return Result.fail("文件保存到临时目录失败!" + e.getMessage());
        }
    }

    /**
     * 多文件上传
     * @param files 上传的文件
     * @param dir 分配的存放路径(商品:goods)
     * @return
     */
    public static Result<List<UploadFileVO>> uploads(MultipartFile[] files, String dir){
        List<UploadFileVO> uploadFileList = new ArrayList<>();

        for (MultipartFile file : files) {
            if(file.isEmpty()) {
                return Result.fail("上传文件不能为空");
            }
            if(LocalUploadConfig.getMaxSize() != null && LocalUploadConfig.getMaxSize() > 0) {//文件大小
                long size = file.getSize();
                if(size > LocalUploadConfig.getMaxSize() * 1024 * 1024) {
                    return Result.fail("上传文件大小不能超过" + LocalUploadConfig.getMaxSize() + "MB!");
                }
            }
            //获取当前时间年/月/日
            String date = DateUtil.format(DateUtil.date(), "yyyy/MM/dd");


            // 文件保存路径
            String savePath = LocalUploadConfig.getPrefix() + File.separator + dir + File.separator + date;

            if(savePath == null || "".equals(savePath.trim())) {
                return Result.fail("上传文件失败:存放路径为空!");
            }

            //创建存放目录
            File saveFiles=new File(savePath);
            if(!saveFiles.exists()){
                saveFiles.mkdirs();//创建文件夹,如果上级目录不存在,则挨个创建目录
            }

            //原始文件名
            String originalName = file.getOriginalFilename();
            // 获取原始文件名的后缀
            String extension = originalName.substring(originalName.lastIndexOf('.') + 1);
            // 构建新文件名
            String newFileName = IdUtil.simpleUUID() + "." + extension;
            //指定需要保存的文件名称和路径
            File saveFile = FileUtil.newFile(savePath + File.separator + newFileName);
            try {
//                file.transferTo(saveFile);//保存文件到指定目录
                FileUtil.writeBytes(file.getBytes(), saveFile);
                String url = "/" +  dir + "/" + date+"/"+newFileName;
                UploadFileVO uploadFileVO = new UploadFileVO();
                uploadFileVO.setUrl(url);
                uploadFileVO.setNewFileName(newFileName);
                uploadFileVO.setOriginalFilename(originalName);
                uploadFileVO.setUploadTime(LocalDateTime.now());
                uploadFileList.add(uploadFileVO);
            } catch (Exception e) {
                log.error("文件保存到临时目录失败!" + e.getMessage());
                return Result.fail("文件保存到临时目录失败!" + e.getMessage());
            }
        }

        return Result.success("文件上传成功", uploadFileList);

    }

    /**
     * 删除文件
     * @param filePath 文件路径
     * @return
     */
    public static Result delete(String filePath){
        if(filePath == null || "".equals(filePath.trim())) {
            return Result.fail("删除文件失败:文件路径为空!");
        }
        File file = new File( LocalUploadConfig.getPrefix()  + filePath);
        if(!file.exists()){
            return Result.fail("删除文件失败:文件不存在!");
        }
        if(file.isDirectory()){
            return Result.fail("删除文件失败:文件路径为目录!");
        }
        if(file.delete()){
            return Result.success("删除文件成功");
        }else{
            return Result.fail("删除文件失败");
        }
    }


}

配置类:


/**
 * 本地文件上传相关配置
 *
 * @Author:H
 * @Date :2024/8/15 19:47
 */
@Component
@ConfigurationProperties(prefix = "uploadlocal")
public class LocalUploadConfig {



    /**
     * 文件上传路径
     */
    private static String prefix;

    private static Integer maxSize;


    public static String getPrefix() {
        return prefix;
    };

    public void setPrefix(String prefix) {
        LocalUploadConfig.prefix = prefix;
    };

    public static Integer getMaxSize() {
        return maxSize;
    };

    public void setMaxSize(Integer maxSize) {
        LocalUploadConfig.maxSize = maxSize;
    };



}

配置文件:

#文件上传到本地服务器配置
uploadlocal:
  #文件上传路径前缀
  prefix: src/main/resources/static/uploadFile
  #文件上传大小MB
  maxSize: 30

接口类:

/**
 * 文件上传接口
 */
@RestController
@RequestMapping("/file")
public class FileController {



    /**
     * 通用上传请求(单个)
     * @param file 文件
     * @param dir 存放路径(例子:商品:goods;店铺:shop)
     * @return
     * @throws Exception
     */
    @PostMapping("/upload")
    @SaIgnore
    public Result<UploadFileVO> uploadFile(MultipartFile file, String dir) throws Exception
    {
       return FileUploadUtils.upload(file,dir);
    }

    /**
     * 通用上传请求(多个)
     * @param files 文件ls
     * @param dir 存放路径(例子:商品:goods;店铺:shop)
     * @return
     * @throws Exception
     */
    @PostMapping("/uploads")
    @SaIgnore
    public Result<List<UploadFileVO>> uploadFiles(MultipartFile[] files, String dir) throws Exception
    {
       return FileUploadUtils.uploads(files,dir);
    }

    /**
     * 删除文件
     * @param filePath 文件存放路径
     * @return
     */
    @GetMapping("/delete")
    public Result delete(String filePath)
    {
        return FileUploadUtils.delete(filePath);
    }


}

资源映射:

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

   
    //跨域支持配置
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**") // 匹配所有路径
                .allowedOrigins("*") // 允许所有源
                .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") // 允许的HTTP方法
                .allowedHeaders("*") // 允许所有头信息
                //.allowCredentials(true) // 是否允许携带cookie,默认false
                .maxAge(3600); // 预检请求的有效期,单位秒
    }


    @Value("${uploadlocal.prefix}")
    private String prefix;

    //映射浏览器可以直接访问的本地路径
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        if (!prefix.endsWith(File.separator)) {
            prefix = prefix + File.separator;
        }
        registry.addResourceHandler("/api/**").addResourceLocations("file:" + prefix);
    }


}

成功返回示例:

{
    "code": 200,
    "message": "文件上传成功",
    "data": {
        "url": "//2024/08/20/78ede403bbcb47669aadf9a188b50317.wmv",
        "newFileName": "78ede403bbcb47669aadf9a188b50317.wmv",
        "originalFilename": "2D插值.wmv",
        "uploadTime": "2024-08-20 14:55:09"
    }
}

访问路径:(需要加上/api)

http://localhost:8080/api/test/2024/08/20/870da41dde1449279e85d8c03d36251e.jpg

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring MVC 静态文件访问配置主要是为了让 Web 应用能够直接提供静态资源(如 CSS、JavaScript、图片等)而不需要经过 Controller 的处理。这有助于提高应用的性能,因为静态资源请求可以直接从服务器的缓存或 CDN 加速服务中获取。以下是配置步骤: 1. **WebMvcConfigurer接口**: 在Spring MVC的应用上下文中,通常会使用`WebMvcConfigurer`接口或其扩展类来配置静态文件访问。你需要创建一个实现该接口的类,并覆盖`addResourceHandlers()`方法。 ```java @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/css/**") .addResourceLocations("classpath:/static/css/"); registry.addResourceHandler("/js/**") .addResourceLocations("classpath:/static/js/"); // 或者使用通配符表达式,比如处理所有以"/images/"开始的路径 registry.addResourceHandler("/images/**") .addResourceLocations("classpath:/static/images/"); } } ``` 2. **MultipartConfig支持**: 如果应用还需要处理上传文件,记得配置`multipartResolver`,避免与静态文件路径冲突。 3. **启用默认静态资源处理器**: Spring MVC 4.1及以上版本默认启用了一个名为`DefaultServletHandler`的处理器,用于处理静态资源。如果需要,可以在`DispatcherServlet`配置中禁用默认处理器并自定义。 4. **注意文件路径的前缀**: 以上配置中的路径 `/css/**` 表示访问 URL 以 `/css/` 开始的所有路径都会被映射到类路径下 `static/css/` 目录下的内容。确保你的静态资源目录结构与路径匹配。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值