Laravel 5.4 - >对存储中具有“公开”可见性

时间:2017-05-29 16:52:01

标签: php linux image laravel laravel-5.4

我在使用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权限保存在服务器上。所有相关文件夹都具有相同的权限。

我真的不知道在哪里看......

如果有人遇到类似的问题,请提前感谢您的意见!

致以最诚挚的问候,

维拉德

11 个答案:

答案 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

*参考:REPAIRING BROKEN SYMBOLIC LINK

答案 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项目的根目录

  1. 运行此命令: php artisan storage:link
  2. 编辑public / .htaccess并将其添加到其中: Options + FollowSymlinks
  3. 运行此命令: chown -h USER:GROUP public / storage

用正确的名称替换 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');
});

然后访问此新创建的路由以创建符号链接。使用它后,别忘了将其删除。

来源:https://github.com/laravel/framework/blob/e9483c441d5f0c8598d438d6024db8b1a7aa55fe/src/Illuminate/Foundation/Console/StorageLinkCommand.php#L30

答案 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

这应该可以解决权限问题。