开场白:老铁们对于文章有错误、不准确,或需要补充的请留言讨论 ,大家共同学习。如果觉得还不错的请关注、留言、点赞 、收藏。 创作不易,且看且珍惜
springboot 项目jar包后上传到 服务器目录
当我们项目上传文件事,大点项目会把文件上传到 对象存储 或是自己的文件服务器 。小项目会存储到服务器上 但又不能存储到项目当中,存储到项目当中每次更新项目时,上传的文件时文件对丢失,所以我们都会存储到项目jar外,服务器上的,这样文件就不会每次更新项目就丢失了 。
对于war包我们可以修改tomcat配置文件路径 可以参考我的另一篇博客 Tomcat 配置上传文件到项目外的路径
对于jar包 因为我们无法操作jar包内容,所以我们只能将文件存放在别的位置,与jar包同级的目录是一个不错的选择。或是服务根路径等。
server:
# 服务器的HTTP端口,默认为8080
port: 8080
servlet:
# 应用的访问路径
context-path: /demo
domain: http://127.0.0.1:8080${server.servlet.context-path}
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.multipart.MultipartFile;
import java.io.InputStream;
import java.io.Serializable;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Date;
import java.util.List;
@Slf4j
public class FileUtil{
// 文件存放位置: /fileupload/images 服务器根路径; fileupload/images 项目jar同级目录
private static String UPLOAD_PATH = "/fileupload/images";
//服务器域名
@Value("${domain}")
private String domain;
@PostMapping("/upload")
public String upload(MultipartFile file) {
if (file.isEmpty()) {
AjaxResult.error("请上传文件!");
}
String fileName = file.getOriginalFilename().toLowerCase();
if(!fileName.endsWith("png")&&!fileName.endsWith("jpg")){
AjaxResult.error("文件格式错误!仅支持png/jpg");
}
int lastIndexOf=fileName.lastIndexOf(".")+1;
String suffix = fileName.substring(lastIndexOf);
try {
String name = IdUtil.simpleUUID()+"."+suffix;
Path directory = Paths.get(UPLOAD_PATH);
InputStream inputStream = file.getInputStream();
if (!Files.exists(directory)) {
Files.createDirectories(directory);
}
Files.copy(inputStream, directory.resolve(name));
String filePath = domain+UPLOAD_PATH + "/" + name;
return filePath;
}catch (Exception e){
log.error("上传banner失败!",e.getMessage());
return null;
}
}
}
此时可以上传 但是通过路径我们无法访问文件。项目上要进行配置。
springboot 2
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
* 资源映射路径
*/
@Configuration
public class MyWebAppConfigurer implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
/**
* 资源映射路径
* addResourceHandler:访问映射路径
* addResourceLocations:资源绝对路径
*/
//linux
registry.addResourceHandler("/fileupload/**").addResourceLocations("file:/fileupload/");
//windows
//registry.addResourceHandler("/fileupload/**").addResourceLocations("file:D:/fileupload/");
}
}
springboot 1.0
@Configuration
public class MyWebMvcConfigurerAdapter extends WebMvcConfigurerAdapter {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
/**
* 资源映射路径
* addResourceHandler:访问映射路径
* addResourceLocations:资源绝对路径
*/
registry.addResourceHandler("/image/**").addResourceLocations("file:D:/temp/image/");
}
}
当然 项目拦截器等都要放行 也要 放行,如不验证token等。 当然如果你是用的docker 部署 也要把fileupload 文件夹透出到服务器上。