gpt4 book ai didi

file-upload - symfony 4字符串而不是文件类型创建的表单集合实体中的UploadedFile

转载 作者:行者123 更新时间:2023-12-02 03:26:23 25 4
gpt4 key购买 nike

我有以下错误:“传递给 App\Service\FileUploader::upload() 的参数 1 必须是 Symfony\Component\HttpFoundation\File\UploadedFile 的实例,给出的字符串”

我应用了 this post 中找到的解决方案但这并没有改变任何事情。很正常,不是完全相同的错误。有人可以帮我吗?

我的目标是从公司屏幕将多个文档附加到公司。

从昨天早上开始我就一直在努力解决这个问题。现在,我是时候离开键盘一两个小时了......

这是代码:

文档实体

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
* @ORM\Entity(repositoryClass="App\Repository\DocumentRepository")
*/
class Document
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;

/**
* @ORM\Column(type="string", length=255)
*/
private $fichier;

/**
* @var UploadedFile
*/
private $file;

// ...
}

企业实体

namespace App\Entity;

use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;

/**
* @ORM\Entity(repositoryClass="App\Repository\EntrepriseRepository")
*/
class Entreprise
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;

/**
* @ORM\OneToMany(targetEntity="App\Entity\Document", mappedBy="entreprise", orphanRemoval=true, cascade={"persist"})
*/
private $documents;

// ...

public function __construct()
{
$this->documents = new ArrayCollection();
}

// ...

public function getDocuments()
{
return $this->documents;
}

public function addDocument(Document $document)
{
if (!$this->documents->contains($document)) {
$this->documents[] = $document;
//...
}

return $this;
}

public function removeDocument(Document $document)
{
if ($this->documents->contains($document)) {
$this->documents->removeElement($document);
}

return $this;
}
}

企业表单类型命名空间 App\Form\Type;

use App\Entity\Entreprise;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\IntegerType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\CollectionType;
use Symfony\Component\Form\Extension\Core\Type\FileType;

use Symfony\Bridge\Doctrine\Form\Type\EntityType;

class EntrepriseType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('documents', CollectionType::class, [
'entry_type' => DocumentType::class,
'entry_options' => ['label' => false],
'allow_add' => true,
'by_reference' => false,
'allow_delete' => true,
])
// ...
;
}

public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => Entreprise::class,
]);
}
}

企业控制员

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\File\Exception\FileException;
use Symfony\Component\Routing\Annotation\Route;
use Doctrine\Common\Persistence\ObjectManager;
use Symfony\Component\HttpFoundation\Request;

use App\Entity\Entreprise;
use App\Form\Type\EntrepriseType;
use App\Repository\EntrepriseRepository;
use App\Service\FileUploader;

class EntrepriseController extends AbstractController
{
/**
* @Route("/entreprise/{id}", name="entreprise_detail")
* @Route("/entreprise/new", name="entreprise_new")
*/
public function index(Entreprise $entreprise = null, Request $request, ObjectManager $manager, FileUploader $fileUploader)
{
if (!$entreprise) {
$entreprise = new Entreprise();
}

$formDetail = $this->createForm(EntrepriseType::class, $entreprise);
$formDetail->handleRequest($request);

if ($formDetail->isSubmitted() && $formDetail->isValid()) {
$this->setDefault($entreprise);

// Téléchargement des nouveaux documents rattachés à l'entreprise
$documents = $entreprise->getDocuments();
foreach ($documents as $document) {
if (!$document->getId()){
/** @var Symfony\Component\HttpFoundation\File\UploadedFile $file */
$file = $document->getFile();

$document->setFichier($fileUploader->upload($file));
}
}

// Mise à jour de la base de données
$manager->persist($entreprise);
$manager->flush();

return $this->redirectToRoute('entreprise_detail', ['id'=> $entreprise->getId()]);
}

return $this->render('entreprise/index.html.twig', [
'formDetail' => $formDetail->createView(),
'entreprise' => $entreprise,
]);
}
// ...
}

PS:抱歉,如果我的英语不够好,但如果您愿意,您可以用法语回答。

最佳答案

我遇到了同样的问题,并通过删除实体中 getFile() 和 setFile() 中的类型转换来解决它。我想这位于您的文档实体中。

寻找:

public function getFile(): ?string
{
return $this->file;
}

public function setFile(string $file): self
{
$this->file = $file;

return $this;
}

并将其替换为

public function getFile()
{
return $this->file;
}

public function setFile($file): self
{
$this->file = $file;

return $this;
}

这将确保文件属性将具有 UploadedFile 类的实例,而不是调用同一类的 __toString 方法(由于类型转换为字符串)。

关于file-upload - symfony 4字符串而不是文件类型创建的表单集合实体中的UploadedFile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53283594/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com