Symfony使用getenv()时文件上传路径为何总是以/public开头?
Symfony文件上传路径配置解决方案
问题原因
你在.env里配置的UPLOAD_PATH=".var/uploads/docs"是相对路径,Symfony在控制器(Web请求上下文)执行时,当前工作目录默认是项目的public/文件夹,所以这个相对路径会被解析为public/var/uploads/docs,和预期的项目根目录下的var文件夹不符。
解决方法
方法1:直接在.env里配置带项目根的完整路径
利用Symfony自动设置的KERNEL_PROJECT_DIR环境变量(指向项目根目录),修改.env配置:
UPLOAD_PATH=${KERNEL_PROJECT_DIR}/var/uploads/docs
之后在控制器里直接获取即可:
$uploadPath = getenv('UPLOAD_PATH'); // 执行文件移动操作
方法2:配置相对路径,在控制器里拼接项目根
先修改.env去掉路径前的点:
UPLOAD_PATH=var/uploads/docs
然后在控制器里结合项目根环境变量拼接完整路径:
$projectDir = getenv('KERNEL_PROJECT_DIR'); $uploadPath = $projectDir . '/' . getenv('UPLOAD_PATH'); // 执行文件移动操作
额外提示(更规范的Symfony方式)
如果不想直接用getenv(),可以把环境变量映射为容器参数,在config/services.yaml里添加:
parameters: upload_path: '%kernel.project_dir%/%env(UPLOAD_PATH)%'
.env保持UPLOAD_PATH=var/uploads/docs,之后在控制器里通过参数获取:
$uploadPath = $this->getParameter('upload_path');
内容的提问来源于stack exchange,提问作者Anarkie
相关产品推荐
相关产品推荐

