Laravel本地文件下载报错:无法获取文件大小问题求助
核心原因
你遇到的问题根源在于传入Laravel Storage方法的是文件绝对路径,而Storage组件默认基于磁盘根目录拼接路径,导致最终生成重复的无效路径。
比如你的local磁盘根目录是storage/app,当你传入完整绝对路径C:/Users/tomva/Projects/laravel/storage/app/pph/xxx.pdf时,Flysystem会把这个路径直接拼接到磁盘根目录后,就生成了重复的无效路径:C:\Users\tomva\Projects\laravel\storage\app\C:/Users/tomva/Projects/laravel/storage/app/pph/xxx.pdf,自然无法读取文件大小。
而原生PHP函数is_file()、filesize()可以正常运行,是因为它们直接使用绝对路径访问文件系统,不需要经过Laravel Storage的路径拼接逻辑。
解决方案
方案1:传入磁盘相对路径
确保传给Storage::download()的$filePath是相对于磁盘根目录的相对路径。比如你的文件实际位置是storage/app/pph/482678575-0150974001684180496/1283_CO1SAL_202301_O.pdf,那么应该传入:
$filePath = 'pph/482678575-0150974001684180496/1283_CO1SAL_202301_O.pdf'; return Storage::download($filePath, $fileName);
方案2:从绝对路径转换为相对路径
如果你的业务逻辑只能拿到绝对路径,可以通过字符串处理截取掉磁盘根目录部分,得到相对路径:
use Illuminate\Support\Str; // 获取local磁盘的根目录绝对路径 $diskRoot = storage_path('app'); // 从绝对路径中提取相对路径 $relativePath = Str::after($filePath, $diskRoot . DIRECTORY_SEPARATOR); // 使用相对路径调用Storage方法 if (Storage::exists($relativePath)) { return Storage::download($relativePath, $fileName); }
验证路径正确性
可以通过Storage::disk('local')->path($relativePath)来生成正确的绝对路径,验证是否和你原本的$filePath一致,确认相对路径无误。
内容的提问来源于stack exchange,提问作者Tom Vaughan

