Кажется, я не могу оборачивать голову тем, как я собираюсь добавить загрузку файла в DataFixture. Я пытаюсь загрузить изображение для фиктивного контента, который загружает мои приборы. Это похоже на то, что было бы полезно знать.
Хотя этот вопрос был задан 1 год назад, похоже, что информации о том, как загрузить файл через доктрину данных, не так много. Я мог только найти этот пост.
Я искал, и я принял несколько иной подход, чем ornj's. (Возможно, это касается обновлений Symfony).
Я сначала должен был
use Symfony\Component\HttpFoundation\File\UploadedFile;
а затем используйте copy (), чтобы скопировать изображение, потому что, как сказал ornj, он переместит его.
copy($art1->getFixturesPath() . '01.jpg', $art1->getFixturesPath() . '01-copy.jpg');
Затем создайте и добавьте файл, используя:
$file = new UploadedFile($art1->getFixturesPath() . '01-copy.jpg', 'Image1', null, null, null, true); $art1->setFile($file); $manager->persist($art1);
Если бы я не установил последний параметр в '' true '' в конструкторе '' UploadedFile '', поскольку он запускает неизвестную ошибку при запуске '' doctrine: fixtures: load ''. Этот параметр: «Включен ли тестовый режим». Видя, что это приспособление, имеет смысл установить режим тестирования.
Метод '' getFixturesPath () '' просто возвращает путь, где хранятся мои образцовые изображения:
// Entity file public function getFixturesPath() { return $this->getAbsolutePath() . 'web/uploads/art/fixtures/'; }
Метод '' getAbsolutePath () '' был взят из загрузки файлов Doctrine .
Полный рабочий код: Entity:
<?php //src/User/MyBundle/Entity/Art.php namespace User/MyBundle/Entity; use Doctrine\ORM\Mapping as ORM; use Symfony\Component\HttpFoundation\File\UploadedFile; use Symfony\Component\Validator\Constraints as Assert; /** * * Art Entity * * @ORM\Entity(repositoryClass="User\MyBundle\Entity\Repository\ArtRepository") * @ORM\Table(name="art") * @ORM\HasLifecycleCallbacks */ class Art { /** * @ORM\Id * @ORM\Column(type="integer") * @ORM\GeneratedValue(strategy="AUTO") */ protected $id; /** * @ORM\Column(type="string", length=100) */ protected $title; /** * @ORM\Column(type="string", length=255, nullable=true) */ protected $path; /** * @Assert\File(maxSize="6000000") */ private $file; private $temp; public function getAbsolutePath() { return null === $this->path ? null : $this->getUploadRootDir() . '/' . $this->path; } public function getWebPath() { return null === $this->path ? null : $this->getUploadDir() . '/' . $this->path; } protected function getUploadRootDir() { // the absolute directory path where uploaded // documents should be saved return __DIR__ . '/../../../../web/' . $this->getUploadDir(); } protected function getUploadDir() { // get rid of the __DIR__ so it doesn't screw up // when displaying uploaded doc/image in the view. return 'uploads/art'; } public function getFixturesPath() { return $this->getAbsolutePath() . 'web/uploads/art/fixtures/'; } /** * Sets file. * * @param UploadedFile $file */ public function setFile(UploadedFile $file = null) { $this->file = $file; // check if we have an old image path if (isset($this->path)) { // store the old name to delete after the update $this->temp = $this->path; $this->path = null; } else { $this->path = 'initial'; } } /** * Get file. * * @return UploadedFile */ public function getFile() { return $this->file; } /** * @ORM\PrePersist() * @ORM\PreUpdate() */ public function preUpload() { if (null !== $this->getFile()) { // do whatever you want to generate a unique filename $filename = sha1(uniqid(mt_rand(), true)); $this->path = $filename . '.' . $this->getFile()->guessExtension(); } } /** * @ORM\PostPersist() * @ORM\PostUpdate() */ public function upload() { // the file property can be empty if the field is not required if (null === $this->getFile()) { return; } // if there is an error moving the file, an exception will // be automatically thrown by move(). This will properly prevent // the entity from being persisted to the database on error $this->getFile()->move($this->getUploadRootDir(), $this->path); // check if we have an old image if (isset($this->temp)) { // delete the old image unlink($this->getUploadRootDir() . '/' . $this->temp); // clear the temp image path $this->temp = null; } $this->file = null; } /** * @ORM\PostRemove() */ public function removeUpload() { if ($file = $this->getAbsolutePath()) { unlink($file); } } }
Крепеж:
<?php // src/User/MyBundle/DataFixtures/ORM/ArtFixtures.php namespace User\MyBundle\DataFixtures\ORM; use Doctrine\Common\DataFixtures\AbstractFixture; use Doctrine\Common\DataFixtures\OrderedFixtureInterface; use Doctrine\Common\Persistence\ObjectManager; use Fredzz\LotwBundle\Entity\Art; use Symfony\Component\HttpFoundation\File\UploadedFile; class ArtFixtures extends AbstractFixture implements OrderedFixtureInterface { public function load(ObjectManager $manager) { $art1 = new Art(); $art1->setTitle('MyTitle'); $art1->setDescription('My description'); copy($art1->getFixturesPath() . '01.jpg', $art1->getFixturesPath() . '01-copy.jpg'); $file = new UploadedFile($art1->getFixturesPath() . '01-copy.jpg', 'Image1', null, null, null, true); $art1->setFile($file); $art1->setUser($manager->merge($this->getReference('user-1'))); $manager->persist($art1); $manager->flush(); } }
Надеюсь, это поможет кому-то! Извините, если что-то не так. Я все еще учусь 🙂
Я нашел ответ на свой вопрос. Мне нужно использовать класс Symfony\Component\HttpFoundation\File\File
для создания файла. Symfony будет физически перемещать файл, а не создавать копию, так что вам нужно либо иметь новый файл для каждого светильника, либо использовать copy()
чтобы создать копию файла, который можно переместить.
$image = new Image(); $file = new File('path/to/file.jpg'); $image->file = $file; $om->persist($image);
Что-то вроде того.
Изображение, которое вы хотите использовать, должно быть расположено в вашей папке «Веб», и вы должны использовать только строку указателя файла (например, «/web/images/test.png») в вашем устройстве данных.
Как правило, вы не должны хранить изображения в своей базе данных.
Я создал класс FileUpload для PHP 5.3+
Как использовать?:
Документация
из RFC 3023 (типы XML-носителей):
Тип «текст» на уровне верхнего уровня имеет некоторые ограничения на объекты MIME, и они описаны в [RFC2045] и [RFC2046]. В частности, не разрешено семейство UTF-16, UCS-4 и UTF-32 (кроме HTTP [RFC2616], в котором используется MIME-подобный механизм).
Разрешить загрузку только файла yaml:
<?php $file = new FileUpload\FileUpload(); $file->setInput( "file" ); $FileUpload->setAllowedMimeTypes(array( "text/x-yaml", //RFC 3023 "application/x-yaml", // Ruby on Rails "text/plain",//Possible option( only text plain ) "text/yaml",//Possible option "text/x-yaml",//Possible option "application/yaml",//Possible option )); $file->setDestinationDirectory("/var/www/html/myapp/"); $file->save(); if ($file->getStatus()) { echo "Okay"; } ?>
Пример со всеми типами mime:
<?php $file = new FileUpload\FileUpload(); $file->setInput( "file" ); $file->save(); if ($file->getStatus()) { echo "is Upload!"; } ?> <html> <head> <title>FileUpload Example</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> </head> <body> <form method="post" action="" enctype="multipart/form-data"> <input type="file" name="file" /> <input type="submit" value="Upload now!" /> </form> </body> </html>