ninegate/src/ninegate-1.0/src/Cadoles/CoreBundle/Controller/FileController.php

387 lines
16 KiB
PHP

<?php
namespace Cadoles\CoreBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\Form\FormError;
use Symfony\Component\HttpFoundation\BinaryFileResponse;
use Symfony\Component\HttpFoundation\ResponseHeaderBag;
use Symfony\Component\Finder\Finder;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\HttpFoundation\File\File;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
class FileController extends Controller
{
public function listAction($directory,Request $request,$access="config") {
$canupdate= $this->getPermission($access,$directory);
$subdirectory=$request->get("subdirectory");
$clear=$request->get("clear");
$view=$request->get("view");
$defaultview=$request->get("defaultview");
// Récupérer en session le dernier subdirectory visité
$sessionsubdirectory = $this->get('session')->get('sessionsubdirectory');
if(!is_array($sessionsubdirectory)) $sessionsubdirectory=[];
if($clear) {
if(array_key_exists($directory,$sessionsubdirectory)) unset($sessionsubdirectory[$directory]);
$this->get('session')->set('sessionsubdirectory',$sessionsubdirectory);
}
else {
if(!$subdirectory) {
if(array_key_exists($directory,$sessionsubdirectory)) $subdirectory=$sessionsubdirectory[$directory];
}
else {
$sessionsubdirectory[$directory] = $subdirectory;
$this->get('session')->set('sessionsubdirectory',$sessionsubdirectory);
}
}
// Récupérer en session le mode de visualisation
$sessionviewdirectory = $this->get('session')->get('sessionviewdirectory');
if(!is_array($sessionviewdirectory)) $sessionviewdirectory=[$directory=>$defaultview];
if($view)
$sessionviewdirectory[$directory] = $view;
$this->get('session')->set('sessionviewdirectory',$sessionviewdirectory);
// Construire le chemin réel
$iddirectory=explode("-",$directory)[1];
$fulldirectory=$this->get('kernel')->getRootDir()."/../uploads/file/".$directory."/".$subdirectory;
$parents=null;
$dirname="Home";
if($subdirectory) {
$parents=explode("/",$subdirectory);
$dirname=end($parents);
array_pop($parents);
}
// Générer le tableau de fichiers
$files=[];
$dirs=[];
$fs = new Filesystem();
if($fs->exists($fulldirectory)) {
$finder = new Finder();
$finder->depth('== 0')->sortByName()->in($fulldirectory)->exclude('thumb')->exclude('thumbmini');
foreach ($finder as $file) {
if(is_dir($file)) {
$tmp=[];
$tmp["name"]=$file->getRelativePathname();
array_push($dirs,$tmp);
}
else {
$tmp=[];
$tmp["name"]=$file->getRelativePathname();
$tmp["extension"]=strtolower($file->getExtension());
$fileinfo = new file($file->getPathname());
$tmp["minetype"]=$fileinfo->getMimeType();
$tmp["minefamily"]=explode("/",$tmp["minetype"])[0];
$tmp["thumb"]="";
if($tmp["extension"]=="pdf") {
$tmp["thumb"]="/".$this->getParameter('alias')."/bundles/cadolescore/images/files/".$tmp["extension"].".png";
}
elseif($fs->exists($fulldirectory."/thumbmini/".$tmp["name"])) {
$data = file_get_contents($fulldirectory."/thumbmini/".$tmp["name"]);
$tmp["thumb"]="data:image/" . $tmp["extension"] . ";base64," . base64_encode($data);
}
elseif($fs->exists($fulldirectory."/thumb/".$tmp["name"])) {
$data = file_get_contents($fulldirectory."/thumb/".$tmp["name"]);
$tmp["thumb"]="data:image/" . $tmp["extension"] . ";base64," . base64_encode($data);
}
elseif($fs->exists($this->get('kernel')->getRootDir()."/../web/bundles/cadolescore/images/files/".$tmp["extension"].".png")) {
$tmp["thumb"]="/".$this->getParameter('alias')."/bundles/cadolescore/images/files/".$tmp["extension"].".png";
}
array_push($files,$tmp);
}
}
}
return $this->render('CadolesCoreBundle:File:list.html.twig',[
'useheader' => false,
'usemenu' => false,
'usesidebar' => false,
'access' => $access,
'iddirectory' => $iddirectory,
'directory' => $directory,
'parents' => $parents,
'subdirectory' => $subdirectory,
'dirname' => $dirname,
'dirs' => $dirs,
'files' => $files,
'canupdate' => $canupdate,
'canadd' => $canupdate,
'view' => $sessionviewdirectory[$directory],
]);
}
public function uploadAction($id,$type,Request $request,$access="config")
{
$subdirectory=$request->get("subdirectory");
$forcereload=(is_null($request->get("forcereload"))?true:$request->get("forcereload"));
return $this->render('CadolesCoreBundle:File:upload.html.twig',[
'useheader' => false,
'usemenu' => false,
'usesidebar' => false,
'access' => $access,
'id' => $id,
'type' => $type,
'subdirectory' => $subdirectory,
'forcereload' => $forcereload,
]);
}
public function subdirectoryAction($id,$type,Request $request,$access="config")
{
$subdirectory=$request->get("subdirectory");
$defaultData = [];
$form = $this->createFormBuilder()
->add('subdirectory', TextType::class,["label"=>"Répertoire"])
->add('submit', SubmitType::class,["label"=>"Valider"])
->getForm();
$form->handleRequest($request);
$toclose=false;
if ($form->isSubmitted() && $form->isValid()) {
$data = $form->getData();
if($data["subdirectory"]=="thumb"||$data["subdirectory"]=="thumbmini") {
$form->addError(new FormError('Nom de répertoire réservé, merci de choisir un autre nom de répertoire'));
$this->get('session')->getFlashBag()->clear();
$request->getSession()->getFlashBag()->add("error", 'Nom de répertoire réservé, merci de choisir un autre nom de répertoire');
}
else {
$filesystem = new Filesystem();
$fulldirectory=$this->get('kernel')->getRootDir()."/../uploads/file/".$id;
if($subdirectory) $fulldirectory.="/".$subdirectory."/".$data["subdirectory"];
else $fulldirectory.="/".$data["subdirectory"];
$filesystem->mkdir($fulldirectory);
$toclose=true;
}
}
return $this->render('CadolesCoreBundle:File:subdirectory.html.twig',[
'useheader' => false,
'usemenu' => false,
'usesidebar' => false,
'access' => $access,
'id' => $id,
'type' => $type,
'subdirectory' => $subdirectory,
'form' => $form->createView(),
'toclose' => $toclose,
]);
}
public function deleteAction(Request $request,$access="config")
{
// S'assurer que c'est un appel ajax
if (!$request->isXmlHttpRequest()) {
return new JsonResponse(array('message' => 'Interdit'), 400);
}
$output=array();
$directory=$request->request->get('directory');
$subdirectory=$request->request->get('subdirectory');
$filename=$request->request->get('filename');
if($subdirectory) $directory.="/".$subdirectory;
$this->getPermission($access,$directory);
$fs = new Filesystem();
$url=$this->get('kernel')->getRootDir()."/../uploads/file/".$directory."/".$filename;
if($fs->exists($url)) {
$fs->remove($url);
}
$response = new Response(json_encode($output));
$response->headers->set('Content-Type', 'application/json');
return $response;
}
public function viewAction($directory,$filename,Request $request,$access="config")
{
$this->getPermission($access,$directory);
$subdirectory=$request->query->get('subdirectory');
$navigation = $request->query->get('navigation');
$tbprev=[];
$tbnext=[];
$url=$this->get('kernel')->getRootDir()."/../uploads/file/".$directory;
if($subdirectory) $url.="/".$subdirectory;
$url.="/".$filename;
$file = new file($url);
$minetype=$file->getMimeType();
$minefamily=explode("/",$minetype)[0];
if($minefamily=="text" || $minefamily=="image" || $minetype == "application/pdf") {
$image="";
if($minefamily=="image") {
$image = "data:image/" . $file->getExtension() . ";base64," . base64_encode(file_get_contents($url));
if($navigation) {
$dir=$this->get('kernel')->getRootDir()."/../uploads/file/".$directory;
$files=[];
$fs = new Filesystem();
if($fs->exists($dir)) {
$finder = new Finder();
$finder->sortByName()->in($dir)->exclude('thumb')->exclude("thumbmini");
$i=-1;
foreach ($finder as $key => $file) {
$i++;
if($file->getRelativePathname()==$filename) {
$keyprev=$i-1;
$keynext=$i+1;
}
$tmp=[];
$tmp["name"]=$file->getRelativePathname();
$tmp["extension"]=$file->getExtension();
$fileinfo = new file($file->getPathname());
$tmp["minetype"]=$fileinfo->getMimeType();
$tmp["minefamily"]=explode("/",$tmp["minetype"])[0];
$tmp["thumb"]="";
if($fs->exists($dir."/thumb/".$tmp["name"])) {
$data = file_get_contents($dir."/thumb/".$tmp["name"]);
$tmp["thumb"]="data:image/" . $tmp["extension"] . ";base64," . base64_encode($data);
}
array_push($files,$tmp);
}
if(array_key_exists($keyprev,$files))
$tbprev=$files[$keyprev];
if(array_key_exists($keynext,$files))
$tbnext=$files[$keynext];
}
}
}
return $this->render('CadolesCoreBundle:File:view.html.twig',[
'useheader' => false,
'usemenu' => false,
'usesidebar' => false,
'access' => $access,
'directory' => $directory,
'subdirectory' => $subdirectory,
'minefamily' => $minefamily,
'minetype' => $minetype,
'filename' => $filename,
'image' => $image,
'prev' => $tbprev,
'next' => $tbnext
]);
}
else {
// normalement le widget ne fait jamais passer par là
$response = new BinaryFileResponse($file);
$response->setContentDisposition(ResponseHeaderBag::DISPOSITION_INLINE);
return $response;
}
}
public function showAction($directory,$filename,Request $request,$access="config")
{
$this->getPermission($access,$directory);
$subdirectory=$request->query->get('subdirectory');
$file=$this->get('kernel')->getRootDir()."/../uploads/file/".$directory;
if($subdirectory) $file.="/".$subdirectory;
$file.="/".$filename;
$response = new BinaryFileResponse($file);
$response->setContentDisposition(ResponseHeaderBag::DISPOSITION_INLINE);
return $response;
}
public function downloadAction($directory,$filename,Request $request,$access="config")
{
$this->getPermission($access,$directory);
$subdirectory=$request->query->get('subdirectory');
$file=$this->get('kernel')->getRootDir()."/../uploads/file/".$directory;
if($subdirectory) $file.="/".$subdirectory;
$file.="/".$filename;
$response = new BinaryFileResponse($file);
$response->setContentDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT);
return $response;
}
public function getPermission($access, $directory) {
if($access=="user") {
$em = $this->getDoctrine()->getManager();
$type=explode("-",$directory)[0];
$id=explode("-",$directory)[1];
switch($type) {
case "widget":
// Récupération du widget
$widget=$em->getRepository("CadolesPortalBundle:Pagewidget")->find($id);
if (!$widget) throw $this->createNotFoundException('Unable to find entity.');
// On s'assure que l'utilisateur à la permission de voir
$page=$widget->getPage();
$em->getRepository("CadolesPortalBundle:Page")->getPermission($this->getUser(),$page,$cansee,$canupdate);
if(!$cansee) throw $this->createNotFoundException('Permission denied');
break;
case "projecttask":
// Récupération de la tache
$projecttask=$em->getRepository("CadolesPortalBundle:Projecttask")->find($id);
if (!$projecttask) throw $this->createNotFoundException('Unable to find entity.');
// On s'assure que l'utilisateur à la permission de voir
$project=$projecttask->getProject();
$user=$this->getUser();
$em->getRepository("CadolesPortalBundle:Project")->getPermission($user,$project,$cansee,$canupdate,$canadd);
if(!$cansee) throw $this->createNotFoundException('Permission denied');
break;
case "calendarevent":
// Récupération de l'event'
$calendarevent=$em->getRepository("CadolesPortalBundle:Calendarevent")->find($id);
if (!$calendarevent) throw $this->createNotFoundException('Unable to find entity.');
// On s'assure que l'utilisateur à la permission de voir
$calendar=$calendarevent->getCalendar();
$user=$this->getUser();
$em->getRepository("CadolesPortalBundle:Calendar")->getPermission($user,$calendar,$cansee,$canupdate);
if(!$cansee) throw $this->createNotFoundException('Permission denied');
break;
}
}
else $canupdate=true;
return $canupdate;
}
}