首页 > 解决方案 > symfony 4 上传文件时出错

问题描述

我正在尝试上传文件,非常遵循Symfony 食谱上的说明,但它似乎不起作用。

具体错误如下,但背景原因是文件本身似乎没有(或保持)上传。

调用字符串上的成员函数guessExtension()

碰巧的是,该文件暂时在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(),
    ));

}

标签: phpsymfonyfile-upload

解决方案


我找到了关于这个 SO question的解决方案。

文档,或者实际上是 Symfony 的食谱,是错误的。

我的代码上面的那行说明:

$file = $userxtra->getImgFile();

应该:

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


推荐阅读