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