简体   繁体   中英

Symfony3 multiple upload files

I implemented a form for upload a file in a directory. I would use a multiple insert without manytomany relation.

This is my entity Document:

 namespace AppBundle\Entity;

 use Doctrine\ORM\Mapping as ORM;
 use Symfony\Component\Validator\Constraints as Assert;
 use Symfony\Component\HttpFoundation\File\UploadedFile;
/**
* @ORM\Entity
*/
class Document
{
/**
 * @ORM\Id
 * @ORM\Column(type="integer")
 * @ORM\GeneratedValue(strategy="AUTO")
 */
public $id;

/**
 * @Assert\File(maxSize="6000000")
 */
private $file;

/**
 * @ORM\Column(type="string", length=255)
 * @Assert\NotBlank
 */
public $name;

/**
 * @ORM\Column(type="string", length=255, nullable=true)
 */
public $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 up
    // when displaying uploaded doc/image in the view.
    return 'uploads/documents';
}

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

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

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

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

    return $this;
}

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

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

    return $this;
}

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

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

    // use the original file name here but you should
    // sanitize it at least to avoid any security issues
    // move takes the target directory and then the
    // target filename to move to
    $this->getFile()->move(
            $this->getUploadRootDir(), $this->getFile()->getClientOriginalName()
    );

    // set the path property to the filename where you've saved the file
    $this->path = $this->getUploadRootDir()."/".$this->getFile()->getClientOriginalName();
    // clean up the file property as you won't need it anymore
    $this->file = null;
}
}

And this is my controller:

public function uploadAction(Request $request) {
    $document = new Document();
    $form = $this->createFormBuilder($document)
            ->add('name')
            ->add('file',FileType::class,array(
                "attr" => array(
                    "accept" => "image/*",
                    "multiple" => "multiple",
                )
            ))
            ->add('save', SubmitType::class, array(
                'label' => 'Salva',
                'attr' => array('class' => 'btn btn-primary')
            ))
            ->getForm();
    $form->handleRequest($request);

    if ($form->isValid()) {
        $em = $this->getDoctrine()->getManager();
        $document->upload();
        $em->persist($document);
        $em->flush();

        return $this->redirectToRoute('immovable_upload');
    }

    return $this->render('AppBundle:Immovable:upload.html.twig', array(
                'form' => $form->createView(),
    ));
}

How to edit my code for insert more image?? It would be enough to have a repeater of the form so that it can only do multiple insertions??

I think you can try embed a collection of forms how described here http://symfony.com/doc/current/cookbook/form/form_collections.html .

And you can also use specific bundle https://github.com/glavweb/GlavwebUploaderBundle for your task.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM