我正在开发一个Laravel应用程序,并且在某些时候,当我允许用户为不同目的上传他们自己的图像时,我想为这些图像生成调整大小的预览。
我正在将所有用户内容上传到Amazon S3,我做的第一件事就是调整图片大小是上传原始图片,然后经过foreach
,调整图片大小并重新上传到S3。
正如你可以想象的那样,每张图片有4种尺寸会大大增加上传时间,对我来说是一个性能问题。
以下是我在upload
函数中使用的代码段:
$storageDriver = Storage::disk('cloud-storage')->getDriver();
$parentSuccess = $storageDriver->put("/$parentId", file_get_contents($file), [
'visibility' => 'public',
'ACL' => 'public-read',
'ContentType' => $contentType,
]);
$ratio = $imageSize[0] / $imageSize[1];
foreach (self::IMAGE_SIZES as $size) {
if ($size > $imageSize[0] || ($size / $ratio) > $imageSize[1]) {
continue;
}
$id = DB::table('storage')->insertGetId([
'content_type' => $contentType,
'parent_id' => $parentId,
'image_width' => $size,
'image_height' => intval($size / $ratio),
]);
$image = Image::make($file)->encode('jpg');
$image->resize($size, null, function ($constraint) {
$constraint->aspectRatio();
$constraint->upsize();
});
$image->save();
$success = $storageDriver->put("/$id", (string)$image, [
'visibility' => 'public',
'ACL' => 'public-read',
'ContentType' => 'image/jpeg',
]);
if (!$success) {
return null;
}
}
(我知道有很多代码没有包含在内,但它没有相关性。)
您会选择哪种方法以更有效的方式处理此问题?
答案 0 :(得分:0)
为了在我的上一个项目中实现这样的东西,我使用了Lazy加载。将父图像上传到s3并仅在需要时生成缩略图。
您可以将函数getThumbnails()
附加到具有图像的模型。该函数检查是否已为该模型生成缩略图并将其返回,否则生成它们。
public function getThumbnails(){
$thumbDir = "path/to/model/thumbnail/dir";
//Check if the folder exists.
//You can also double check if the directory actually has the thumbnails in it
if(!file_exists($thumbDir)){
$this->generateThumbnails($thumbDir);
}
//Return something
}
为了获得更多乐趣,您可以更具体,并且每个缩略图都有一个功能处理。
public function getThumbnailX(){
$thumb = "path/to/specific/model/thumbnail";
if(!file_exists($thumb)){
$this->generateThumbnailX($thumb);
}
return $thumb;
}
public function getThumbnailX2(){
...
}
超级有趣,将其添加为模型的属性。
public function getThumbXAttribute(){
return getThumbnailX();
}
这样您就可以在需要thumbX时立即拨打$model->thumbX
。
这减少了处理时间以及所需的存储大小,因为并非所有图像都可能生成缩略图。