Symfony2 Datei-upload: so speichern Sie die Datei Pfad in der Lehre?
Ich habe ein problem mit dem speichern der Pfad in der Lehre aus einer Datei hochladen. Verwendet habe ich das Beispiel von hier: Zu behandeln, wie Datei-Uploads mit Lehre
Der upload funktioniert, aber ich bekomme nicht den Pfad der Datei in der Datenbank gespeichert, und ich denke, dass die Rückrufe nicht arbeiten. Zumindest meine uploads nicht über eine Datei-Erweiterung.
Hier kommt mein controller:
public function uploadAction()
{
$document = new Document();
//$form = $this->createForm(new DocumentType(), $entity);
$form = $this->createFormBuilder($document)
->add('name')
->add('file')
->getForm()
;
if ($this->getRequest()->getMethod() === 'POST') {
$form->bindRequest($this->getRequest());
if ($form->isValid()) {
$em = $this->getDoctrine()->getEntityManager();
$em->persist($document);
$em->flush();
$this->redirect($this->generateUrl('document'));
}
}
return $this->render("ISClearanceBundle:Document:upload.html.twig",array('form' => $form->createView()));
}
Hier ist die Stelle:
<?php
namespace IS\ClearanceBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Symfony\Component\Validator\Constraints as Assert;
/**
* IS\ClearanceBundle\Entity\Document
* @ORM\Entity
* @ORM\HasLifecycleCallbacks
*/
class Document
{
/**
* @var string $name
*/
private $name;
/**
* @ORM\Column(type="string", length=255, nullable=true)
*/
public $path;
/**
* @var integer $projectId
*/
private $projectId;
/**
* @var integer $id
*/
private $id;
/**
* @Assert\File(maxSize="6000000")
*/
public $file;
/**
* Set name
*
* @param string $name
*/
public function setName($name)
{
$this->name = $name;
}
/**
* Get name
*
* @return string
*/
public function getName()
{
return $this->name;
}
/**
* Set path
*
* @param integer $path
*/
public function setPath($path)
{
$this->path = $path;
}
/**
* Get path
*
* @return integer
*/
public function getPath()
{
return $this->path;
}
/**
* Set projectId
*
* @param integer $projectId
*/
public function setProjectId($projectId)
{
$this->projectId = $projectId;
}
/**
* Get projectId
*
* @return integer
*/
public function getProjectId()
{
return $this->projectId;
}
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
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/documents';
}
/**
* @ORM\PrePersist()
* @ORM\PreUpdate()
*/
public function preUpload()
{
if (null !== $this->file) {
//do whatever you want to generate a unique name
$this->path = uniqid().'.'.$this->file->guessExtension();
}
$this->path = uniqid().'.'.$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);
$this->setPath($this->path);
unset($this->file);
}
/**
* @ORM\PostRemove()
*/
public function removeUpload()
{
if ($file = $this->getAbsolutePath()) {
unlink($file);
}
}
}
Ich weiß wirklich nicht, wie Sie speichern den Pfad zu der Datenbank und wie man Debuggen.
Vielen Dank für jede Hilfe!!!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Blick auf upload () - Methode. Es haben postPersist (), was bedeutet, dass die Entität, die änderungen werden NICHT gespeichert DB, so verändert die Eigenschaften nicht gespeichert werden, in Strom speichern.
Müssen Sie update-Pfad-Methode mit prePersist annotation und bewegen Sie die Datei in der die Methode mit postPersist. Auch nicht unset %this->Datei, geben Sie einfach den Wert null.
Basierend auf Ihrer Klasse
Und denken Sie daran, dass mit bewegen sollte der absolute Pfad auf Ihrem server also z.B. /var/www/my_app/web/storage/uploads/file.jpg oder C:\www\my_app\web\storage\uploads\file.jpg (nicht sich sorgen zu viel über riesige Richtung, wenn Sie nur "/", es sollte funktionieren)