FoundException: /tmp/tomcat.8081.13957116858386095535/work/Tomcat/localhost/ROOT/…………问题的解决
报错原因
后端现在把“uploads(我的上传路径)”当成了 Web 应用目录下的相对路径,Tomcat 在容器里会把 WAR 解压到 /tmp/tomcat…/work/…/ROOT/,所以最终写到了:
/tmp/tomcat…/ROOT/uploads/20260205/…png
所以错误就出在路径问题上,接下来我们走一遍上传的正确流程,问题迎刃而解
上传路径流程:
简单流程:请求–>转发请求到后端–>后端发出的上传转发到容器—>容器和服务器(宿主机)互通挂载–>配置环境–>完成
1.后台前端/小程序:
发送请求到服务器后端:https://你的域名/api/common/upload/single(这是我的上传路径)
2.服务器:
2.1转发
将请求转到发到服务器后端,剥去api前缀:
转发网址请求:https://你的域名/api/common/upload/single —> http://127.0.0.1:8081/common/upload/single
admin.conf:
location = /api/common/upload/single {
client_max_body_size 100M;
proxy_pass http://127.0.0.1:8081/common/upload/single;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
请求发到服务器后端后,服务器后端会在指定路径进行上传图片或其他,但是后端的指定路径之前是在本地运行的,部署到服务器上后,自然要用配置变动指定位置来对应到docker里。
转发服务器后端发出的上传路径:uploads/20260210/abc123_xxx.jpg —> /app/uploads/20260210/abc123_xxx.jpg —> 服务器uploads目录
location ^~ /upload/ {
alias /app/uploads/;
expires 30d;
add_header Cache-Control "public, immutable";
try_files $uri =404;
}
2.2挂载
因为是在docker里,不是在宿主机里,所以要将宿主机的目录挂载到容器里的目录上,就像宿主机目录和容器目录之间连接了一根管子来达成同步,容器里的目录文件就跟被挂载的宿主机目录里的内容一致了,就像双向通信。
docker-compose.yml:
backend:
volumes:
#宿主机上传目录./uploads ---挂载到---> 容器目录/app/uploads
- ./uploads:/app/uploads
nginx:
volumes:
#宿主机上传目录./uploads ---挂载到---> 容器目录/app/uploads
- ./uploads:/app/uploads:ro
2.3注入配置
以下两种皆可用,2.2更加强势,2.1更加灵活
2.3.1方法1:ACTIVE注入配置
docker-compose.yml:
environment:
- SPRING_PROFILES_ACTIVE=dev #注意,一定要选到后端需要的配置,并且后端必须要有此环境配置才行,比如这里是=default,application.yml里写的 =dev也不行,会忽略dev配置
2.3.2方法2:环境变量注入配置
环境变量直接写死路径:
docker-compose.yml:
environment:
WURENJI_FILE_UPLOAD_PATH: "/app/uploads/" #容器上传目录
WURENJI_FILE_ACCESS_URL_PREFIX: "https://你的域名/uploads/" #容器访问目录
注意,这里environment的语法有两种,一个是WURENJI_FILE_UPLOAD_PATH: "/app/uploads/"这种带冒号的,一个是- SPRING_PROFILES_ACTIVE=default这种带- 和=的,environment:里的语法必须一致,不能同时出现这两种方式语法,否则报错
更多推荐


所有评论(0)