Symfony2: загрузка файлов вручную с помощью VichUploaderBundle

Как я могу загрузить файл с 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 (как вы можете видеть выше).

5

Решение

Короткий ответ: VichUploaderBundle не поддерживает загрузку файлов без использования компонента Symfony Form.

Мне нужно загрузить файл с удаленного URL. Поэтому я загружаю файл в директорию tmp (с помощью curl), а затем продолжаю пытаться внедрить его в VichUploadBundle (как вы можете видеть выше).

В этом случае вам не нужно загружать, вам нужно скачать. И это не то, что VichUploaderBundle предназначено сделать.

1

Другие решения

Принятый ответ не правильный (больше?). Согласно с документация по использованию
вы действительно можете вручную загрузить 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');
}
}
6

Вы должны использовать Symfony\Component\HttpFoundation\File\UploadedFile вместо File:

$file = new UploadedFile($filename, $filename, null, filesize($filename), false, true);

VichUploaderBundle будет обрабатывать этот объект.

2
По вопросам рекламы [email protected]