Я пытаюсь загрузить файл, очень следуя инструкциям на Поваренная книга Symfony, но, похоже, это не работает.
Конкретная ошибка заключается в следующем, но основная причина заключается в том, что файл как таковой не кажется (или не остается) загруженным.
Call to a member function guessExtension() on string
Как это бывает, файл на мгновение создается в upload_tmp_dir, но почти сразу же удаляется (я знаю это, потому что я сохранил этот каталог видимым в моем Finder).
Метаданные файла доступны с помощью команды var_dump ($ _ FILES) в сценарии ниже.
Итак, по какой-то причине файл отбрасывается, что, как я полагаю, вызывает конкретную ошибку, указанную выше.
Я считаю, что $ file (из UploadedFile) должен получить файл как таковой, а не путь к нему, но не знаю, как туда добраться. В частности, файл не остается в каталоге upload_tmp_dir.
Для информации, я попробовал загрузить в простой PHP-проект, который у меня есть, и он отлично работает. Файл остается в upload_tmp_dir до тех пор, пока не будет перемещен в другое место.
Спасибо
Вот контроллер:
class ApiUserXtraController extends Controller
{
public function UserXtraAction(Request $request, ValidatorInterface $validator) {
$is_logged = $this->isGranted('IS_AUTHENTICATED_FULLY');
if ($is_logged) {
$user = $this->getUser();
}
$em = $this->getDoctrine()->getManager();
$repo = $em->getRepository(UserXtra::class);
$userxtra = new UserXtra();
$form = $this->createFormBuilder($userxtra)
->add('imgFile', FileType::class, array('label' => 'file'))
->add('save', SubmitType::class, array('label' => 'Create Task'))
->getForm();
var_dump($_FILES); // outputs file metadata, ie, name, type, tmp_name, size
$form->handleRequest($request);
$userxtra->setUser($user);
if ($form->isSubmitted() && $form->isValid()) {
/**
* @var UploadedFile $file
* */
$file = $userxtra->getImgFile();
var_dump('file', $file);// outputs full path to upload_tmp_dir
$fileName = $this->generateUniqueFileName().'.'.$file->guessExtension(); // **THIS THROWS THE ERROR**
$file->move(
$this->getParameter('user_image_directory'),
$fileName
);
$userxtra->setImgFile($fileName);
//$data = json_decode($data);
return new JsonResponse(array(
'status' => 'ok',
'is_logged' => $is_logged,
));
}
return $this->render('upload.html.twig', array(
'form' => $form->createView(),
));
}
Я понимаю это, но это именно тот код, который вы найдете в кулинарной книге Symfony выше. Я предполагаю, что обычно он получил бы объект файла, если бы файл был там.






Может быть, вы ищете что-то вроде
$form->getData('imgFile')->guessExtension();
вместо?
Обновлено: Ах, извините, пропустил, что вы предполагаете, что $file = $userxtra->getImgFile(); действительно возвращает объект UploadedFile. По-видимому, это предположение неверно, поскольку ошибка, которую вы видите, указывает на то, что вместо этого она возвращает строку.
Спасибо, но guessExtension () - это метод класса UploadedFile, а не класса $ form.
Я нашел решение на этот ТАК вопрос.
Документация, или на самом деле кулинарная книга Symfony, неверна.
Строка в моем коде выше, которая гласит:
$file = $userxtra->getImgFile();
должно быть:
$file = $form->get('imgFile')->getData();
В комментарии к коду вы отметили, что getImageFile ()
outputs full path to upload_tmp_dir. Это строка, а не объект. Вы, конечно же, не можете использовать нотацию->для переменной строкового типа. guessExtension () - это метод экземпляра UploadedFile.