服务类
- 系统盘符:file-path.disk(可能会变,配置配置文件dev中)
- 文件根路径:file-path.root-path(可能会变,配置配置文件dev中)
- http协议的Nginx的映射前缀:PrefixConstant.HTTP_PREFIX
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;
}
}
配置文件
总配置文件
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}
开发环境配置文件
file-path:
disk: D
root-path: sky_take_out
常量类
文件路径常量
package com.sky.constant;
public class SystemPathConstant {
public static final String COMMON = "common";
// 构造函数私有化
private SystemPathConstant() {
}
}
nginx路径映射常量
package com.sky.constant;
public class PrefixConstant {
public static final String HTTP_PREFIX = "http://localhost/files/";
// 构造函数私有化
private PrefixConstant() {
}
}
controller层
别人上传完图片之后把访问路径给别人(http的路径,不是本地路径)
@PostMapping("/upload")
@ApiOperation("文件上传")
public Result<String> upload(MultipartFile file) {
log.info("文件上传:{}", file);
// 将文件上传到本地文件夹下
// 返回文件的访问路径
String filePath = commonService.upload(SystemPathConstant.COMMON,file);
return Result.success(filePath);
}
配置类放行静态资源
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映射
静态资源到本地盘符(这就你的代码中配置的判读)
- 这个文件是开发环境的,正式环境按照正式环境的路径和盘符配置
改完记得重启一下
location /files/ {
alias D:/sky_take_out/common/;
}
- 有的时候会访问403 异常
- 文件权限异常
- 访问一定要访问具体文件,不要访问到文件夹