BaronGrivet
BaronGrivet

Reputation: 4424

How to save a GD created image to an object in Silverstripe 4

I am working on a project in Silverstripe 4. On page save/ publish I want to create a "MetaImage" which is made up of random tiles images associated with the page.

The MetaImage is created by GD - I'm then trying to save it into the ORM. Here's some example code:

public function onBeforeWrite()
{
  $metaImage = imagecreatetruecolor(1200, 1200);
  //GD image created here

 $fileName = 'metaimage-'.$this->ID.'.jpeg';
 $saveFolder = Folder::find_or_make('MetaImages');

  imagejpeg($metaImage, 'assets/MetaImages/'. $fileName);

  $metaObjectImage = new Image();
  $metaObjectImage->ParentID = $saveFolder->ID;
  $metaObjectImage->Filename = $fileName;
  $metaObjectImage->write();

  $this->MetaImage()->$metaObjectImage;
  imagedestroy($metaImage);
  parent::onBeforeWrite();
}

All I get is a red box in the "Files" section of the CMS with "File cannot be found".

How do I associate the created GD image with $metaObjectImage?

How can I make it that if "metaimage-6.jpeg" already exists it's replaced by a new copy of the file?

Upvotes: 0

Views: 376

Answers (1)

BaronGrivet
BaronGrivet

Reputation: 4424

This was my solution using setFromLocalFile:

    $saveFolder = Folder::find_or_make('MetaImages');
    $fileName = bin2hex(random_bytes(32)).'.jpeg';
    $tmpFolder = 'assets/'.$saveFolder->Title;

    imagejpeg($metaImage, $tmpFolder.'/'.$fileName);

    $metaObjectImage = new Image();
    $metaObjectImage->setFromLocalFile($tmpFolder.'/'.$fileName);
    $metaObjectImage->ParentID = $saveFolder->ID;
    $metaObjectImage->write();

    $this->MetaImage()->$metaObjectImage;

Upvotes: 1

Related Questions