使用代理从外部 Api 请求图像资源

Requesting Image Assets from external Api using a proxy

我正在尝试在 laravel 中使用 guzzle 从外部 API 访问图像,但是,可以理解的是,调用变得非常昂贵并且对页面加载时间产生了巨大影响。我知道代理调用可以解决这个问题,但是,在 laravel 中,某个端点可以充当代理并且可以 return 图像,有什么方法可以实现这一点。谢谢

我找到了解决我自己问题的方法,并将 post 给出答案。请注意,有更好的解决方案,即配置您的服务器来处理此类调用。但是,在 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"
   ]

解决方案:

第一步 在其函数中使用 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 请求,return 响应为:

$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步 在 blade

中输出 html
{!! Asset::image($image) !!} // Just output the built html

希望对您有所帮助:D