Silverstripe Image Upload正在更改名称

时间:2015-02-27 16:03:16

标签: php silverstripe

我正在上传图片,在存储图片的同时,我设置的文件名就像资产/上传/ 54f092af271b9.png'但保存后,文件名字段丢失了一些部分。它成为' assets / 54f092af271b9.png'失去"上传/"目录一共。这应该发生吗?

以下是代码:

            <?php 
            $img = new Image();
            $baseName = pathinfo($file, PATHINFO_BASENAME);
            $fileName = 'assets/Uploads/' . $baseName;

            var_dump($fileName);

            $img->Name = $baseName;
            $img->Filename = $fileName;
            $img->OwnerID = ($memberID = Member::currentUserID()) ? $memberID : 0;
            $img->write();


            var_dump($img->Filename); exit;

输出是:

资产/上传/ 54f092af271b9.png 资产/ 54f092af271b9.png&#39;

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

我能够使用您提供的代码复制该问题。经过一番挖掘,这就是我找到的。

这一切都始于onAfterWrite类中的File函数(Image扩展)。在您write(显然)调用后触发,这会调用updateFilesystem,其中this line设置Filename属性,并带有getRelativePath函数调用的结果。

在撰写本文时,getRelativePath看起来像这样:

public function getRelativePath() {
    if($this->ParentID) {
        // Don't use the cache, the parent has just been changed
        $p = DataObject::get_by_id('Folder', $this->ParentID, false);
        if($p && $p->exists()) return $p->getRelativePath() . $this->getField("Name");
        else return ASSETS_DIR . "/" . $this->getField("Name");
    } else if($this->getField("Name")) {
        return ASSETS_DIR . "/" . $this->getField("Name");
    } else {
        return ASSETS_DIR;
    }
}

查看该代码时,问题来自ParentID,当您将其写入数据库时​​未在记录中设置,因此运行第二个条件而不是返回ASSETS_DIR . "/" . $this->getField("Name")的结果。 / p>

所以这就解决了问题,现在是一个解决方案。 Silverstripe想要一个父文件夹,你只需要给它一个。

幸运的是,名为Folderfind_or_make类有一个很小的功能,它可以完成名称所说的,或者在文件系统和数据库中找到文件夹记录,或者它会为你生成它。< / p>

注意:在我自己的测试中,虽然我有一个“上传”文件夹,但我没有相应的数据库记录,所以这个函数为我写了一个返回结果。

然后,我使用结果将我写入数据库的图像ParentID提供给第一个var_dump,并使第二个write返回与第一个相同的值。

在调用$parentFolder = Folder::find_or_make('Uploads'); $img->setParentID($parentFolder->ID); 之前,您只需添加到代码中即可:

{{1}}