我想在Laravel中缓存图像。我能找到我在哪里为自己提供图片的所有解决方案,但这些图片来自Google Places api调用。从地点详细信息api调用。
因此,如果用户请求使用我的Web应用程序的某个位置的图像,我想怎么做,我想缓存作为结果检索到的图像。
google place details api调用检索图像的哈希,我可以像这样构造图像的url:
$photos[] = 'https://maps.googleapis.com/maps/api/place/photo?photoreference=' .
$photo->photo_reference .
'&sensor=false&maxheight=400&maxwidth=400&key=' .
$apiKey;
然后检索图像并将其显示在前端。
我们正在使用Laravel方式进行类似Cache::get($id.'photos')
的操作,但这只会缓存url,这并不是很有帮助。
我们还找到了以下链接https://github.com/Intervention/imagecache,但是此存储库非常老,我们使用的是Laravel 5.7,因此该存储库中使用的技术不再适用。
任何建议都将不胜感激!
答案 0 :(得分:1)
如果您可以直接从该URL下载实际图像,则可以采用这种方式:
用户在您的网址
yourdomain.com/your-api/image/{reference}
上请求图像
storage
文件夹之一中可能是这样(未经测试)
/** @return \Illuminate\Http\Response */
function getImage($reference) {
$imageUrl = buildImageUrl($reference);
$hash = getHash($imageUrl);
if($location = Cache::get("image-$hash")) {
if(file_exists($location)) {
return response()->file($location);
}
}
$location = cacheImage($imageUrl, $hash);
return response()->file($location);
}
function cacheImage($imageUrl, $hash) {
$hash = getHash($imageUrl);
$location = storage_path("images/$hash");
// download the image and cache its filename by hash
$image = downloadImage($imageUrl, $location);
file_put_contents($location, $image);
Cache::put("image-$hash", $location);
return $location;
}
function getHash($string) {
return sha1($string);
}