Laravel 7中Storage exists方法无法检测子目录文件问题求助
Laravel 7 检测S3多级目录文件存在的解决方案
问题原因
Laravel 7的S3存储驱动中,exists方法接收的路径不能以斜杠开头——S3的对象键(Key)本身没有前置斜杠,你的代码用了/ServiceReport/开头的路径,这直接导致检测失效。另外手动拼接路径也容易出错,不如直接从完整URL提取正确的对象键。
修复方案
方案1:移除路径开头的斜杠
直接修正现有代码的路径格式,去掉开头的/:
$name = 'https://selvamani-s3.amazonaws.com/ServiceReport/service_report_1657541906.pdf'; $basename = basename($name); // 去掉路径开头的斜杠 if ($remoteStorage->exists('ServiceReport/' . $basename)) { echo "File Exists"; } else { echo "File Not Exists"; }
方案2:从URL提取完整对象键(更可靠)
利用完整的S3对象URL直接解析出对象键,避免手动拼接的误差:
$name = 'https://selvamani-s3.amazonaws.com/ServiceReport/service_report_1657541906.pdf'; // 解析URL并提取主机名后的路径部分 $urlParts = parse_url($name); $objectKey = ltrim($urlParts['path'], '/'); // 确保移除开头的斜杠 if ($remoteStorage->exists($objectKey)) { echo "File Exists"; } else { echo "File Not Exists"; }
额外说明
Laravel 7的S3存储驱动要求所有对象路径(键)必须是无前置斜杠的相对路径,这和S3自身的对象键规则完全一致。如果你的remoteStorage是通过Storage::disk('s3')实例化的,要确保config/filesystems.php里的S3驱动配置正确,尤其是bucket参数要和目标存储桶匹配。
内容的提问来源于stack exchange,提问作者Selvamani P
相关产品推荐
相关产品推荐

