我正在上传一个图像,在存储图像时,我设置的文件名类似于‘assets/上载/54f092af271b9.png’,但是保存后,Filename字段会丢失一些部分。它变成'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‘
有什么想法吗?
发布于 2015-02-28 08:10:17
我能够用您提供的代码复制这个问题。经过一段时间的挖掘,这是我发现的。
所有这些都是在onAfterWrite类中的File函数( Image扩展的)中开始的。调用write (显然)之后,调用updateFilesystem,其中这条线使用getRelativePath函数调用的结果设置Filename属性。
在编写本报告时,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写到DB时没有在记录上设置它,所以第二个条件是运行,而不是返回ASSETS_DIR . "/" . $this->getField("Name")的结果。
这就是解决的问题,现在需要一个解决方案。Silverstripe想要一个父文件夹,你只需要给它一个。
幸运的是,Folder类上有一个很小的函数,名为find_or_make,它可以按照名称的要求查找文件系统和DB中的文件夹记录,或者它会为您生成文件夹记录。
注意:在我自己的测试中,虽然我有一个“上传”文件夹,但我没有相应的DB记录,因此这个函数为我写了一个返回结果。
然后,我使用这个结果给出了我正在写入DB的图像一个ParentID,它使第二个var_dump返回与第一个相同的值。
在调用write之前,只需在代码中添加以下内容
$parentFolder = Folder::find_or_make('Uploads');
$img->setParentID($parentFolder->ID);https://stackoverflow.com/questions/28769308
复制相似问题