我正在上传图片,在存储图片的同时,我设置的文件名就像资产/上传/ 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;
有什么想法吗?
答案 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想要一个父文件夹,你只需要给它一个。
幸运的是,名为Folder
的find_or_make
类有一个很小的功能,它可以完成名称所说的,或者在文件系统和数据库中找到文件夹记录,或者它会为你生成它。< / p>
注意:在我自己的测试中,虽然我有一个“上传”文件夹,但我没有相应的数据库记录,所以这个函数为我写了一个返回结果。
然后,我使用结果将我写入数据库的图像ParentID
提供给第一个var_dump
,并使第二个write
返回与第一个相同的值。
在调用$parentFolder = Folder::find_or_make('Uploads');
$img->setParentID($parentFolder->ID);
之前,您只需添加到代码中即可:
{{1}}