繁体   English   中英

如何强制 laravel 不从符号链接读取存储文件

[英]how to force laravel not read the storage files from symlink

我将 laravel 托管在不支持符号链接的 Cpanel 上,因此当我运行storage:link时出现此错误:

symlink() has been disabled for security reasons

当我联系我的提供商时,他们告诉我他们无法打开它,但我必须在我的文件系统中进行更改才能从存储本身读取。 现在我的问题是如何将config/filesystem.php更改为不从符号链接读取,而是从存储文件夹本身读取。 提前致谢

你有几个选择。

如果您有权访问命令行,则可以尝试自己手动创建符号链接。 他们可能禁用了 PHP symlink()命令,但您仍然可以使用 OS ln命令。 从命令行:

ln -s /path-to-project/storage/app/public /path-to-project/public/storage

如果您无权访问命令行,您可以尝试使用程序执行方法之一( exec()shell_exec()等)从 PHP 运行命令。 但是,如果他们禁用了symlink() ,他们可能也禁用了所有这些。 要尝试此操作,请创建一个临时路线,点击一次,然后将其删除:

Route::get('temp-create-link', function () {
    exec("ln -s ".escapeshellarg(storage_path('app/public')).' '.escapeshellarg(public_path('storage')));
});

如果您无法运行ln命令,或者它已在操作系统级别被禁用,那么您需要手动创建您的public/storage文件夹并更新您的文件系统配置以指向它。 创建public/storage文件夹后,打开config/filesystems.php文件并更新公共磁盘的root密钥以指向它:

'disks' => [

    // ...

    'public' => [
        'driver' => 'local',
        // old value: 'root' => storage_path('app/public'),
        'root' => public_path('storage'),
        'url' => env('APP_URL').'/storage',
        'visibility' => 'public',
    ],

    // ...

],

当我使用共享主机时,我也遇到了这个问题。 实际上 storage:link 实现并不难,但您没有使用该命令的权限。

  1. 在公用文件夹中创建一个文件夹。 就我而言,我已经创建了上传,您可以创建任何文件夹和子文件夹。

  2. 在 Controller 中,使用 public_path() 上传文件。 例如,我正在上传图片。

     // In html form, file name is cover_image if($request->file('cover_image')){ $image = $request->file('cover_image'); $extension=$image->getClientOriginalExtension(); $file_name = 'File-'.date('Ymdhi-s').'.'.$extension; $destination_path = public_path('/uploads/'); $result=$image->move($destination_path,$file_name); if($result){ $data['cover_image']=$file_name; } }
  3. 使用asset() 访问文件。 例如,我使用 img 标签。

     <img src="{{ asset('uploads/'.$item->cover_image) }}">

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM