对您问题的简短回答
这可以被认为是一个好的做法,还是我应该简单地保存
公共文件夹中的图片?我会遇到性能问题吗
这样做?
这不是建议的做法,因为您读取文件并重新生成它,这将花费处理时间并加载服务器,但这一切都取决于请求数量、图像大小等。我使用这种做法来保护/保护来自公共访问的图像/文件,因此只有经过身份验证的会员才能访问此中的图像/文件answer https://stackoverflow.com/questions/30682421/how-to-protect-image-from-public-view-in-laravel-5/30682456#30682456。再次取决于文件大小、请求数量和服务器规格,我已经使用它一段时间了,并且没有遇到性能问题,它工作得很好(我的服务器是 512MB 内存、1 个核心处理器、20GBSSD 磁盘 VPS 解决方案)。你可以尝试一下,然后看看。
符号链接解决方案
也可以创建符号链接,例如
ln -s /pathof/laravel/storage/profile_pictures /pathof/laravel/public/profile
此解决方案不会影响性能,但您需要在内部文档中记录该解决方案,以防您将设置移至新的提供商或需要重新链接到存储文件夹。
但是如果你仍然希望有从存储文件夹返回图像的完整解决方案,首先我们需要安装 Laravel 的干预图像,我不确定这是否已经完成。如果您已安装它,请继续此处,但如果没有按照此答案的最后部分进行操作,则继续使用 Laravel 解决方案。
Laravel 解决方案
正如我们所说,我们假设您的干预有效,首先您需要创建一条路线。该路由会将所有图像请求访问转发到我们的控制器。
创建路线
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();
}
}
EDIT
对于那些使用 Laravel 5.2 及更高版本的人。 Laravel 引入了新的、更好的方法提供文件 https://laravel.com/docs/master/responses#file-responses开销较小(这种方式不会重新生成答案中提到的文件):
文件回应
file 方法可用于显示文件,例如图像或
PDF,直接在用户的浏览器中而不是启动下载。
此方法接受文件的路径作为其第一个参数和一个
标头数组作为第二个参数:
return response()->file($pathToFile);
return response()->file($pathToFile, $headers);
并且记得添加
use Intervention\Image\Facades\Image;
in your ImagesController
class
最后确保您已经创建了包含测试图像的文件夹结构。
storage/profile_pictures/person/profile_40.jpg
现在如果你在浏览器中写入
http://laravelLocalhostUrl/profile/person
It will show your image, I have made it my self and test it.
注意:我已尽力使文件夹反映您的问题,
但您可以轻松修改它以适合您想要的方式。
安装干预(如果您已经安装,请跳过此部分)
请遵循以下指南:http://image.intervention.io/getting_started/installation 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 https://stackoverflow.com/questions/30682421/how-to-protect-image-from-public-view-in-laravel-5/30682456#30682456但这是通过一般身份验证来保护图像,这answer https://stackoverflow.com/questions/30191330/laravel-5-how-to-access-image-uploaded-in-storage-within-view.