Laravel 5.5中Storage::put报file_put_contents目录不存在错误求助
我之前在Windows环境下开发Laravel项目时也碰到过几乎一模一样的坑,结合你的报错信息和描述,问题主要出在路径分隔符混合和Laravel存储逻辑的细节上,给你梳理下解决步骤:
问题到底出在哪?
从报错的路径就能看出来:E:\Projects\2017\releases\storage\app\srt/SiteName/df01c6a46702639c/0f3e86c003030527.srt,这里同时混了Windows的反斜杠\和Unix的正斜杠/。虽然Windows表面上能识别两种分隔符,但Laravel的文件处理组件在刚创建完父目录就写入文件时,很容易因为路径解析不一致触发"找不到文件或目录"的错误——哪怕你已经看到目录建好了,系统可能还没同步状态。
另外,你传入Storage::put的是绝对路径(开头带/),但Laravel的Storage默认是基于配置的存储根目录(默认是storage/app)来处理相对路径的,绝对路径反而会打乱它的解析逻辑。
一步步解决
1. 用相对路径+Laravel自动处理分隔符
别自己写带斜杠的绝对路径了,直接给相对路径,让Laravel帮你适配Windows的路径格式:
// 去掉开头的斜杠,用相对路径 $file_store = 'srt/SiteName/df01c6a46702639c/0f3e86c003030527.srt'; $file_data = 'srt文件内容'; // 直接调用put,Laravel会自动转成Windows的反斜杠路径 Storage::put($file_store, $file_data);
如果想确认最终路径对不对,可以用Storage::path($file_store)打印出来看看,正常应该是全反斜杠的Windows路径。
2. 手动确保父目录存在(保险操作)
有时候Windows的文件系统缓存会导致Laravel创建目录后没法立刻识别,手动先创建目录再写文件能规避这个问题:
$directory = 'srt/SiteName/df01c6a46702639c'; // 先检查目录是否存在,不存在就创建 if (!Storage::exists($directory)) { Storage::makeDirectory($directory); } // 再拼接文件名写入 Storage::put($directory . '/0f3e86c003030527.srt', $file_data);
makeDirectory会自动处理路径分隔符,不用担心跨系统的问题。
3. 检查storage目录权限
Windows下权限问题很容易被忽略,右键storage/app目录,选「属性」→「安全」,确保当前登录的用户有写入权限——有时候目录看起来创建了,但实际没权限写文件,也会报类似的错。
4. 用disk方法明确指定存储磁盘
如果你的配置里有多个存储磁盘,或者怕默认逻辑出问题,直接指定local磁盘更稳妥:
Storage::disk('local')->put($file_store, $file_data);
这个和直接调用Storage::put效果差不多,但逻辑更清晰,适合复杂一点的存储场景。
快速验证
修改代码后,可以先执行这条代码看看最终路径是否正确:
dd(Storage::path($file_store));
输出应该是标准的Windows路径,比如:
E:\Projects\2017\releases\storage\app\srt\SiteName\df01c6a46702639c\0f3e86c003030527.srt
内容的提问来源于stack exchange,提问作者Paolo_Mulder

