Загрузка изображения Silverstripe меняет название

Я загружаю изображение и сохраняю изображение, я устанавливаю имя файла как «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);