gpt4 book ai didi

php - 如何在 Symfony2 中处理具有多对一关系的文件上传?

转载 作者:搜寻专家 更新时间:2023-10-31 22:06:30 24 4
gpt4 key购买 nike

我正在创建一个用于练习的票证系统。

现在我在上传文件时遇到问题。

想法是一张工单可以有多个附件,所以我在工单和上传表之间创建了一个多对一的关系。

class Ticket {

// snip

/**
* @ORM\OneToMany(targetEntity="Ticket", mappedBy="ticket")
*/
protected $uploads;

// snip
}

上传实体类包含我从 this 中获取的上传功能教程:

<?php

namespace Sytzeandreae\TicketsBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\HttpFoundation\File\UploadedFile;

/**
* @ORM\Entity(repositoryClass="Sytzeandreae\TicketsBundle\Repository\UploadRepository")
* @ORM\Table(name="upload")
* @ORM\HasLifecycleCallbacks
*/
class Upload
{
/**
* @Assert\File(maxSize="6000000")
*/
private $file;

private $temp;

/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;

/**
* @ORM\ManyToOne(targetEntity="Ticket", inversedBy="upload")
* @ORM\JoinColumn(name="ticket_id", referencedColumnName="id")
*/
protected $ticket;

/**
* @ORM\Column(type="string")
*/
protected $title;

/**
* @ORM\Column(type="string")
*/
protected $src;

public function getAbsolutePath()
{
return null === $this->src
? null
: $this->getUploadRootDir().'/'.$this->src;
}

public function getWebPath()
{
return null === $this->src
? null
: $this->getUploadDir().'/'.$this->src;
}

public function getUploadRootDir()
{
// The absolute directory path where uplaoded documents should be saved
return __DIR__.'/../../../../web/'.$this->getUploadDir();
}

public function getUploadDir()
{
// Get rid of the __DIR__ so it doesn/t screw up when displaying uploaded doc/img in the view
return 'uploads/documents';
}

/**
* Sets file
*
* @param UploadedFile $file
*/
public function setFile(UploadedFile $file = null)
{
$this->file = $file;

if (isset($this->path)) {
// store the old name to delete after the update
$this->temp = $this->path;
$this->path = null;
} else {
$this->path = 'initial';
}
}

/**
* Get file
*
* @return UploadedFile
*/
public function getFile()
{
return $this->file;
}

/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}

/**
* Set title
*
* @param string $title
*/
public function setTitle($title)
{
$this->title = $title;
}

/**
* Get title
*
* @return string
*/
public function getTitle()
{
return $this->title;
}

/**
* Set src
*
* @param string $src
*/
public function setSrc($src)
{
$this->src = $src;
}

/**
* Get src
*
* @return string
*/
public function getSrc()
{
return $this->src;
}

/**
* Set ticket
*
* @param Sytzeandreae\TicketsBundle\Entity\Ticket $ticket
*/
public function setTicket(\Sytzeandreae\TicketsBundle\Entity\Ticket $ticket)
{
$this->ticket = $ticket;
}

/**
* Get ticket
*
* @return Sytzeandreae\TicketsBundle\Entity\Ticket
*/
public function getTicket()
{
return $this->ticket;
}

/**
* @ORM\PrePersist()
* @ORM\PreUpdate()
*/
public function preUpload()
{
if (null !== $this->getFile()) {
// do whatever you want to generate a unique name
$filename = sha1(uniqid(mt_rand(), true));
$this->src = $filename.'.'.$this->getFile()->guessExtension();
}
}

public function upload()
{
// the file property can be empty if the field is not required
if (null === $this->getFile()) {
return;
}

// move takes the target directory and then the target filename to move to
$this->getFile()->move(
$this->getUploadRootDir(),
$this->src
);

// check if we have an old image
if (isset($this->temp)) {
// delete the old image
unlink($this->getUploadRootDir().'/'.$this->temp);
// clear the temp image path
$this->temp = null;
}

// clean up the file property as you won't need it anymore
$this->file = null;
}

/**
* @ORM\PostRemove
*/
public function removeUpload()
{
if ($file = $this->getAbsolutePath()) {
unlink($file);
}
}
}

表单构建如下:

class TicketType extends AbstractType
{
public function buildForm(FormBuilder $builder, array $options)
{
$builder
->add('title')
->add('description')
->add('priority')
->add('uploads', new UploadType())
}

UploadType 看起来像这样:

class UploadType extends AbstractType
{
public function buildForm(FormBuilder $builder, array $options) {
$builder->add('file', 'file', array(
'label' => 'Attachments',
'required' => FALSE,
'attr' => array (
'accept' => 'image/*',
'multiple' => 'multiple'
)
));
}

这部分似乎工作正常,我确实得到了一个包含文件 uploader 的表单。

一旦我将此行放入 Ticket 实体的构造函数中: $this->uploads = new\Doctrine\Common\Collections\ArrayCollection();它抛出以下错误:

Neither property "file" nor method "getFile()" nor method "isFile()" exists in class "Doctrine\Common\Collections\ArrayCollection"

如果我离开这一行并上传文件,它会抛出以下错误:

"Sytzeandreae\TicketsBundle\Entity\Ticket". Maybe you should create the method "setUploads()"?

所以接下来我做的就是创建这个方法,再次尝试上传,现在它抛出我:

Class Symfony\Component\HttpFoundation\File\UploadedFile is not a valid entity or mapped super class.

这是我真正被困住的地方。我看不出我在什么阶段做错了什么,希望得到一些帮助:)

谢谢!

最佳答案

您可以添加 collection field-type UploadType() 到您的表单。请注意,您不能对当前的 Upload 实体使用 multiple 选项……但这是最快的解决方案。

或者调整您的 Ticket 实体,使其能够处理 ArrayCollection 中的多个文件并循环处理它们。

关于php - 如何在 Symfony2 中处理具有多对一关系的文件上传?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17676520/

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