将图片资源保存到服务器的盘符中

服务类

  • 系统盘符:file-path.disk(可能会变,配置配置文件dev中)
  • 文件根路径:file-path.root-path(可能会变,配置配置文件dev中)
  • http协议的Nginx的映射前缀:PrefixConstant.HTTP_PREFIX
java 复制代码
package com.sky.service;

import com.sky.constant.MessageConstant;
import com.sky.constant.PrefixConstant;
import com.sky.exception.BaseException;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;

@Service
public class CommonService {

    @Value("${file-path.disk}")
    private String disk;

    @Value("${file-path.root-path}")
    private String rootPath;


    /**
     * 文件上传
     *
     * @param parentPath 父路径
     * @param file       文件
     */

    public String upload(String parentPath, MultipartFile file) {
        // Upload file
        String fileName = file.getOriginalFilename();
        // Get full path using system file separator
        String fullPath = disk + ":" + File.separator + rootPath + File.separator + parentPath;
        // Create the directory if it doesn't exist
        File directory = new File(fullPath);
        if (!directory.exists()) {
            directory.mkdirs();
        }
        // Create the destination file
        File dest = new File(directory, fileName);
        try {
            file.transferTo(dest);
        } catch (IOException e) {
            throw new BaseException(MessageConstant.UPLOAD_FAILED);
        }
        // Return the file access URL
        return PrefixConstant.HTTP_PREFIX +
               fileName;
    }
}

配置文件

总配置文件

yml 复制代码
sky:
  jwt:
    # 设置jwt签名加密时使用的秘钥
    admin-secret-key: itcast
    # 设置jwt过期时间
    admin-ttl: 720000000
    # 设置前端传递过来的令牌名称
    admin-token-name: token
  file-path:
    disk: ${file-path.disk}
    root-path: ${file-path.root-path}

开发环境配置文件

yml 复制代码
file-path:
  disk: D
  root-path: sky_take_out

常量类

文件路径常量

java 复制代码
package com.sky.constant;

public class SystemPathConstant {
   public static final String COMMON = "common";


    // 构造函数私有化
     private SystemPathConstant() {
     }
}

nginx路径映射常量

java 复制代码
package com.sky.constant;

public class PrefixConstant {

   public static final String HTTP_PREFIX = "http://localhost/files/";


   // 构造函数私有化
    private PrefixConstant() {
    }
}

controller层

别人上传完图片之后把访问路径给别人(http的路径,不是本地路径)

java 复制代码
    @PostMapping("/upload")
    @ApiOperation("文件上传")
    public Result<String> upload(MultipartFile file) {
        log.info("文件上传:{}", file);
        // 将文件上传到本地文件夹下
        // 返回文件的访问路径
        String filePath = commonService.upload(SystemPathConstant.COMMON,file);
        return Result.success(filePath);
    }

配置类放行静态资源

java 复制代码
package com.sky.config;

import com.sky.constant.SystemPathConstant;
import com.sky.interceptor.JwtTokenAdminInterceptor;
import com.sky.json.JacksonObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;

import java.util.List;

/**
 * 配置类,注册web层相关组件
 */
@Configuration
@Slf4j
public class WebMvcConfiguration extends WebMvcConfigurationSupport {

    @Autowired
    private JwtTokenAdminInterceptor jwtTokenAdminInterceptor;

    @Value("${file-path.disk}")
    private String disk;

    @Value("${file-path.root-path}")
    private String rootPath;


   ..... 其他配置一万行
    /**
     * 设置静态资源映射
     * @param registry
     */
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/doc.html").addResourceLocations("classpath:/META-INF/resources/");
        registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
        // Map the file directory to a URL path
        registry.addResourceHandler("/files/**")
                .addResourceLocations("file:" +
                        disk + ":" + "/" +
                        rootPath + "/" +
                        SystemPathConstant.COMMON + "/");

    }


}

nginx映射

静态资源到本地盘符(这就你的代码中配置的判读)

  • 这个文件是开发环境的,正式环境按照正式环境的路径和盘符配置
    改完记得重启一下
js 复制代码
       location /files/ {
            alias D:/sky_take_out/common/;
        }
  • 有的时候会访问403 异常
  • 文件权限异常
  • 访问一定要访问具体文件,不要访问到文件夹
相关推荐
yzx9910132 小时前
生活在数字世界:一份人人都能看懂的网络安全生存指南
运维·开发语言·网络·人工智能·自动化
橙*^O^*安3 小时前
Go 语言基础:变量与常量
运维·开发语言·后端·golang·kubernetes
阿拉斯加大闸蟹4 小时前
基于RDMA 通信的可负载均衡高性能服务架构
运维·架构·负载均衡
2301_780789665 小时前
渗透测试真的能发现系统漏洞吗
服务器·网络·安全·web安全·网络安全
不是吧这都有重名5 小时前
为什么ubuntu大文件拷贝会先快后慢?
linux·运维·ubuntu
sunshine-sm5 小时前
CentOS Steam 9安装 Redis
linux·运维·服务器·redis·centos
棒棒的唐6 小时前
armbian平台ubuntu环境下telnet安装及启动,给pantherX2增加一个应急通道
linux·运维·armbian·telnetd
纳切威6 小时前
CentOS 7部署Zabbix5.0
linux·运维·centos·zabbix
sunshine-sm7 小时前
CentOS Steam 9安装 MySQL 8
linux·运维·服务器·数据库·mysql·centos·centos stream
bug攻城狮7 小时前
CentOS 7 快速检查软件包是否已安装的5种方法
linux·运维·centos