我试图使用laravel中的guzzle来访问来自外部API的图像,但是,可以理解的是,这些调用变得非常昂贵并且对页面加载时间产生了极大的影响。我知道代理调用可以解决这个问题,然而,是否有任何方法可以在laravel中实现这一点,其中某个端点可以充当代理并可以返回图像。感谢
答案 0 :(得分:0)
我找到了解决自己问题的方法,并会发布答案。请注意,有更好的解决方案,即配置服务器来处理此类调用。但是,在Laravel的背景下,我就是这样做的。
我必须使用的数据
[
"orientation" => "portrait"
"fig_type" => "diagram"
"id" => "A_SDEF-05-2016-0003001"
"position" => "float"
"label" => "Figure 1."
"caption" => "some caption"
"link" => "/resource/id/A_SDEF-05-2016-0003001.tif"
]
解决方案:
第1步 使用Laravel中的集合在其函数中循环遍历数据;
// Pass the link as a get request parameter to laravel route
// i.e. localhost/proxy/image?link=resource/id/A_SDEF-05-2016-0003001.tif
return collect($images)->each(function ( $image )
{
if ($image['link']) {
$image['link'] = ltrim($image['link'],'/');
return $image['link'] ="link={$image['link']}";
}
return $image;
});
第2步 在路径文件中注册端点,例如
Route::get('/proxy/image', 'ProxyController@request_image');
第3步 控制器方法,即request_image发出Guzzle请求,并将响应返回为:
$link = request('link');
return \Response::stream(function() use($image){
echo $image;
},200, [$headers]);
第4步 有一个静态函数或常规函数来输出你将构建的一些动态html但是在img src中你会调用ProxyController图像方法,即
$img = '<img src="'. action('ProxyController@request_image',$image['link']).'") >";
- 步骤5 输出刀片中的html
{!! Asset::image($image) !!} // Just output the built html
希望它有所帮助:D