【问题标题】:Displaying images from the storage folder in laravel在 laravel 中显示存储文件夹中的图像
【发布时间】:2020-12-19 10:09:30
【问题描述】:

我不想公开访问我的用户照片,但我想在管理面板上显示它们。怎么样?

我试试这个:

Storage::get($fileName);

我的 .htaccess:

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews -Indexes
    </IfModule>

    RewriteEngine On

    # Handle Authorization Header
    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} (.+)/$
    RewriteRule ^ %1 [L,R=301]  

    # Send Requests To Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]   

</IfModule>

【问题讨论】:

  • 你可以为我在 Laravel 中假设的那些文件创建快捷方式
  • 如何创建快捷方式?
  • 我的意思是符号链接,但它似乎并不完全适合您的用例。您可能需要创建一些路由层来检查会话是否属于管理员,然后只加载图像。
  • 如果图片不多,您可以显示图片的 base64 版本,而不是资产 URL。
  • 我有多个用户我想将他们的数据显示为带有图像的表格数据。

标签: php laravel file-upload storage laravel-7


【解决方案1】:

.htaccess 会这样:

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews -Indexes
    </IfModule>

    RewriteEngine On

    # Handle Authorization Header
    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} (.+)/$
    RewriteRule ^ %1 [L,R=301]

    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} -f
    RewriteCond %{REQUEST_URI} ^.+?/?assets/images [NC]
    RewriteRule ^ index.php [L]   

    # Send Requests To Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]   

</IfModule>

上面重要的几行是:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} -f
RewriteCond %{REQUEST_URI} ^.+?/?assets/images [NC]
RewriteRule ^ index.php [L]

它表示当前请求是否为assets/images,如果请求是文件名,则将其传递给index.php,后者基本上将转到routes/web.php

routes/web.php:

Route::middleware(['admin-access'])->group(function(){
    Route::get('assets/images/{file_name}',function($file_name){
        header('Content-type:image/jpeg');// can improve to detect file extension and render accordingly.
        readfile(public_path() . DIRECTORY_SEPARATOR . 'assets' . DIRECTORY_SEPARATOR . 'images' . DIRECTORY_SEPARATOR . $file_name);
        exit;
    });
});

上面的路由建议如果请求通过admin-access传递,那么只加载图片。

AdminAccess 中间件:

<?php

namespace App\Http\Middleware;

use Closure;
use Auth;

class AdminAccess
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next){
        if(Auth::user->isAdmin()){ // or whatever you do to check
          return $next($request);    
        }

        return response("Permission denied.",403);
    }
}

确保在 kernel.php 中也添加 admin-access

protected $routeMiddleware = [
        'admin-access' => \App\Http\Middleware\AdminAccess::class,
        ....
]

【讨论】:

  • 感谢您的支持。
  • 如果这解决了您的问题,请确保您选中左侧的勾号以接受它。这将帮助其他人知道这是一个有效的解决方案。另外,我假设所有图像都在public/assets/images 文件夹中。
  • 我对 StackOverflow 不熟悉。对不起。
  • 没问题,有什么问题?
  • 对不起。是的,我的问题解决了。非常感谢您的支持。
猜你喜欢
  • 2017-09-03
  • 2021-02-07
  • 1970-01-01
  • 2019-03-11
  • 1970-01-01
  • 2018-10-27
  • 1970-01-01
  • 2019-11-16
  • 1970-01-01
相关资源
最近更新 更多