Я загружаю изображение и сохраняю изображение, я устанавливаю имя файла как «assets / Uploads / 54f092af271b9.png», но после сохранения поля Filename теряют часть. Он становится «активами / 54f092af271b9.png», полностью потеряв каталог «Uploads /». Это должно произойти?
Вот коды:
<?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 '
Есть идеи?
Я смог воспроизвести проблему с кодом, который вы указали. После того, как я начал копаться, вот что я нашел.
Все это начинается с функции onAfterWrite
в классе File
( Image
продолжается). Уволенный после того, как вы вызвали write
(очевидно), это вызывает updateFilesystem
где эта строка устанавливает свойство Filename
с результатом getRelativePath
функции 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")
ASSETS_DIR . "/" . $this->getField("Name")
ASSETS_DIR . "/" . $this->getField("Name")
.
Таким образом, проблема решена, теперь для решения. Silverstripe хочет родительскую папку, вы просто должны ее отдать.
К счастью, в классе Folder
называемом find_or_make
который делает то, что говорит это имя, есть небольшая функция, либо находит запись папок в файловой системе и БД, либо генерирует ее для вас.
Примечание. В моем собственном тестировании, когда у меня была папка «Загружает», у меня не было соответствующей записи БД, поэтому эта функция написала, что для меня возвратил результат.
Затем я использовал результат, чтобы дать изображение, которое я писал в БД ParentID
и это сделало второй var_dump
возвратом того же значения, что и первый.
Это все, что вам нужно добавить в свой код перед вызовом write
:
$parentFolder = Folder::find_or_make('Uploads'); $img->setParentID($parentFolder->ID);