Silverstripe 4.6 从 url 创建/保存图像对象

Posted

技术标签:

【中文标题】Silverstripe 4.6 从 url 创建/保存图像对象【英文标题】:Silverstripe 4.6 create/save Image-Object from url 【发布时间】:2021-04-09 08:04:50 【问题描述】:

我们如何在 DataObject 上创建 has_one Image 关系,并将该 Image 从给定 URL 保存到该 DataObject?

我尝试过的:

class VideoObject extends DataObject


 private static $has_one = [
    'AutoThumbnail' => Image::class 
   ];

private static $owns = [
        'AutoThumbnail'
    ];

public function onAfterWrite()  
        parent::onAfterWrite();
        $this->imagetest();
    
    
    
    public function imagetest()
        
        $folder = Folder::find_or_make('Uploads');
        $imageSource = $this->EmbedThumbnailURL; // == ( https://i.ytimg.com/vi/1Rhq53sCfRU/maxresdefault.jpg )
        $sourcePath = pathinfo($imageSource);
        $fileName = basename($this->EmbedThumbnailURL);
        $image = new Image();

        $pic = imagecreatefromstring(file_get_contents($imageSource));  
        imagejpeg($pic, 'assets/'.$fileName);
        $image->ParentID = $folder->ID;
           
        $image->FileFilename = $fileName;
        $image->Name = $fileName;
        $image->write();
        $this->AutoThumbnailID = $this->ID;
        $image->doPublish();
        $this->AutoThumbnail()->$image;

文件夹和文件夹路径出现问题,图像在文件 - 部分中显示不正确(红色方块),也没有显示在模板中。 我究竟做错了什么? 你能给我一个工作的例子吗? 谢谢。

【问题讨论】:

【参考方案1】:

要从 URL 获取图像,您可以使用 File::setFromString。它会为你做所有的事情。所以在你的情况下,你可以有类似的东西:

$image = new Image();
$image->setFromString(file_get_contents($imageSource), $fileName);
$imageID = $image->write();

然后您需要将其 ID 分配给您的 VideoObject:

$this->AutoThumbnailID = $imageID;

在此之后,您必须保存/写入 VideoObject 以保留更改,并且当您将 $this->imagetest() 从 onAfterWrite 移动到 onBeforeWrite 时,它​​将自动完成(我个人认为将它放在 onAfterWrite 中并不是最幸运的事情)。

【讨论】:

以上是关于Silverstripe 4.6 从 url 创建/保存图像对象的主要内容,如果未能解决你的问题,请参考以下文章

如何从SilverStripe管理员中的DataObject分离文件系统时删除文件(图像)?

如何将原始 SQL 查询转换为 Silverstripe SQLQuery 抽象层

使用 SilverStripe 的计划任务

silverstripe 3 addFieldToTab“设置”

Silverstripe:成员关系多多空,形成前端

如何在 SilverStripe 4 CMS 中添加自定义样式