我在使用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
上传的文件以755权限保存在服务器上。所有相关文件夹都具有相同的权限。
我真的不知道在哪里看......
如果有人遇到类似的问题,请提前感谢您的意见!
致以最诚挚的问候,
维拉德
答案 0 :(得分:6)
从/public
内部,运行:
chown -R username:group storage
当然,在username:group
文件夹中运行username:group
时,使用与任何其他公共文件或文件夹相同的ls -l
组合替换public
。
答案 1 :(得分:2)
对所有对我的解决方案感兴趣的人......
我发现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',
],
现在所有与存储相关的路由都在公共文件夹中......我仍然可以使用方便的存储类!
希望它有所帮助。
维拉德
答案 2 :(得分:1)
我使用 root 权限创建了php artisan storage:link
。因此,用户无法访问/ public / storage / ...目录。
使用命令/public
转到ls -l
文件夹,您将看到群组:所有者权限。
chown -h storage yourgroup:yourusername
现在可以从浏览器访问目录。
答案 3 :(得分:0)
要访问存储文件夹,您必须在公共文件夹中具有符号链接。因此,在公用文件夹中,键入ls
以查看存储链接。如果不存在或为红色,则必须创建/更新它。
创建符号链接
在公用文件夹中输入类似ln -s /path/to/your/storage/public/ storage
修复符号链接
查找链接指向的位置:readlink -v storage
*指向新路径的链接:ln -sfn /path/to/your/storage/public/ storage
答案 4 :(得分:0)
如 kJamesy 所述,您应该检查是否为文件设置了错误的所有者(例如,如果您使用root用户创建了php artisan storage:link
)。
要解决此问题,请从/public
内部运行:
chown -R username:group storage
您还可以检查文件的权限(当我使用rsync复制文件时,other
的读取权限通常会丢失,导致403错误)。如果权限不正确,可以通过内部人员/ public调用来解决它:
find * -type d -exec chmod 755 {} \;
find * -type f -exec chmod 644 {} \;
答案 5 :(得分:0)
转到laravel项目的根目录
用正确的名称替换 USER:GROUP 。
答案 6 :(得分:0)
如果您使用的是共享主机,则必须自行创建符号链接,而不要使用 php artisan storage:link 。原因是php artisan创建链接的方式,它使用绝对路径,这就是导致403被禁止的原因。
提示:转到您的 www 文件夹。并做(假设您是包含laravel项目的www文件夹中的dir调用dev):
ln -sr dev/storage/app/public/ dev/public/storage
请注意 -sr 选项,这一点非常重要。使用它,您可以使用相对路径而不是绝对路径来创建符号链接,并且可以通过共享主机中的问题来解决。
答案 7 :(得分:0)
如果您无法在共享主机上访问SSH,并且常规php artisan storage:link
生成403,请添加--relative
参数,如下所示:
Route::get('/symlink_create', function () {
Artisan::call('storage:link --relative');
});
然后访问此新创建的路由以创建符号链接。使用它后,别忘了将其删除。
答案 8 :(得分:0)
当我尝试使用命令storage:link
创建符号链接时,它禁止了我403。
问题在于它使用绝对路径引用了原始存储/应用/公共。
因此,我尝试使用ln -l
命令而不是artisan命令,并使用相对路径进行引用。
输入/html/myproject/public
目录
并运行命令
ln -s ../storage/app/public /html/myproject/public/storage
为我解决了403个禁止的问题。
答案 9 :(得分:0)
对我来说,我使用 plesk 来托管我的网站。 并没有找到解决方案...
所以我决定将存储路径移动到公共路径到公共目录中创建的“上传”文件夹中。
<块引用>config/filesystems.php
'local' => [
'driver' => 'local',
'root' => public_path('uploads'),
],
'public' => [
'driver' => 'local',
'root' => public_path('uploads'),
'url' => env('APP_URL').'/uploads/', 'visibility' => 'public',
],
我认为这不是最好的解决方案,但对我有用。
答案 10 :(得分:-1)
我猜想您遇到的这个403问题是在共享主机中占有一席之地。使用php artisan storage:link
创建符号链接时,它包含指向storage/app/public
文件夹的完整绝对路径。这可能是导致服务器响应403的原因。
解决方案是使用从项目根目录开始的相对路径创建符号链接,例如
ln -s ../storage/app/pulic public/storage
这应该可以解决权限问题。