Problèmes avec le téléchargement de fichiers multiples dans Symfony2
Je fais une application Symfony2 qui doit avoir une image multiple option de téléchargement. J'ai fait le simple téléchargement de fichiers à l'aide de l'article du cookbook: Comment gérer les Uploads de Fichier avec Doctrine qui fonctionne très bien. J'ai mis en œuvre la lifecyclecallbacks pour le téléchargement et la suppression.
Maintenant, j'ai besoin de transformer cela en un multiple système de téléchargement. J'ai lu quelques réponses de Débordement de Pile, mais rien ne semble fonctionner.
Débordement De Pile Question:
J'ai le code suivant à l'instant:
Fichier Entité:
<?php
namespace Webmuch\ProductBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\HttpFoundation\File\UploadedFile;
/**
* @ORM\Entity
* @ORM\HasLifecycleCallbacks
*/
class File
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
public $id;
/**
* @ORM\Column(type="string", length=255, nullable=true)
*/
public $path;
/**
* @Assert\File(maxSize="6000000")
*/
public $file = array();
public function __construct()
{
}
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set path
*
* @param string $path
*/
public function setPath($path)
{
$this->path = $path;
}
/**
* Get path
*
* @return string
*/
public function getPath()
{
return $this->path;
}
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';
}
/**
* @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();
}
}
/**
* @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);
}
}
}
FileController:
<?php
namespace Webmuch\ProductBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Webmuch\ProductBundle\Entity\File;
/**
* File controller.
*
* @Route("/files")
*/
class FileController extends Controller
{
/**
* Lists all File entities.
*
* @Route("/", name="file_upload")
* @Template()
*/
public function uploadAction()
{
$file = new File();
$form = $this->createFormBuilder($file)
->add('file','file',array(
"attr" => array(
"accept" => "image/*",
"multiple" => "multiple",
)
))
->getForm()
;
if ($this->getRequest()->getMethod() === 'POST') {
$form->bindRequest($this->getRequest());
$em = $this->getDoctrine()->getEntityManager();
$em->persist($file);
$em->flush();
$this->redirect($this->generateUrl('file_upload'));
}
return array('form' => $form->createView());
}
}
et la télécharger.html.twig:
{% extends '::base.html.twig' %}
{% block body %}
<h1>Upload File</h1>
<form action="#" method="post" {{ form_enctype(form) }}>
{{ form_widget(form.file) }}
<input type="submit" value="Upload" />
</form>
{% endblock %}
Je ne sais pas quoi faire pour faire ce travail comme un multiple de téléchargement de fichiers système. J'ai gardé les commentaires qu'ils le sont à partir des tutos que j'ai suivi donc je peux me rappeler ce que fait ce.
Mise à JOUR:
Nouveau Code Du Formulaire:
$images_form = $this->createFormBuilder($file)
->add('file', 'file', array(
"attr" => array(
"multiple" => "multiple",
"name" => "files[]",
)
))
->getForm()
;
Nouvelle Forme De Rameau Code:
<form action="{{ path('file_upload') }}" method="post" {{ form_enctype(images_form) }}>
{{ form_label(images_form.file) }}
{{ form_errors(images_form.file) }}
{{ form_widget(images_form.file, { 'attr': {'name': 'files[]'} }) }}
{{ form_rest(images_form) }}
<input type="submit" />
</form>
source d'informationauteur rahul tripathi
Vous devez vous connecter pour publier un commentaire.
C'est un problème connu comme référencé sur GitHub.
Comme ils le disent, vous devez ajouter
[]
à lafull_name
attribut dans votre template :Je ne sais pas si c'est possible avec l'annotation de la syntaxe. Donc je vais l'écrire dans la plaine de PHP dans le contrôleur de
Cela devrait fonctionner parfaitement depuis Symfony 2.4. Avant que vous avez à mettre le
multiple
attribut dans laattr
clé comme vous l'avez déjà fait.Comme je l'ai dit, vous devez faire ce travail avec des annotations. Il pourrait fonctionner, mais peut être moins lisible si vous avez de mettre tout cela en une seule ligne.
Avoir du plaisir 😉
J'ai eu le même problème récemment, suivi les suggestions ici, mais j'ai reçu une erreur, parce que le validateur 'fichier' ne peut pas gérer des tableaux.
Donc j'ai dû écrire mon propre programme de validation, qui peut traiter plusieurs fichiers. Pour cela, j'ai suivi ce tutoriel Symfony.comcopier/coller le code de programme de validation "fichier", encapsulé avec un
foreach
boucle et changé les variables en tant que de besoin.Si vous faites cela, vous pouvez l'utiliser pour
$file
dans votre entité.