我应该如何用Laravel服务?

clo*_*986 20 php performance laravel

我将用户个人资料图片存储在laravel存储文件夹而不是公用文件夹中,因为我希望保持公共文件夹不干净,避免用户混乱.

为了从该文件夹提供图像,我创建了一个简单的Controller Action,如下所示:

public function profilePicture($person, $size = 40){
    $profile_picture_url = storage_path().'/profile_pictures/'.$person['id'].'/profile_'.$size.'.jpg';

    if(!File::exists( $profile_picture_url ))
        App::abort(404);

    return Image::make($profile_picture_url)->response('jpg');
}
Run Code Online (Sandbox Code Playgroud)

这可以被认为是一个好习惯,还是我应该只是将图片保存在公共文件夹中?这样做会遇到性能问题吗?

may*_*ʎɐɯ 32

您问题的简答

这可以被认为是一个好习惯,还是我应该只是将图片保存在公共文件夹中?这样做会遇到性能问题吗?

这不是建议的做法,因为你读的文件,并重新生成它,那将需要处理时间和加载服务器,而是说一切都取决于有多少要求,图像大小等我用这种做法来保护/保护来自公共访问的图像/文件,因此只有经过身份验证的成员才能访问此答案中的图像/文件.再次取决于文件大小,请求数量和服务器规格,我已经使用它一段时间,我没有性能问题,它工作正常(我的服务器是512MBMemory,1 CoreProcessor,20GBSSD磁盘VPS解决方案).你可以尝试一下,看看.

符号链接解决方案

创建符号链接也是可能的

ln -s /pathof/laravel/storage/profile_pictures /pathof/laravel/public/profile
Run Code Online (Sandbox Code Playgroud)

此解决方案不会影响性能,但您需要在内部文档中记录解决方案,以防您将设置移至新提供程序或需要重新链接到存储文件夹.

但是如果您仍然希望拥有从存储文件夹返回图像的完整解决方案,首先我们需要为Laravel安装Intervention Image,我不确定这是否已经完成.如果你已经安装它继续在这里,但如果没有按照这个答案的最后部分,而不是继续使用Laravel解决方案.

Laravel解决方案

如上所述,我们假设您的干预有效,首先您需要创建一个路线.Route将转发所有图像请求访问我们的Controller.

创建路线

Route::get('profile/{person}', 'ImagesController@profilePicture');
Run Code Online (Sandbox Code Playgroud)

创建路线后,我们需要创建一个控制器来处理来自路线的图像请求.

创建ImagesController

从命令

php artisan make:controller ImagesController
Run Code Online (Sandbox Code Playgroud)

你的控制器看起来应该是这样的.

class ImagesController extends Controller {

    public function profilePicture($person, $size = 40)
    {
        $storagePath = storage_path('/profile_pictures/' . $person . '/profile_' . $size . '.jpg');

        return Image::make($storagePath)->response();
    }
}
Run Code Online (Sandbox Code Playgroud)

并记得添加

return response()->file($pathToFile);

return response()->file($pathToFile, $headers);
Run Code Online (Sandbox Code Playgroud)

在你的ImagesController班上

最后确保您已使用测试图像创建了文件夹结构.

use Intervention\Image\Facades\Image;
Run Code Online (Sandbox Code Playgroud)

现在,如果你在浏览器中写

storage/profile_pictures/person/profile_40.jpg
Run Code Online (Sandbox Code Playgroud)

它会显示你的形象,我已经把它作为自己并测试它. 在此输入图像描述

注意:我已尽力使文件夹反映您的问题,但您可以轻松修改它以符合您的需要.


安装干预(如果您已安装,请跳过此部分)

请遵循以下指南:http://image.intervention.io/getting_started/installation

简述: php composer require intervention/image

config/app$ providers数组中添加此包的服务提供者.

http://laravelLocalhostUrl/profile/person
Run Code Online (Sandbox Code Playgroud)

将此包的外观添加到$ aliases数组中.

Intervention\Image\ImageServiceProvider::class
Run Code Online (Sandbox Code Playgroud)

解决方案的灵感来自于这个答案,但一个是通过身份验证来保护图像,这个答案.

  • 非常彻底的答案,甚至在 laravel 9 上工作。 (2认同)

luk*_*s83 15

使用Laravel 5.2+ Image::make($pathToFile)->response()可能被认为是不好的做法.任何想要提供Laravel图像解决方案的人都应该使用return response() -> file($pathToFile, $headers);.这将产生更少的开销,因为它只是提供文件而不是"在Photoshop中打开它" - 至少这是我的CPU显示器所说的.

这是文档链接

  • +1.如果从文档链接中删除5.4,它将重定向到最新版本.另外你可能想为这些变量添加一些提示......我正在使用`$ headers = ['Content-Type'=>'image/png'];`和`$ path = storage_path('app/.. ./myImage.png')`. (3认同)