我非常尝试按照Symfony's cookbook上的说明上传文件,但是似乎无法正常工作。
具体错误如下,但背景原因是该文件似乎没有(或保持)上传。
在字符串上调用成员函数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(),
));
}
答案 0 :(得分:0)
也许您正在寻找类似
$form->getData('imgFile')->guessExtension();
相反?
编辑:抱歉,您错过了$file = $userxtra->getImgFile();
实际上返回了UploadedFile对象的信息。显然,这种假设是不正确的,因为您看到的错误表明它会返回一个字符串。
答案 1 :(得分:0)
我在this SO question上找到了解决方案。
文档或实际上是Symfony的食谱是错误的。
我上面的代码行指出:
$ file = $ userxtra-> getImgFile();
应为:
$ file = $ form-> get('imgFile')-> getData();