You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 11:35:05