必须执行php artisan storage:link命令,否则storage::url()生成的链接将404;上传文件时禁用move()返回值存库,应改用storeas()+storage::url()获取可访问url;头像更新需显式指定disk('public')删除旧文件;laravel-filemanager路由必须加auth中间件并关闭allow_multi_user。

在Laravel项目中配置文件管理功能时,常因路径未打通、权限未隔离、上传后路径存错或旧文件未清理,导致前端图片404、用户间文件互相可见、数据库存的是临时路径而非可访问URL。这些问题一旦上线就引发大量用户投诉,修复成本远高于初期规范配置。
确保public目录能被Web服务器直接访问
执行php artisan storage:link命令,将storage/app/public软链接到public/storage目录。
这一步必须做,否则所有通过Storage::url()生成的链接都会返回404。Nginx/Apache默认不解析storage子目录,只认public下的路径。
【未执行此命令是90%图片无法显示的根源】
正确存储上传文件的可访问路径
不要直接用$request->file('avatar')->move(...)的返回值存入数据库——它返回的是File对象,转成字符串就是临时路径(如/tmp/phpXXXXXX)。
方法一:用storeAs() + Storage::url()
先调用$path = $request->avatar->storeAs('avatars', $filename, 'public'),再用Storage::url($path)获取可访问URL,存入数据库字段。
方法二:手动拼接(仅限public磁盘)
若已确认文件存于public/avatars/下,可直接存相对路径avatars/{$filename},前端用{{ asset($user->avatar) }}渲染。
【存临时路径会导致数据库里全是/tmp/xxx,永远无法在网页上显示】
头像更新时安全删除旧文件
第一步:获取当前用户旧头像路径,例如$oldPath = Auth::user()->avatar;
第二步:判断该路径是否非空且文件实际存在:if ($oldPath && Storage::disk('public')->exists($oldPath));
第三步:执行删除:Storage::disk('public')->delete($oldPath);
第四步:上传新头像并保存新路径。
注意:必须显式指定disk('public'),否则Storage::delete()默认走local盘,删不到public目录下的文件。
UniSharp/laravel-filemanager基础路由与权限加固
在routes/web.php中按如下方式注册路由:
Route::group(['prefix' => 'laravel-filemanager', 'middleware' => ['web', 'auth']], function () { \UniSharp\LaravelFilemanager\Lfm::routes(); });
务必包含auth中间件——这是硬性安全底线。没有它,任何未登录用户都能访问/laravel-filemanager并上传、遍历、删除服务器任意文件。
发布配置后,打开config/lfm.php,将'allow_multi_user' => false设为false(默认true),避免多用户共用同一文件库;若需隔离,改用'user_field' => 'id'并配合自定义user_folder_name逻辑。
大文件上传失败的定位与修复
当上传超过2MB的文件报错“Request Entity Too Large”或直接500,先检查三处限制:
① PHP配置:upload_max_filesize和post_max_size需同时调大,且post_max_size ≥ upload_max_filesize;
② Nginx配置:client_max_body_size 10M;加在server块内;
③ Laravel验证规则:'file|max:10240'(单位KB)要与上述两处一致。
改完PHP和Nginx配置后必须重启服务,仅重载Nginx不生效。











