问题的简短答案
这可以被认为是一种好习惯,还是我应该简单地保存
公用文件夹中的图片?我会遇到性能问题吗
这样做?
这不是建议的做法,因为您读取文件并重新生成它,这将花费处理时间并加载服务器,但这一切都取决于多少请求,图像大小等。我使用这种做法来保护/保护图像/文件不被公众访问,因此只有经过身份验证的成员才能访问图像/文件,就像它在此 answer 中一样。再次取决于文件大小、请求数量和服务器规格,我已经使用了一段时间并且性能没有问题,它运行良好(我的服务器是 512MBMemory、1 CoreProcessor、20GBSSD 磁盘 VPS 解决方案)。你可以试一试看看。
符号链接解决方案
也可以创建符号链接
ln -s /pathof/laravel/storage/profile_pictures /pathof/laravel/public/profile
此解决方案不会影响性能,但您需要在内部文档中记录解决方案,以防您将设置移至新的提供商或需要重新链接到存储文件夹。
但是如果你仍然希望获得从存储文件夹返回图像的完整解决方案,首先我们需要为 Laravel 安装 Intervention Image,我不确定这是否已经完成。如果您已安装,请在此处继续,但如果不遵循此答案的最后一部分,则继续使用 Laravel 解决方案。
Laravel 解决方案
如前所述,我们假设您的干预有效,首先您需要创建一条路线。 Route 会将所有图像请求访问权转发给我们的 Controller。
创建路线
Route::get('profile/{person}', 'ImagesController@profilePicture');
创建路由后,我们需要创建一个控制器来处理来自我们的路由的图像请求。
创建图像控制器
从命令
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();
}
}
编辑
对于那些使用 Laravel 5.2 和更新版本的人。 Laravel 为 serve files 引入了新的更好的方法,它的开销更少(这种方法不会像答案中提到的那样重新生成文件):
文件回复
file 方法可用于显示文件,例如图像或
PDF,直接在用户的浏览器中,而不是启动下载。
这个方法接受文件的路径作为它的第一个参数和一个
标头数组作为第二个参数:
return response()->file($pathToFile);
return response()->file($pathToFile, $headers);
记得添加
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
解决方案的灵感来自这个answer,但这个解决方案是通过一般身份验证和这个answer 来保护图像。