Ошибка symfony 4 при загрузке файла

Я пытаюсь загрузить файл, очень следуя инструкциям на Поваренная книга 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(),
    ));

}

В комментарии к коду вы отметили, что getImageFile () outputs full path to upload_tmp_dir. Это строка, а не объект. Вы, конечно же, не можете использовать нотацию -> для переменной строкового типа. guessExtension () - это метод экземпляра UploadedFile.

marekful 02.08.2018 17:43

Я понимаю это, но это именно тот код, который вы найдете в кулинарной книге Symfony выше. Я предполагаю, что обычно он получил бы объект файла, если бы файл был там.

BernardA 02.08.2018 18:15
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
2
1 281
2

Ответы 2

Может быть, вы ищете что-то вроде

$form->getData('imgFile')->guessExtension();

вместо?

Обновлено: Ах, извините, пропустил, что вы предполагаете, что $file = $userxtra->getImgFile(); действительно возвращает объект UploadedFile. По-видимому, это предположение неверно, поскольку ошибка, которую вы видите, указывает на то, что вместо этого она возвращает строку.

Спасибо, но guessExtension () - это метод класса UploadedFile, а не класса $ form.

BernardA 02.08.2018 18:21

Я нашел решение на этот ТАК вопрос.

Документация, или на самом деле кулинарная книга Symfony, неверна.

Строка в моем коде выше, которая гласит:

$file = $userxtra->getImgFile();

должно быть:

$file = $form->get('imgFile')->getData();

Другие вопросы по теме