调整后的图片上传

时间:2018-02-08 08:08:45

标签: php image amazon-s3 cdn image-resizing

我正在开发一个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;
    }
}

(我知道有很多代码没有包含在内,但它没有相关性。)

您会选择哪种方法以更有效的方式处理此问题?

1 个答案:

答案 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

这减少了处理时间以及所需的存储大小,因为并非所有图像都可能生成缩略图。