Laravel 5.4上传图片权限为600而非644的解决方法咨询
解决Laravel 5.4上传图片权限为600的问题
这个问题我之前也碰到过,Laravel 5.4的文件系统组件默认会给上传文件设置0600权限(仅文件所有者可读可写),这是出于安全考量,但咱们需要调整成web服务器可访问的0644权限,下面是两种实用的解决办法:
方案一:修改文件系统配置(推荐)
直接在config/filesystems.php里给你的upload磁盘配置默认权限,一劳永逸:
找到disks数组中的upload配置项,添加permissions参数:
'disks' => [ // ...其他磁盘配置 'upload' => [ 'driver' => 'local', 'root' => storage_path('app/uploads'), // 替换成你的实际存储路径 'permissions' => [ 'file' => 0644, 'dir' => 0755, ], ], ],
配置完成后,后续通过store方法上传的文件会自动应用0644权限,文件夹则会设置为0755(保证web服务器能访问目录)。
方案二:上传后手动设置权限
如果不想改动全局配置,也可以在上传完成后手动调整文件可见性:
修改你的store方法,在store操作后添加一行代码:
public function store(PosterRequest $request) { $poster = Poster::create($request->all()); if ($request->hasFile('image')) { $filename = $request->file('image')->store('photos', ['disk' => 'upload']); // 手动将文件设置为公开可读,对应权限就是0644 \Storage::disk('upload')->setVisibility($filename, 'public'); $poster->update(['image' => $filename]); } $poster->categories()->attach($request->categories); return redirect(route('posters.edit', ['id' => $poster->id])); }
setVisibility方法会自动把文件权限调整为对应磁盘配置里public权限的数值,默认情况下public对应的就是0644。
要是你想用原生PHP方法直接设置(不推荐,尽量用Laravel的文件系统API),也可以这么写:
$filePath = storage_path('app/uploads/' . $filename); chmod($filePath, 0644);
额外注意
- 要确保你的web服务器用户(比如www-data)对存储目录有读写权限,不然就算设置了文件权限,可能还是无法正常访问。
- 如果你用的是云存储(比如S3),权限配置逻辑会不一样,但你的场景是虚拟主机本地存储,上面的方案完全适用。
内容的提问来源于stack exchange,提问作者Amir
相关产品推荐
相关产品推荐

