I use Symfony 3.4 with PHP 5.6.
I want to use the vichuploader Bundle to download files. I managed to make it work normally. But now I want to be able to use the files directly from the controller to be able to use them in my database. After reading the documentation, I tried to do something.
I have on my index.html.twig the line :
<td><a href="{{ path('paquet_file', { 'id': uneInfo.id}) }}"</a>{{ uneInfo.urlPaquet }} </td>
On my controller :
namespace Site\PagesBundle\Controller;
use Site\PagesBundle\Entity\Paquet;
use Site\PagesBundle\Entity\TypeUser;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
use Vich\UploaderBundle\Handler\DownloadHandler;
//........
/**
* Serves an uploaded file.
*
* @Route("/{id}/file", name="paquet_file")
*/
public function fileAction(Paquet $paquet)
{
$downloadHandler = $this->get('vich_uploader.download_handler');
return $downloadHandler->downloadObject($paquet, $fileField = 'paquetFile', Paquet::class, true);
}
My entity :
<?php
namespace Site\PagesBundle\Entity;
use DateTimeImmutable;
use Doctrine\ORM\Mapping as ORM;
use Site\PagesBundle\Entity\Paquet;
use Site\PagesBundle\Entity\TypeUser;
use Symfony\Component\HttpFoundation\File\File;
use Doctrine\Common\Collections\ArrayCollection;
use Vich\UploaderBundle\Mapping\Annotation as Vich;
use Symfony\Component\HttpFoundation\File\UploadedFile;
/**
* Paquet
*
* @ORM\Table(name="paquet")
* @ORM\Entity(repositoryClass="Site\PagesBundle\Repository\PaquetRepository")
* @Vich\Uploadable
*/
class Paquet
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var \Doctrine\Common\Collections\Collection
* @ORM\ManyToMany(targetEntity="TypeUser")
* @ORM\JoinTable(name="Packages_des_TypesUser")
* @ORM\JoinColumn(nullable=false)
*/
private $typeUser;
public function __construct()
{
$this->typeUser = new ArrayCollection();
}
/**
* Get TypeUser
*
* @return Site\PagesBundle\Entity\TypeUser
*/
public function getTypeUser()
{
return $this->typeUser;
}
public function deleteTypeFromTypesUser(TypeUser $type)
{
$this->typeUser->removeElement($type);
}
/**
* Set typeUser
*
* @param Site\PagesBundle\Entity\TypeUser $typeUser
*
* @return Paquet
*/
public function setTypeUser(Site\PagesBundle\Entity\TypeUser $typeUser)
{
$this->typeUser = $typeUser;
return $this;
}
/**
* @var string
*
* @ORM\Column(name="titre", type="string", length=255)
*/
private $titre;
/**
* @var string
*
* @ORM\Column(name="urlPaquet", type="string", length=255)
*/
private $urlPaquet;
/**
* @Vich\UploadableField(mapping="paquet", fileNameProperty="urlPaquet")
* @var File
*/
private $paquetFile;
/**
* @ORM\Column(type="datetime")
*
* @var \DateTime
*/
private $updatedAt;
/**
* @param File|UploadedFile $unPaquetFile
*
* @return Paquet
*/
public function setPaquetFile(File $unPaquetFile = null)
{
$this->paquetFile = $unPaquetFile;
if ($unPaquetFile)
{
$this->updatedAt = new \DateTimeImmutable();
}
return $this;
}
/**
* Set updatedAt
*
* @param \DateTime $updatedAt
*
* @return Paquet
*/
public function setUpdatedAt($updatedAt)
{
$this->updatedAt = $updatedAt;
return $this;
}
/**
* Get updatedAt
*
* @return \DateTime
*/
public function getUpdatedAt()
{
return $this->updatedAt;
}
/**
* @return File|null
*/
public function getPaquetFile()
{
return $this->paquetFile;
}
/**
* @var string
*
* @ORM\Column(name="urlNotice", type="string", length=255)
*/
private $urlNotice;
/**
* @Vich\UploadableField(mapping="notice", fileNameProperty="urlNotice")
* @var File
*/
private $noticeFile;
/**
* @var string
*
* @ORM\Column(name="commentaire", type="text")
*/
private $commentaire;
/**
* Get id
*
* @return int
*/
public function getId()
{
return $this->id;
}
/**
* Set titre
*
* @param string $titre
*
* @return Paquet
*/
public function setTitre($titre)
{
$this->titre = $titre;
return $this;
}
/**
* Get titre
*
* @return string
*/
public function getTitre()
{
return $this->titre;
}
/**
* Set urlPaquet
*
* @param string $urlPaquet
*
* @return Paquet
*/
public function setUrlPaquet($urlPaquet)
{
$this->urlPaquet = $urlPaquet;
return $this;
}
/**
* Get urlPaquet
*
* @return string|null
*/
public function getUrlPaquet()
{
return $this->urlPaquet;
}
/**
* @return File|null
*/
public function getNoticeFile()
{
return $this->noticeFile;
}
/**
* @param File|UploadedFile $uneNoticeFile
*
* @return Paquet
*/
public function setNoticeFile(File $uneNoticeFile = null)
{
$this->noticeFile = $uneNoticeFile;
if ($uneNoticeFile)
{
$this->updatedAt = new \DateTimeImmutable();
}
return $this;
}
/**
* Set urlNotice
*
* @param string $urlNotice
*
* @return Paquet
*/
public function setUrlNotice($urlNotice)
{
$this->urlNotice = $urlNotice;
return $this;
}
/**
* Get urlNotice
*
* @return string
*/
public function getUrlNotice()
{
return $this->urlNotice;
}
/**
* Set commentaire
*
* @param string $commentaire
*
* @return Paquet
*/
public function setCommentaire($commentaire)
{
$this->commentaire = $commentaire;
return $this;
}
/**
* Get commentaire
*
* @return string
*/
public function getCommentaire()
{
return $this->commentaire;
}
}
But when I click on the URL file :
I have this file :
Thanks for your help !
I don't use this bundle yet (I plan to work with it soon though). But from what I see in the doc page : https://github.com/dustin10/VichUploaderBundle/blob/master/Resources/doc/downloads/serving_files_with_a_controller.md the 4th argument is the filename while you set true to it.
So maybe it's just a filename issue ? You could try to set filename to null (I guess it will take the real filename by default) or set your own filename (with extension) as the 4th argument in the downloadObject()
call.