我在Laravel和Storage
课上遇到了问题。
我已经为用户创建了一个上传表单,用于控制在帐户中用作徽标的图像。我使用了由File Storage启发的Laravel Flysystem。
保存图像时,我按以下步骤操作:
// Store the logo in the public filesystem, and define a 'public' visibility
$logo = $request->file('logo')->store('logos/'.$account->id, 'public');
// Save the path in the database
$account->update([
'logo' => $logo
]);
上传工作正常,我可以在相应的文件结构下找到上传的图片:storage\app\public\logos\1\automatic-filename.jpeg
在我看来,我检索图像网址如下:
<img src="{{ Storage::disk('public')->url($account->logo) }}" />
这给了我正确的道路:http://www.example.com/storage/logos/1/automatic-filename.jpeg
但无论我尝试什么,我都会在图像上得到403
禁止您无权访问此服务器上的/storage/logos/1/automatic-filename.jpeg。
我想我已经做好了一切:
php artisan storage:link
创建了从公共/存储到存储/ app / public的符号链接我真的不知道在哪里看......
如果有人遇到类似问题,请提前感谢您的意见!
最好的祝福,
弗拉德
从/public
内部,运行:
chown -R username:group storage
当然,当您在username:group
文件夹中运行username:group
时,使用与任何其他公共文件或文件夹相同的ls -l
组合替换public
。
对所有对我的解决方案感兴趣的人......
我发现Laravel不允许访问文件,因为/ storage /位于我的域的根目录之前,它指向/ public!
我将config / filesystem.php公共根路径驱动器更改为public:
原始配置:
'public' => [
'driver' => 'local',
'root' => storage_path('app/public'),
'url' => env('APP_URL').'/storage',
'visibility' => 'public',
],
修改配置:
'public' => [
'driver' => 'local',
'root' => public_path('uploads'),
'url' => env('APP_URL').'/uploads',
'visibility' => 'public',
],
现在所有与存储相关的路径都在公共文件夹中......我仍然可以使用方便的存储类!
希望能帮助到你。
弗拉德
我用root权限创建了php artisan storage:link
。因此,用户无法访问/ public / storage / ...目录。
使用命令/public
转到ls -l
文件夹,您将看到group:owner permissions。
chown -h storage yourgroup:yourusername
现在可从浏览器访问目录。
要访问存储文件夹,您必须在公用文件夹中具有符号链接。因此,从公共文件夹类型ls
查看存储链接。如果不存在或者是红色,则必须创建/更新它。
创建符号链接
从公共文件夹类型这样的ln -s /path/to/your/storage/public/ storage
修复符号链接
找到链接指向的位置:readlink -v storage
*指向新路径的链接:ln -sfn /path/to/your/storage/public/ storage
正如kJamesy所说,你应该检查你是否为你的文件设置了错误的所有者(例如,如果你用root创建了php artisan storage:link
)。
要解决此问题,请从/public
内部运行:
chown -R username:group storage
您还可以检查文件权限(当我使用rsync复制文件时,other
经常失去读取权限,导致403错误)。如果权限不正确,您可以通过调用insider / public来修复它:
find * -type d -exec chmod 755 {} \;
find * -type f -exec chmod 644 {} \;
转到laravel项目的根目录
用正确的名称替换USER:GROUP。
我猜这个你遇到的403问题是在共享主机中占有一席之地。使用php artisan storage:link
创建符号链接时,它包含storage/app/public
文件夹的完整绝对路径。这可能是服务器导致403响应的原因。
解决方案是创建一个符号链接,其中包含来自项目根目录的相对路径
ln -s ../storage/app/public public/storage
这应该解决权限问题。