Как я могу загрузить файл с VichUploaderBundle без формы?
У меня есть файл в каком-то каталоге (например web/media/tmp/temp_file.jpg
)
Если я попробую это:
$file = new UploadedFile($path, $filename);
$image = new Image();
$image->setImageFile($file);
$em->persist($image);
$em->flush();
У меня есть эта ошибка:
Файл «temp_file.jpg» не был загружен из-за неизвестной ошибки.
Мне нужно загрузить файл с удаленного URL. Поэтому я загружаю файл в tmp
direcotry (с curl), а затем я продолжаю пытаться внедрить его в VichUploadBundle (как вы можете видеть выше).
Короткий ответ: VichUploaderBundle
не поддерживает загрузку файлов без использования компонента Symfony Form.
Мне нужно загрузить файл с удаленного URL. Поэтому я загружаю файл в директорию tmp (с помощью curl), а затем продолжаю пытаться внедрить его в VichUploadBundle (как вы можете видеть выше).
В этом случае вам не нужно загружать, вам нужно скачать. И это не то, что VichUploaderBundle
предназначено сделать.
Принятый ответ не правильный (больше?). Согласно с документация по использованию
вы действительно можете вручную загрузить File
без использования компонента формы Symfony:
/**
* If manually uploading a file (i.e. not using Symfony Form) ensure an instance
* of 'UploadedFile' is injected into this setter to trigger the update. If this
* bundle's configuration parameter 'inject_on_load' is set to 'true' this setter
* must be able to accept an instance of 'File' as the bundle will inject one here
* during Doctrine hydration.
*
* @param File|\Symfony\Component\HttpFoundation\File\UploadedFile $image
*/
public function setImageFile(File $image = null)
{
$this->imageFile = $image;
if ($image) {
// It is required that at least one field changes if you are using doctrine
// otherwise the event listeners won't be called and the file is lost
$this->updatedAt = new \DateTime('now');
}
}
Вы должны использовать Symfony\Component\HttpFoundation\File\UploadedFile
вместо File
:
$file = new UploadedFile($filename, $filename, null, filesize($filename), false, true);
VichUploaderBundle
будет обрабатывать этот объект.