Commit 98609835 authored by Guillaume Perréal's avatar Guillaume Perréal
Browse files

CS.

Showing with 164 additions and 208 deletions
+164 -208
<?php
/*
* Copyright (C) 2015 IRSTEA
* Copyright (C) 2015-2017 IRSTEA
* All rights reserved.
*/
......@@ -11,13 +10,10 @@ use Irstea\FileUploadBundle\Model\FileManagerInterface;
use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
use Symfony\Component\Console\Helper\ProgressBar;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
/**
* Description of GarbageCollectorCommand
*
* @author Guillaume Perréal <guillaume.perreal@irstea.fr>
* Description of GarbageCollectorCommand.
*/
class CheckCommand extends ContainerAwareCommand
{
......@@ -39,6 +35,7 @@ class CheckCommand extends ContainerAwareCommand
if (count($files) == 0) {
$output->writeln('Aucun fichier à vérifier.');
return;
}
......
<?php
/*
* Copyright (C) 2015 IRSTEA
* Copyright (C) 2015-2017 IRSTEA
* All rights reserved.
*/
......@@ -15,9 +14,7 @@ use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
/**
* Description of GarbageCollectorCommand
*
* @author Guillaume Perréal <guillaume.perreal@irstea.fr>
* Description of GarbageCollectorCommand.
*/
class CollectGarbageCommand extends ContainerAwareCommand
{
......@@ -25,7 +22,7 @@ class CollectGarbageCommand extends ContainerAwareCommand
{
$this
->setName('irstea:file-upload:collect-garbage')
->setDescription("Nettoie les fichiers orphelins et partiels.")
->setDescription('Nettoie les fichiers orphelins et partiels.')
->addOption('dry-run', null, InputOption::VALUE_NONE, 'Affiche ce qui devrait être fait, sans le faire');
}
......@@ -38,15 +35,17 @@ class CollectGarbageCommand extends ContainerAwareCommand
if (count($files) == 0) {
$output->writeln('Aucun fichier à supprimer.');
return;
}
if ($input->getOption('dry-run')) {
$output->writeln(sprintf('%d fichier(s) à supprimer.', count($files)));
return;
}
$output->writeln("Suppression des fichiers");
$output->writeln('Suppression des fichiers');
$progress = new ProgressBar($output, count($files));
$progress->start();
......
<?php
/*
* Copyright (C) 2015 IRSTEA
* Copyright (C) 2015-2017 IRSTEA
* All rights reserved.
*/
......@@ -16,9 +15,7 @@ use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
/**
* Description of GarbageCollectorCommand
*
* @author Guillaume Perréal <guillaume.perreal@irstea.fr>
* Description of GarbageCollectorCommand.
*/
class CreateCommand extends ContainerAwareCommand
{
......@@ -26,10 +23,10 @@ class CreateCommand extends ContainerAwareCommand
{
$this
->setName('irstea:file-upload:create')
->setDescription("Créer un fichier.")
->addOption('mime-type', 't', InputOption::VALUE_REQUIRED, "Force le type MIME.")
->addOption('display-name', 'd', InputOption::VALUE_REQUIRED, "Indique un nom de fichier.")
->addOption('metadata', 'm', InputOption::VALUE_REQUIRED, "Ajoute des métadata (format JSON).")
->setDescription('Créer un fichier.')
->addOption('mime-type', 't', InputOption::VALUE_REQUIRED, 'Force le type MIME.')
->addOption('display-name', 'd', InputOption::VALUE_REQUIRED, 'Indique un nom de fichier.')
->addOption('metadata', 'm', InputOption::VALUE_REQUIRED, 'Ajoute des métadata (format JSON).')
->addArgument('path', InputArgument::REQUIRED, "Nom du fichier à ajouter, - pour lire l'entrée standard");
}
......@@ -42,14 +39,13 @@ class CreateCommand extends ContainerAwareCommand
$em->transactional(
function () use ($input, $output, $em, &$file, &$written) {
/* @var $manager FileManagerInterface */
$manager = $this->getContainer()->get('irstea_file_upload.file_manager');
$path = $input->getArgument("path");
if ("-" === $path) {
$path = $input->getArgument('path');
if ('-' === $path) {
$realPath = 'php://stdin';
$displayName = "stdin";
$displayName = 'stdin';
$lastModified = time();
$size = 0;
} else {
......@@ -88,7 +84,7 @@ class CreateCommand extends ContainerAwareCommand
);
if ($output->isVerbose()) {
$output->writeln(sprintf("%s crée, %d octets lus.", $file->getId(), $written));
$output->writeln(sprintf('%s crée, %d octets lus.', $file->getId(), $written));
} else {
$output->writeln($file->getId());
}
......
<?php
/*
* Copyright (C) 2015 IRSTEA
* Copyright (C) 2015-2017 IRSTEA
* All rights reserved.
*/
namespace Irstea\FileUploadBundle\Command;
use Doctrine\ORM\EntityManager;
use Irstea\FileUploadBundle\Model\FileManagerInterface;
use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
use Symfony\Component\Console\Input\InputArgument;
......@@ -16,9 +14,7 @@ use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
/**
* Description of GarbageCollectorCommand
*
* @author Guillaume Perréal <guillaume.perreal@irstea.fr>
* Description of GarbageCollectorCommand.
*/
class ReadCommand extends ContainerAwareCommand
{
......@@ -29,8 +25,8 @@ class ReadCommand extends ContainerAwareCommand
->setDescription("Récupère le contenu d'un fichier.")
->addOption('append', 'a', InputOption::VALUE_NONE, "Ajoute au fichier de destination au lieu de l'écraser.")
->addOption('overwrite', 'y', InputOption::VALUE_NONE, "Ecrase le fichier de destination s'il existe.")
->addArgument('id', InputArgument::REQUIRED, "Identifiant du fichier à récupérer.")
->addArgument('filepath', InputArgument::OPTIONAL, "Chemin du fichier dans lequel écrire.");
->addArgument('id', InputArgument::REQUIRED, 'Identifiant du fichier à récupérer.')
->addArgument('filepath', InputArgument::OPTIONAL, 'Chemin du fichier dans lequel écrire.');
}
protected function execute(InputInterface $input, OutputInterface $output)
......@@ -58,7 +54,7 @@ class ReadCommand extends ContainerAwareCommand
fclose($fh);
if ($output->isVerbose() && null !== $path) {
$output->writeln(sprintf("%d octets écrits.", $written));
$output->writeln(sprintf('%d octets écrits.', $written));
}
}
}
<?php
/*
* Copyright (C) 2015 IRSTEA
* Copyright (C) 2015-2017 IRSTEA
* All rights reserved.
*/
......@@ -32,16 +31,14 @@ use Symfony\Component\Templating\EngineInterface;
*/
class UploadController extends Controller
{
const CSRF_INTENTION = "uploaded_file";
const CSRF_INTENTION = 'uploaded_file';
/**
*
* @var FileManagerInterface
*/
protected $fileManager;
/**
*
* @var UrlGeneratorInterface
*/
protected $urlGenerator;
......@@ -61,9 +58,6 @@ class UploadController extends Controller
*/
protected $templating;
/**
*
*/
public function __construct(
FileManagerInterface $fileManager,
UrlGeneratorInterface $urlGenerator,
......@@ -81,6 +75,7 @@ class UploadController extends Controller
/**
* @Route("", name="file_upload_create")
* @Method("POST")
*
* @param Request $request
*/
public function createAction(Request $request)
......@@ -125,7 +120,8 @@ class UploadController extends Controller
/**
* @Route("/{id}/content", name="file_upload_put_content")
* @Method("PUT")
* @param Request $request
*
* @param Request $request
* @param UploadedFile $file
*/
public function putContentAction(Request $request, UploadedFile $file)
......@@ -151,21 +147,19 @@ class UploadController extends Controller
}
/**
*
* @param Request $request
*
* @return array
*/
protected function handleRangeHeader(Request $request)
{
if (null === $range = $request->headers->get('Content-Range', null)) {
return [0, PHP_INT_MAX, true];
}
$matches = [];
if (!preg_match('@^bytes (\d+)-(\d+)/(\d+)$@', $range, $matches)) {
throw new BadRequestHttpException("Invalid Content-Range");
throw new BadRequestHttpException('Invalid Content-Range');
}
$start = intval($matches[1]);
......@@ -180,7 +174,6 @@ class UploadController extends Controller
}
/**
*
* @param UploadedFileInterface $file
*
* @return Response
......@@ -213,7 +206,8 @@ class UploadController extends Controller
/**
* @Route("/{id}/content", name="file_upload_get_content")
* @Method("GET")
* @param Request $request
*
* @param Request $request
* @param UploadedFile $file
*/
public function getContentAction(Request $request, UploadedFile $file)
......@@ -226,13 +220,15 @@ class UploadController extends Controller
$response = UploadedFileResponse::create($file, 200, [], false, ResponseHeaderBag::DISPOSITION_ATTACHMENT);
$response->isNotModified($request);
return $response;
}
/**
* @Route("/{id}", name="file_upload_delete")
* @Method("DELETE")
* @param Request $request
*
* @param Request $request
* @param UploadedFile $file
*/
public function deleteAction(Request $request, UploadedFile $file)
......@@ -249,7 +245,6 @@ class UploadController extends Controller
}
/**
*
* @param Request $request
*
* @throws HttpException
......@@ -262,11 +257,10 @@ class UploadController extends Controller
}
/**
*
* @param int $status
* @param int $status
* @param string $message
* @param array $data
* @param array $headers
* @param array $data
* @param array $headers
*
* @return JsonResponse
*/
......@@ -276,11 +270,11 @@ class UploadController extends Controller
$data['message'] = $message;
$response = new JsonResponse($data, $status, $headers);
$response->setStatusCode($status, $message);
return $response;
}
/**
*
* @param \Exception $ex
*
* @return JsonResponse
......@@ -289,7 +283,7 @@ class UploadController extends Controller
{
return $this->createResponse(
$ex instanceof HttpException ? $ex->getStatusCode() : Response::HTTP_INTERNAL_SERVER_ERROR,
preg_replace("/[\n\r]+/", " ", $ex->getMessage()),
preg_replace("/[\n\r]+/", ' ', $ex->getMessage()),
[
'exception' => [
'class' => get_class($ex),
......
<?php
/*
* Copyright (C) 2015-2017 IRSTEA
* All rights reserved.
*/
namespace Irstea\FileUploadBundle\Controller;
......@@ -9,7 +13,6 @@ use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
......@@ -33,11 +36,11 @@ class UploadedFileController extends Controller
$em = $this->getDoctrine()->getManager();
$queryBuilder = $em->getRepository('IrsteaFileUploadBundle:UploadedFile')
->createQueryBuilder("u")
->orderBy("u.createdAt", "DESC");
->createQueryBuilder('u')
->orderBy('u.createdAt', 'DESC');
$pager = new Pagerfanta(new DoctrineORMAdapter($queryBuilder));
$pager->setCurrentPage($request->query->get("page", 1));
$pager->setCurrentPage($request->query->get('page', 1));
$uploadedFiles = $pager->getCurrentPageResults();
......@@ -56,7 +59,6 @@ class UploadedFileController extends Controller
*/
public function showAction(UploadedFile $uploadedFile)
{
return [
'uploadedFile' => $uploadedFile,
];
......@@ -64,7 +66,7 @@ class UploadedFileController extends Controller
/**
* @param string $message
* @param array $parameters
* @param array $parameters
*/
public function notice($message, array $parameters = [])
{
......
<?php
/*
* Copyright (C) 2015-2017 IRSTEA
* All rights reserved.
*/
namespace Irstea\FileUploadBundle\DependencyInjection;
......@@ -6,7 +10,7 @@ use Symfony\Component\Config\Definition\Builder\TreeBuilder;
use Symfony\Component\Config\Definition\ConfigurationInterface;
/**
* This is the class that validates and merges configuration from your app/config files
* This is the class that validates and merges configuration from your app/config files.
*
* To learn more see {@link http://symfony.com/doc/current/cookbook/bundles/extension.html#cookbook-bundles-extension-config-class}
*/
......@@ -28,12 +32,13 @@ class Configuration implements ConfigurationInterface
->then(
function ($v) {
$int = intval($v);
if (strpos($v, "K")) {
if (strpos($v, 'K')) {
return 1000 * $int;
}
if (strpos($v, "M")) {
if (strpos($v, 'M')) {
return 1000000 * $int;
}
return $int;
}
)
......
<?php
/*
* Copyright (C) 2015-2017 IRSTEA
* All rights reserved.
*/
namespace Irstea\FileUploadBundle\DependencyInjection;
......@@ -47,7 +51,7 @@ class IrsteaFileUploadExtension extends Extension implements PrependExtensionInt
"$pluginDir/js/jquery.fileupload-process.js",
"$pluginDir/js/jquery.fileupload-validate.js",
"$pluginDir/js/jquery.fileupload-ui.js",
"@BazingaJsTranslationBundle/Resources/js/translator.js",
'@BazingaJsTranslationBundle/Resources/js/translator.js',
'js/translations/file_upload/*.js',
'js/translations/validators/*.js',
'@IrsteaFileUploadBundle/Resources/js/widget/file_upload.js',
......
<?php
/*
* Copyright (C) 2015 IRSTEA
* Copyright (C) 2015-2017 IRSTEA
* All rights reserved.
*/
......@@ -24,9 +23,7 @@ use Symfony\Component\EventDispatcher\EventDispatcher;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
/**
* Description of UploadedFileRepository
*
* @author Guillaume Perréal <guillaume.perreal@irstea.fr>
* Description of UploadedFileRepository.
*/
class UploadedFileRepository extends EntityRepository implements FileManagerInterface
{
......@@ -43,7 +40,6 @@ class UploadedFileRepository extends EntityRepository implements FileManagerInte
protected $eventDispatcher;
/**
*
* @param Filesystem $filesystem
*/
public function setFilesystem(Filesystem $filesystem)
......@@ -52,7 +48,6 @@ class UploadedFileRepository extends EntityRepository implements FileManagerInte
}
/**
*
* @param EventDispatcherInterface $eventDispatcher
*/
public function setEventDispatcher(EventDispatcherInterface $eventDispatcher)
......@@ -89,16 +84,16 @@ class UploadedFileRepository extends EntityRepository implements FileManagerInte
public function duplicate(UploadedFileInterface $original)
{
if (!$original->isValid()) {
throw new InvalidArgumentException("Impossible de dupliquer le fichier " . $original->getId() . " car il est invalide !");
throw new InvalidArgumentException('Impossible de dupliquer le fichier ' . $original->getId() . ' car il est invalide !');
}
$new = new UploadedFile();
$metadata = $original->getMetadata();
if (!isset($metadata["duplicateOf"])) {
$metadata["duplicateOf"] = [$original->getId()];
if (!isset($metadata['duplicateOf'])) {
$metadata['duplicateOf'] = [$original->getId()];
} else {
array_unshift($metadata["duplicateOf"], $original->getId());
array_unshift($metadata['duplicateOf'], $original->getId());
}
$new
......@@ -111,7 +106,7 @@ class UploadedFileRepository extends EntityRepository implements FileManagerInte
->setSize($original->getSize());
$stream = $this->filesystem->createStream($new->getPath());
$stream->open(new StreamMode("cb"));
$stream->open(new StreamMode('cb'));
$original->copyTo($stream->cast(STREAM_CAST_AS_STREAM));
$stream->close();
......@@ -134,8 +129,9 @@ class UploadedFileRepository extends EntityRepository implements FileManagerInte
return null;
}
if (!is_string($uuid) || !Uuid::isValid($uuid)) {
throw new InvalidArgumentException(sprintf("Identifiant invalide: %s", (string)$uuid));
throw new InvalidArgumentException(sprintf('Identifiant invalide: %s', (string) $uuid));
}
return $this->findOneById($uuid);
}
......@@ -168,10 +164,9 @@ class UploadedFileRepository extends EntityRepository implements FileManagerInte
}
/**
*
* @param string $level
* @param string $message
* @param array $context
* @param array $context
*/
protected function log($level, $message, array $context = [])
{
......@@ -191,6 +186,7 @@ class UploadedFileRepository extends EntityRepository implements FileManagerInte
$files,
function (UploadedFileInterface $file) use ($limit) {
$mtime = $file->getLastModified();
return $mtime === null || $mtime < $limit;
}
);
......
<?php
/*
* Copyright (C) 2015 IRSTEA
* Copyright (C) 2015-2017 IRSTEA
* All rights reserved.
*/
......@@ -28,25 +27,28 @@ use Rhumsaa\Uuid\Uuid;
class UploadedFile implements UploadedFileInterface
{
// Taille de bloc utilisé pour les copies
static public $copyBlockSize = 8192;
public static $copyBlockSize = 8192;
const ORPHAN_PREFIX = "orphan/";
const ORPHAN_PREFIX = 'orphan/';
/**
* @ORM\Id
* @ORM\Column(type="guid")
*
* @var string
*/
private $id;
/**
* @ORM\Column(type="string", length=1024)
*
* @var string
*/
private $displayName;
/**
* @ORM\Column(type="string", length=1024)
*
* @var string
*/
private $path;
......@@ -57,56 +59,64 @@ class UploadedFile implements UploadedFileInterface
private $actualPath;
/**
*
* @ORM\Column(type="string", length=255, nullable=true)
*
* @var string
*/
private $mimeType = null;
/**
* @ORM\Column(type="integer", nullable=true)
*
* @var int
*/
private $size = null;
/**
* @ORM\Column(type="string", length=64, nullable=true)
*
* @var string
*/
private $checksum = null;
/**
* @ORM\Column(type="string", length=10)
*
* @var string
*/
private $etat = self::ETAT_EN_COURS;
/**
* @ORM\Column(type="datetime")
*
* @var DateTime
*/
private $createdAt;
/**
* @ORM\Column(type="string", nullable=true)
*
* @var string
*/
private $createdBy;
/**
* @ORM\Column(type="string", nullable=true)
*
* @var string
*/
private $createdFrom;
/**
* @ORM\Column(type="json_array", nullable=true)
*
* @var array
*/
private $metadata = null;
/**
* @ORM\Column(type="string", length=256, nullable=true)
*
* @var string
*/
private $description = null;
......@@ -117,13 +127,11 @@ class UploadedFile implements UploadedFileInterface
private $filesystem;
/** Contient le nom de chemin local.
*
* @var string
*/
private $localTempPath = null;
/** Crée un UploadedFile.
*
* @internal
*/
public function __construct()
......@@ -174,6 +182,7 @@ class UploadedFile implements UploadedFileInterface
if (!isset($this->actualPath)) {
$this->actualPath = $this->path;
}
return $this->actualPath;
}
......@@ -268,7 +277,7 @@ class UploadedFile implements UploadedFileInterface
self::ETAT_REJETE,
]
)) {
throw new InvalidArgumentException(sprintf("Etat invalide: '%s'", (string)$etat));
throw new InvalidArgumentException(sprintf("Etat invalide: '%s'", (string) $etat));
}
// Déplace le fichier hors de l'orphelinat quand on passe d'orphelin à nouveau
......@@ -320,17 +329,18 @@ class UploadedFile implements UploadedFileInterface
*/
public function __toString()
{
$unit = "";
$unit = '';
$size = $this->size ?: 0;
if ($size >= 10240) {
$size /= 1024;
$unit = "k";
$unit = 'k';
if ($size >= 10240) {
$size /= 1024;
$unit = "m";
$unit = 'm';
}
}
return sprintf("%s (%s, %d%so)", $this->displayName, $this->mimeType ?: '?/?', $size, $unit);
return sprintf('%s (%s, %d%so)', $this->displayName, $this->mimeType ?: '?/?', $size, $unit);
}
/**
......@@ -343,6 +353,7 @@ class UploadedFile implements UploadedFileInterface
public function setFilesystem(Filesystem $filesystem)
{
$this->filesystem = $filesystem;
return $this;
}
......@@ -360,11 +371,13 @@ class UploadedFile implements UploadedFileInterface
if (!$filesystem->has($path)) {
$this->setEtat(self::ETAT_MANQUANT);
return;
}
if ($filesystem->size($path) !== $this->size || $filesystem->checksum($path) !== $this->checksum) {
$this->setEtat(self::ETAT_CORROMPU);
return;
}
}
......@@ -480,11 +493,10 @@ class UploadedFile implements UploadedFileInterface
}
/** Wrapper de stream_copy_to_stream
*
* @param resource $source
* @param resource $dest
* @param int $maxlen
* @param int $offset
* @param int $maxlen
* @param int $offset
*
* @return int
*
......@@ -496,10 +508,9 @@ class UploadedFile implements UploadedFileInterface
}
/** Wrapper de feof
*
* @param resource $filehandle
*
* @return boolean
* @return bool
*
* @internal
*/
......@@ -509,11 +520,10 @@ class UploadedFile implements UploadedFileInterface
}
/** Wrapper de fread
*
* @param resource $filehandle
* @param int $maxlen
* @param int $maxlen
*
* @return int|boolean
* @return int|bool
*
* @internal
*/
......@@ -523,11 +533,10 @@ class UploadedFile implements UploadedFileInterface
}
/** Wrapper de fwrite
*
* @param resource $filehandle
* @param int $maxlen
* @param int $maxlen
*
* @return int|boolean
* @return int|bool
*
* @internal
*/
......@@ -537,10 +546,9 @@ class UploadedFile implements UploadedFileInterface
}
/** Vérifie si un chemin est "safe".
*
* @param string $path
*
* @return boolean
* @return bool
*
* @internal
*/
......@@ -565,6 +573,7 @@ class UploadedFile implements UploadedFileInterface
$level++;
}
}
return true;
}
......@@ -582,6 +591,7 @@ class UploadedFile implements UploadedFileInterface
public function setDescription($description = null)
{
$this->description = $description;
return $this;
}
......@@ -624,6 +634,7 @@ class UploadedFile implements UploadedFileInterface
public function setCreatedAt(DateTime $createdAt)
{
$this->createdAt = $createdAt;
return $this;
}
......@@ -633,6 +644,7 @@ class UploadedFile implements UploadedFileInterface
public function setCreatedBy($createdBy)
{
$this->createdBy = $createdBy;
return $this;
}
......@@ -642,6 +654,7 @@ class UploadedFile implements UploadedFileInterface
public function setCreatedFrom($createdFrom)
{
$this->createdFrom = $createdFrom;
return $this;
}
......@@ -662,6 +675,7 @@ class UploadedFile implements UploadedFileInterface
if (stream_is_local($handle)) {
$this->localTempPath = stream_get_meta_data($handle)['uri'];
fclose($handle);
return $this->localTempPath;
}
fclose($handle);
......
<?php
/*
* Copyright (C) 2015 IRSTEA
* Copyright (C) 2015-2017 IRSTEA
* All rights reserved.
*/
......@@ -11,20 +10,16 @@ use Irstea\FileUploadBundle\Model\UploadedFileInterface;
use Symfony\Component\EventDispatcher\Event;
/**
* Description of FileUploadCompleteEvent
*
* @author Guillaume Perréal <guillaume.perreal@irstea.fr>
* Description of FileUploadCompleteEvent.
*/
class FileUploadCompleteEvent extends Event
{
/**
*
* @var UploadedFileInterface
*/
private $uploadedFile;
/**
*
* @param UploadedFileInterface $uploadedFile
*/
public function __construct(UploadedFileInterface $uploadedFile)
......@@ -33,7 +28,6 @@ class FileUploadCompleteEvent extends Event
}
/**
*
* @return UploadedFileInterface $uploadedFile
*/
public function getUploadedFile()
......
<?php
/*
* Copyright (C) 2015 IRSTEA
* Copyright (C) 2015-2017 IRSTEA
* All rights reserved.
*/
namespace Irstea\FileUploadBundle\Exception;
/**
*
* @author Guillaume Perréal <guillaume.perreal@irstea.fr>
*/
interface Exception
{
//put your code here
......
<?php
/*
* Copyright (C) 2015 IRSTEA
* Copyright (C) 2015-2017 IRSTEA
* All rights reserved.
*/
......@@ -11,24 +10,20 @@ use Irstea\FileUploadBundle\Model\UploadedFileInterface;
use RuntimeException;
/**
* Description of RejectedFileException
*
* @author Guillaume Perréal <guillaume.perreal@irstea.fr>
* Description of RejectedFileException.
*/
class RejectedFileException extends RuntimeException implements Exception
{
/**
*
* @var UploadedFileInterface
*/
protected $uploadedFile;
/**
*
* @param UploadedFileInterface $file
* @param string $message
* @param int $code
* @param \Exception $previous
* @param string $message
* @param int $code
* @param \Exception $previous
*/
public function __construct(UploadedFileInterface $uploadedFile, $message, $code = 0, $previous = null)
{
......
<?php
/*
* Copyright (C) 2015 IRSTEA
* Copyright (C) 2015-2017 IRSTEA
* All rights reserved.
*/
namespace Irstea\FileUploadBundle;
/**
* Description of FileUploadEvents
*
* @author Guillaume Perréal <guillaume.perreal@irstea.fr>
* Description of FileUploadEvents.
*/
final class FileUploadEvents
{
......
<?php
/*
* Copyright (C) 2015 IRSTEA
* Copyright (C) 2015-2017 IRSTEA
* All rights reserved.
*/
......@@ -14,18 +13,16 @@ use Symfony\Component\Form\Exception\TransformationFailedException;
use Traversable;
/**
* Description of UploadedFileTransformer
* Description of UploadedFileTransformer.
*/
class UploadedFileTransformer implements DataTransformerInterface
{
/**
*
* @var boolean
* @var bool
*/
private $multiple;
/**
*
* @var FileManagerInterface
*/
private $fileManager;
......@@ -59,6 +56,7 @@ class UploadedFileTransformer implements DataTransformerInterface
$result[] = $file;
}
}
return $result;
}
......@@ -90,7 +88,6 @@ class UploadedFileTransformer implements DataTransformerInterface
}
/**
*
* @param mixed $value
*
* @return mixed
......@@ -109,7 +106,6 @@ class UploadedFileTransformer implements DataTransformerInterface
}
/**
*
* @param mixed $value
*
* @return UploadedFileInterface
......
<?php
/*
* Copyright (C) 2015 IRSTEA
* Copyright (C) 2015-2017 IRSTEA
* All rights reserved.
*
* @copyright 2015 Irstea
* @author Guillaume Perréal <guillaume.perreal@irstea.fr>
*/
namespace Irstea\FileUploadBundle\Form\Type;
......@@ -27,8 +23,7 @@ use Symfony\Component\Validator\Constraints\Count;
use Symfony\Component\Validator\Constraints\NotBlank;
/** Type de champ 'file_upload'.
*
* Options :
* Options :.
*
* * multiple (boolean) : fichier unique ou multiple ? false par défaut.
* * accept_file_types (string) : expression régulière de contrôle des types MIME acceptés. Aucune par défaut.
......@@ -40,35 +35,30 @@ use Symfony\Component\Validator\Constraints\NotBlank;
* * recalculate_progress (boolean) : recalculer la progression en cas d'erreur ? true par défaut.
* * sequential_uploads (boolean) : force un upload séquentiel des fichiers ? false par défaut.
* * max_chunk_size (integer) : taille maximule des parties envoyées, en octets. 0 (envoyer le fichier en une seule requête) par défaut.
*
*/
class FileUploadType extends AbstractType
{
use \Irstea\ThemeBundle\Form\AbstractJQueryWidgetTrait;
/** Routeur.
*
* @var Router
*/
private $router;
/** Gestionnaire de fichiers.
*
* @var FileManagerInterface
*/
private $fileManager;
/** Taille par défaut pour l'envoi par morceaux.
*
* @var int
*/
private $defaultMaxChunkSize;
/**
*
* @param Router $router
* @param Router $router
* @param FileManagerInterface $fileManager
* @param int $defaultMaxChunkSize
* @param int $defaultMaxChunkSize
*/
public function __construct(Router $router, FileManagerInterface $fileManager, $defaultMaxChunkSize)
{
......@@ -136,8 +126,9 @@ class FileUploadType extends AbstractType
}
/** Ajoute des contraintes de validation correspondants aux paramètres du champ.
*
* @todo Implémenter min_file_size, max_file_size && accept_file_types.
*
* @param mixed $constraints
*/
protected function addConstraints(OptionsResolver $options, $constraints)
{
......@@ -180,7 +171,7 @@ class FileUploadType extends AbstractType
*/
public function getBlockPrefix()
{
return "file_upload";
return 'file_upload';
}
/**
......@@ -206,6 +197,6 @@ class FileUploadType extends AbstractType
*/
protected function getWidgetType()
{
return "irsteaFileUpload";
return 'irsteaFileUpload';
}
}
<?php
/*
* Copyright (C) 2015 IRSTEA
* Copyright (C) 2015-2017 IRSTEA
* All rights reserved.
*/
namespace Irstea\FileUploadBundle\Http;
use DateTime;
use Irstea\FileUploadBundle\Model\UploadedFileInterface;
use LogicException;
use SplFileInfo;
use Symfony\Component\HttpFoundation\File\Exception\FileException;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
/**
* Description of UploadedFileResponse
* Description of UploadedFileResponse.
*
* Très, très, fortement inspiré de Symfony\Component\HttpFoundation\UploadedFileResponse.
*
* @author Guillaume Perréal <guillaume.perreal@irstea.fr>
*/
class UploadedFileResponse extends Response
{
/**
*
* @var UploadedFileInterface
*/
protected $file;
......@@ -36,7 +30,6 @@ class UploadedFileResponse extends Response
protected $offset = 0;
/**
*
* @var int
*/
protected $maxlen;
......@@ -44,11 +37,11 @@ class UploadedFileResponse extends Response
/**
* Constructor.
*
* @param UploadedFileInterface $file The file to stream
* @param int $status The response status code
* @param array $headers An array of response headers
* @param bool $public Files are public by default
* @param null|string $contentDisposition The type of Content-Disposition to set automatically with the filename
* @param UploadedFileInterface $file The file to stream
* @param int $status The response status code
* @param array $headers An array of response headers
* @param bool $public Files are public by default
* @param null|string $contentDisposition The type of Content-Disposition to set automatically with the filename
*/
public function __construct(
UploadedFileInterface $file = null,
......@@ -69,11 +62,11 @@ class UploadedFileResponse extends Response
}
/**
* @param UploadedFileInterface $file The file to stream
* @param int $status The response status code
* @param array $headers An array of response headers
* @param bool $public Files are public by default
* @param null|string $contentDisposition The type of Content-Disposition to set automatically with the filename
* @param UploadedFileInterface $file The file to stream
* @param int $status The response status code
* @param array $headers An array of response headers
* @param bool $public Files are public by default
* @param null|string $contentDisposition The type of Content-Disposition to set automatically with the filename
*
* @return UploadedFileResponse The created response
*/
......@@ -85,12 +78,12 @@ class UploadedFileResponse extends Response
/**
* Sets the file to stream.
*
* @param UploadedFileInterface $file The file to stream
* @param string $contentDisposition
*
* @return UploadedFileResponse
* @param UploadedFileInterface $file The file to stream
* @param string $contentDisposition
*
* @throws FileException
*
* @return UploadedFileResponse
*/
public function setFile(UploadedFileInterface $file, $contentDisposition = null)
{
......@@ -120,8 +113,8 @@ class UploadedFileResponse extends Response
/**
* Sets the Content-Disposition header with the given filename.
*
* @param string $disposition ResponseHeaderBag::DISPOSITION_INLINE or ResponseHeaderBag::DISPOSITION_ATTACHMENT
* @param string $filename Optionally use this filename instead of the real name of the file
* @param string $disposition ResponseHeaderBag::DISPOSITION_INLINE or ResponseHeaderBag::DISPOSITION_ATTACHMENT
* @param string $filename Optionally use this filename instead of the real name of the file
* @param string $filenameFallback A fallback filename, containing only ASCII characters. Defaults to an automatically encoded filename
*
* @return UploadedFileResponse
......@@ -174,13 +167,13 @@ class UploadedFileResponse extends Response
list($start, $end) = explode('-', substr($range, 6), 2) + [0];
$end = ('' === $end) ? $fileSize - 1 : (int)$end;
$end = ('' === $end) ? $fileSize - 1 : (int) $end;
if ('' === $start) {
$start = $fileSize - $end;
$end = $fileSize - 1;
} else {
$start = (int)$start;
$start = (int) $start;
}
if ($start <= $end) {
......
<?php
/*
* Copyright (C) 2015-2017 IRSTEA
* All rights reserved.
*/
namespace Irstea\FileUploadBundle;
......
<?php
/*
* Copyright (C) 2015 IRSTEA
* Copyright (C) 2015-2017 IRSTEA
* All rights reserved.
*/
......@@ -9,16 +8,12 @@ namespace Irstea\FileUploadBundle\Listener;
use DateTime;
use Doctrine\ORM\Event\LifecycleEventArgs;
use Gaufrette\Exception\FileNotFound;
use Gaufrette\Filesystem;
use Irstea\FileUploadBundle\Model\UploadedFileInterface;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
/**
* Ajoute les informations sur la date, l'utilisateur connecté et l'adresse IP du client dans le fichier.
*
* @author Guillaume Perréal <guillaume.perreal@irstea.fr>
*/
class CreationDataListener
{
......@@ -43,7 +38,7 @@ class CreationDataListener
*/
public function prePersist(UploadedFileInterface $file, LifecycleEventArgs $event)
{
$file->setCreatedAt(new DateTime("now"));
$file->setCreatedAt(new DateTime('now'));
if ($request = $this->requestStack->getCurrentRequest()) {
$file->setCreatedFrom($request->getClientIp());
......
<?php
/*
* Copyright (C) 2015 IRSTEA
* Copyright (C) 2015-2017 IRSTEA
* All rights reserved.
*/
......@@ -18,7 +17,6 @@ use Irstea\FileUploadBundle\Model\UploadedFileInterface;
class UploadedFileListener
{
/**
*
* @var Filesystem
*/
private $filesystem;
......@@ -29,7 +27,6 @@ class UploadedFileListener
private $scheduledDeletion = [];
/**
*
* @param Filesystem $filesystem
*/
public function __construct(Filesystem $filesystem)
......@@ -38,9 +35,8 @@ class UploadedFileListener
}
/** Passe le filesystem à l'entité.
*
* @param UploadedFileInterface $file
* @param LifecycleEventArgs $event
* @param LifecycleEventArgs $event
*/
public function postLoad(UploadedFileInterface $file, LifecycleEventArgs $event)
{
......@@ -48,9 +44,8 @@ class UploadedFileListener
}
/** Renomme le fichier disque lorsque l'on change l'attribut 'path'.
*
* @param UploadedFileInterface $file
* @param LifecycleEventArgs $event
* @param LifecycleEventArgs $event
*/
public function postUpdate(UploadedFileInterface $file, LifecycleEventArgs $event)
{
......@@ -64,9 +59,8 @@ class UploadedFileListener
}
/** Enregistre le chemin du fichier à supprimer.
*
* @param UploadedFileInterface $file
* @param LifecycleEventArgs $event
* @param LifecycleEventArgs $event
*/
public function preRemove(UploadedFileInterface $file, LifecycleEventArgs $event)
{
......@@ -74,9 +68,8 @@ class UploadedFileListener
}
/** Supprime le fichier correspondant à l'UploadedFileInterface supprimé.
*
* @param UploadedFileInterface $file
* @param LifecycleEventArgs $event
* @param LifecycleEventArgs $event
*/
public function postRemove(UploadedFileInterface $file, LifecycleEventArgs $event)
{
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment