我将用户个人资料图片存储在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');
}
这可以被认为是一种很好的做法,还是只需将图片保存在公共文件夹中? 这样做会遇到性能问题吗?
答案 0 :(得分:29)
对您问题的简短回答
这可以被视为一种好习惯,还是应该保存 公用文件夹中的图片?我会遇到性能问题吗? 这样做?
这不是建议的做法,因为你读取文件并重新生成它,这将花费处理时间并加载服务器,但是说这一切都取决于请求数量,图像大小等等。我使用这种做法保护/保护图像/文件免受公共访问,因此只有经过身份验证的成员才能访问此answer中的图像/文件。再次取决于文件大小,请求数量和服务器规格,我已经使用它一段时间,我没有性能问题,它工作正常(我的服务器是512MBMemory,1 CoreProcessor,20GBSSD磁盘VPS解决方案)。你可以尝试一下,看看。
也可以创建像
这样的符号链接ln -s /pathof/laravel/storage/profile_pictures /pathof/laravel/public/profile
此解决方案不会影响性能,但您需要在内部文档中记录解决方案,以防将设置移至新提供程序或需要重新链接到存储文件夹。
但如果您仍希望获得从存储文件夹返回图像的完整解决方案,首先我们需要为Laravel安装Intervention Image,我不确定这是否已经完成。如果你已经安装它继续在这里,但如果没有按照这个答案的最后部分,而不是继续使用Laravel解决方案。
如上所述,我们假设您的干预有效,首先您需要创建一个路线。 Route将所有图像请求访问转发给我们的Controller。
创建路线
Route::get('profile/{person}', 'ImagesController@profilePicture');
创建路线后,我们需要创建一个控制器来处理来自路线的图像请求。
创建ImagesController
从命令
php artisan make:controller ImagesController
你的控制器应该是这样的。
class ImagesController extends Controller {
public function profilePicture($person, $size = 40)
{
$storagePath = storage_path('/profile_pictures/' . $person . '/profile_' . $size . '.jpg');
return Image::make($storagePath)->response();
}
}
请记得添加
use Intervention\Image\Facades\Image;
在您的ImagesController
班级
最后确保您已使用测试图像创建了文件夹结构。
storage/profile_pictures/person/profile_40.jpg
现在,如果你在浏览器中写字
http://laravelLocalhostUrl/profile/person
注意:我已尽力使文件夹反映您的问题, 但你可以很容易地修改它以适合你想要的方式。
安装干预(如果您已安装,请跳过此部分)
遵循以下指南:http://image.intervention.io/getting_started/installation
简要说明:php composer require intervention/image
在你的config/app
$ providers数组中添加此包的服务提供者。
Intervention\Image\ImageServiceProvider::class
将此包的外观添加到$ aliases数组。
'Image' => Intervention\Image\Facades\Image::class
答案 1 :(得分:15)
使用Laravel 5.2+ Image::make($pathToFile)->response()
可被视为不良做法。任何想要提供Laravel图像解决方案的人都应该使用return response() -> file($pathToFile, $headers);
。这将产生更少的开销,因为它只是提供文件而不是"在Photoshop中打开它" - 至少那是我的CPU显示器所说的。
答案 2 :(得分:3)
在User.php
模型中:
protected $appends = ['avatar'];
public function getAvatarAttribute($size=null)
{
return storage_path().'/profile_pictures/'.$this->id.'/profile_'.$size.'.jpg';
}
因此,每当你调用一个获取用户实例时,你都会拥有他的头像。
答案 3 :(得分:0)
Response::stream(function() use($fileContent) {
echo $fileContent;
}, 200, $headers);
https://github.com/laravel/framework/issues/2079#issuecomment-22590551