gpt4 book ai didi

php - 如何使用 symfony2 "manually"处理文件上传?

转载 作者:可可西里 更新时间:2023-11-01 12:48:21 25 4
gpt4 key购买 nike

因为我有一个自定义构建的 jQuery 插件来将文件上传传递到我的 symfony2 webapp,所以我正在寻找在 Controller 中处理此上传的方法。

我目前拥有的标准(非 ajax)文件上传(并且适用于同步调用)看起来像这样

Controller 摘录

    ...

$entity = new Image();
$request = $this->getRequest();
$form = $this->createForm(new ImageType($createAction), $entity);
$form->bind($request); // <-- Find a way to make this connection manually?!

//check that a file was chosen
$fileExists = isset($entity->file);

if ( ($form->isValid()) && ($fileExists) ) {

$em = $this->getDoctrine()->getManager();

$em->persist($entity);
$em->flush();

}

...

表单类型:表单仅包含文件和名称:

class ImageType extends AbstractType
{

...

public function buildForm(FormBuilderInterface $builder, array $options)
{

$createAction = $this->createAction;

if ($createAction) {
$builder
->add('file')
;
}

$builder
->add('name', 'text', array('label' => 'Namn'))
;
}

...

}

据我了解(或者换句话说,显然不了解)带有 symfony2 和学说的文件上传系统,在这个调用中隐藏着相当多的魔法

$form->bind($request);

例如,如果我跳过这个 bind() 而是尝试像这样手动创建图像实体......

    $request = $this->getRequest();
$parent = $request->request->get('parent');
$file = $request->request->get('file1');
$name = $request->request->get('name');

$entity->setName( $name );
$entity->setFile( $file );
$entity->setFolder( null );

...我发现它甚至没有 setFile() ,因此可以通过其他方式处理。这是图像实体:

namespace BizTV\MediaManagementBundle\Entity;

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

/**
* BizTV\MediaManagementBundle\Entity\Image
*
* @ORM\Table(name="image")
* @ORM\Entity
* @ORM\HasLifecycleCallbacks
*/
class Image
{
/**
* @var integer $id
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;

/**
* @var string $name
*
* @ORM\Column(name="name", type="string", length=255)
* @Assert\NotBlank(message = "Bilden måste ha ett namn")
*/
private $name;

/**
* @var integer $width
*
* @ORM\Column(name="width", type="integer")
*/
private $width;

/**
* @var integer $height
*
* @ORM\Column(name="height", type="integer")
*/
private $height;

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


//The deleteRequested variable is to flag that an image has been deleted by user.
//Due to slideshow issues we can however not delete the image right away, we can't risk to remove it from the
//cache manifest before the slideshow round is up.

/**
* @var time $deleteRequested
*
* @ORM\Column(name="delete_requested", type="datetime", nullable=true)
*/
private $deleteRequested;


/**
* @var object BizTV\BackendBundle\Entity\company
*
* @ORM\ManyToOne(targetEntity="BizTV\BackendBundle\Entity\company")
* @ORM\JoinColumn(name="company", referencedColumnName="id", nullable=false)
*/
protected $company;

/**
* @var object BizTV\MediaManagementBundle\Entity\Folder
*
* @ORM\ManyToOne(targetEntity="BizTV\MediaManagementBundle\Entity\Folder")
* @ORM\JoinColumn(name="folder", referencedColumnName="id", nullable=true)
*/
protected $folder;


/**
* @Assert\File(maxSize="12000000")
*/
public $file;

/**
* @ORM\OneToOne(targetEntity="BizTV\MediaManagementBundle\Entity\QrImage", mappedBy="image")
*/
protected $qr;

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

/**
* @ORM\PostPersist()
* @ORM\PostUpdate()
*/
public function upload()
{
if (null === $this->file) {
return;
}

// if there is an error when moving the file, an exception will
// be automatically thrown by move(). This will properly prevent
// the entity from being persisted to the database on error
$this->file->move($this->getUploadRootDir(), $this->path);

unset($this->file);
}

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

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

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

protected function getUploadRootDir()
{
// the absolute directory path where uploaded documents should be saved
return __DIR__.'/../../../../web/'.$this->getUploadDir();

}

protected function getUploadDir()
{
// get rid of the __DIR__ so it doesn't screw when displaying uploaded doc/image in the view.
return 'uploads/images/'.$this->getCompany()->getId();
}


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

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

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

/**
* Set width
*
* @param integer $width
*/
public function setWidth($width)
{
$this->width = $width;
}

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

/**
* Set height
*
* @param integer $height
*/
public function setHeight($height)
{
$this->height = $height;
}

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

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

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

/**
* Set company
*
* @param BizTV\BackendBundle\Entity\company $company
*/
public function setCompany(\BizTV\BackendBundle\Entity\company $company)
{
$this->company = $company;
}

/**
* Get company
*
* @return BizTV\BackendBundle\Entity\company
*/
public function getCompany()
{
return $this->company;
}

/**
* Set folder
*
* @param BizTV\MediaManagementBundle\Entity\Folder $folder
*/
public function setFolder(\BizTV\MediaManagementBundle\Entity\Folder $folder = NULL)
{
$this->folder = $folder;
}

/**
* Get folder
*
* @return BizTV\MediaManagementBundle\Entity\Folder
*/
public function getFolder()
{
return $this->folder;
}


/**
* Set qr
*
* @param BizTV\MediaManagementBundle\Entity\QrImage $qr
*/
public function setQr(\BizTV\MediaManagementBundle\Entity\QrImage $qr = null)
{
$this->qr = $qr;
}

/**
* Get qr
*
* @return BizTV\MediaManagementBundle\Entity\QrImage
*/
public function getQr()
{
return $this->qr;
}


/**
* Set deleteRequested
*
* @param date $deleteRequested
*/
public function setDeleteRequested($deleteRequested = null)
{
$this->deleteRequested = $deleteRequested;
}

/**
* Get deleteRequested
*
* @return date
*/
public function getDeleteRequested()
{
return $this->deleteRequested;
}
}

最佳答案

我找到了我要找的东西。要从 Controller 访问上传到 symfony 的文件,您只需要这样做:

    $request = $this->getRequest();
$file = $request->files->get('file1'); //file1 being the name of my form field for the file

/* if your entity is set up like mine - like they teach you in the symfony2 cookbook
* file is actually a public property so you can just set it like this
**/
$entity->file = $file;

//and here's how you get the original name of that file
$entity->setName( $file->getClientOriginalName() );

关于php - 如何使用 symfony2 "manually"处理文件上传?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33567062/

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