[HttpFoundation] split FileException into specialized ones about upload handling
This commit is contained in:
parent
ca53d3e0fd
commit
9e586cc7b1
@ -12,6 +12,9 @@ CHANGELOG
|
||||
`*` and `*/*` default values (if they are present in the Accept HTTP header)
|
||||
when looking for items.
|
||||
* deprecated `Request::getSession()` when no session has been set. Use `Request::hasSession()` instead.
|
||||
* added `CannotWriteFileException`, `ExtensionFileException`, `FormSizeFileException`,
|
||||
`IniSizeFileException`, `NoFileException`, `NoTmpDirFileException`, `PartialFileException` to
|
||||
handle failed `UploadedFile`.
|
||||
|
||||
4.0.0
|
||||
-----
|
||||
|
@ -0,0 +1,21 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\HttpFoundation\File\Exception;
|
||||
|
||||
/**
|
||||
* Thrown when an UPLOAD_ERR_CANT_WRITE error occurred with UploadedFile.
|
||||
*
|
||||
* @author Florent Mata <florentmata@gmail.com>
|
||||
*/
|
||||
class CannotWriteFileException extends FileException
|
||||
{
|
||||
}
|
@ -0,0 +1,21 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\HttpFoundation\File\Exception;
|
||||
|
||||
/**
|
||||
* Thrown when an UPLOAD_ERR_EXTENSION error occurred with UploadedFile.
|
||||
*
|
||||
* @author Florent Mata <florentmata@gmail.com>
|
||||
*/
|
||||
class ExtensionFileException extends FileException
|
||||
{
|
||||
}
|
@ -0,0 +1,21 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\HttpFoundation\File\Exception;
|
||||
|
||||
/**
|
||||
* Thrown when an UPLOAD_ERR_FORM_SIZE error occurred with UploadedFile.
|
||||
*
|
||||
* @author Florent Mata <florentmata@gmail.com>
|
||||
*/
|
||||
class FormSizeFileException extends FileException
|
||||
{
|
||||
}
|
@ -0,0 +1,21 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\HttpFoundation\File\Exception;
|
||||
|
||||
/**
|
||||
* Thrown when an UPLOAD_ERR_INI_SIZE error occurred with UploadedFile.
|
||||
*
|
||||
* @author Florent Mata <florentmata@gmail.com>
|
||||
*/
|
||||
class IniSizeFileException extends FileException
|
||||
{
|
||||
}
|
@ -0,0 +1,21 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\HttpFoundation\File\Exception;
|
||||
|
||||
/**
|
||||
* Thrown when an UPLOAD_ERR_NO_FILE error occurred with UploadedFile.
|
||||
*
|
||||
* @author Florent Mata <florentmata@gmail.com>
|
||||
*/
|
||||
class NoFileException extends FileException
|
||||
{
|
||||
}
|
@ -0,0 +1,21 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\HttpFoundation\File\Exception;
|
||||
|
||||
/**
|
||||
* Thrown when an UPLOAD_ERR_NO_TMP_DIR error occurred with UploadedFile.
|
||||
*
|
||||
* @author Florent Mata <florentmata@gmail.com>
|
||||
*/
|
||||
class NoTmpDirFileException extends FileException
|
||||
{
|
||||
}
|
@ -0,0 +1,21 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\HttpFoundation\File\Exception;
|
||||
|
||||
/**
|
||||
* Thrown when an UPLOAD_ERR_PARTIAL error occurred with UploadedFile.
|
||||
*
|
||||
* @author Florent Mata <florentmata@gmail.com>
|
||||
*/
|
||||
class PartialFileException extends FileException
|
||||
{
|
||||
}
|
@ -11,8 +11,15 @@
|
||||
|
||||
namespace Symfony\Component\HttpFoundation\File;
|
||||
|
||||
use Symfony\Component\HttpFoundation\File\Exception\CannotWriteFileException;
|
||||
use Symfony\Component\HttpFoundation\File\Exception\ExtensionFileException;
|
||||
use Symfony\Component\HttpFoundation\File\Exception\FileException;
|
||||
use Symfony\Component\HttpFoundation\File\Exception\FileNotFoundException;
|
||||
use Symfony\Component\HttpFoundation\File\Exception\FormSizeFileException;
|
||||
use Symfony\Component\HttpFoundation\File\Exception\IniSizeFileException;
|
||||
use Symfony\Component\HttpFoundation\File\Exception\NoFileException;
|
||||
use Symfony\Component\HttpFoundation\File\Exception\NoTmpDirFileException;
|
||||
use Symfony\Component\HttpFoundation\File\Exception\PartialFileException;
|
||||
use Symfony\Component\HttpFoundation\File\MimeType\ExtensionGuesser;
|
||||
|
||||
/**
|
||||
@ -210,6 +217,23 @@ class UploadedFile extends File
|
||||
return $target;
|
||||
}
|
||||
|
||||
switch ($this->error) {
|
||||
case UPLOAD_ERR_INI_SIZE:
|
||||
throw new IniSizeFileException($this->getErrorMessage());
|
||||
case UPLOAD_ERR_FORM_SIZE:
|
||||
throw new FormSizeFileException($this->getErrorMessage());
|
||||
case UPLOAD_ERR_PARTIAL:
|
||||
throw new PartialFileException($this->getErrorMessage());
|
||||
case UPLOAD_ERR_NO_FILE:
|
||||
throw new NoFileException($this->getErrorMessage());
|
||||
case UPLOAD_ERR_CANT_WRITE:
|
||||
throw new CannotWriteFileException($this->getErrorMessage());
|
||||
case UPLOAD_ERR_NO_TMP_DIR:
|
||||
throw new NoTmpDirFileException($this->getErrorMessage());
|
||||
case UPLOAD_ERR_EXTENSION:
|
||||
throw new ExtensionFileException($this->getErrorMessage());
|
||||
}
|
||||
|
||||
throw new FileException($this->getErrorMessage());
|
||||
}
|
||||
|
||||
|
@ -12,6 +12,14 @@
|
||||
namespace Symfony\Component\HttpFoundation\Tests\File;
|
||||
|
||||
use PHPUnit\Framework\TestCase;
|
||||
use Symfony\Component\HttpFoundation\File\Exception\CannotWriteFileException;
|
||||
use Symfony\Component\HttpFoundation\File\Exception\ExtensionFileException;
|
||||
use Symfony\Component\HttpFoundation\File\Exception\FileException;
|
||||
use Symfony\Component\HttpFoundation\File\Exception\FormSizeFileException;
|
||||
use Symfony\Component\HttpFoundation\File\Exception\IniSizeFileException;
|
||||
use Symfony\Component\HttpFoundation\File\Exception\NoFileException;
|
||||
use Symfony\Component\HttpFoundation\File\Exception\NoTmpDirFileException;
|
||||
use Symfony\Component\HttpFoundation\File\Exception\PartialFileException;
|
||||
use Symfony\Component\HttpFoundation\File\UploadedFile;
|
||||
|
||||
class UploadedFileTest extends TestCase
|
||||
@ -137,6 +145,54 @@ class UploadedFileTest extends TestCase
|
||||
$movedFile = $file->move(__DIR__.'/Fixtures/directory');
|
||||
}
|
||||
|
||||
public function failedUploadedFile()
|
||||
{
|
||||
foreach (array(UPLOAD_ERR_INI_SIZE, UPLOAD_ERR_FORM_SIZE, UPLOAD_ERR_PARTIAL, UPLOAD_ERR_NO_FILE, UPLOAD_ERR_CANT_WRITE, UPLOAD_ERR_NO_TMP_DIR, UPLOAD_ERR_EXTENSION, -1) as $error) {
|
||||
yield array(new UploadedFile(
|
||||
__DIR__.'/Fixtures/test.gif',
|
||||
'original.gif',
|
||||
'image/gif',
|
||||
$error
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider failedUploadedFile
|
||||
*/
|
||||
public function testMoveFailed(UploadedFile $file)
|
||||
{
|
||||
switch ($file->getError()) {
|
||||
case UPLOAD_ERR_INI_SIZE:
|
||||
$exceptionClass = IniSizeFileException::class;
|
||||
break;
|
||||
case UPLOAD_ERR_FORM_SIZE:
|
||||
$exceptionClass = FormSizeFileException::class;
|
||||
break;
|
||||
case UPLOAD_ERR_PARTIAL:
|
||||
$exceptionClass = PartialFileException::class;
|
||||
break;
|
||||
case UPLOAD_ERR_NO_FILE:
|
||||
$exceptionClass = NoFileException::class;
|
||||
break;
|
||||
case UPLOAD_ERR_CANT_WRITE:
|
||||
$exceptionClass = CannotWriteFileException::class;
|
||||
break;
|
||||
case UPLOAD_ERR_NO_TMP_DIR:
|
||||
$exceptionClass = NoTmpDirFileException::class;
|
||||
break;
|
||||
case UPLOAD_ERR_EXTENSION:
|
||||
$exceptionClass = ExtensionFileException::class;
|
||||
break;
|
||||
default:
|
||||
$exceptionClass = FileException::class;
|
||||
}
|
||||
|
||||
$this->expectException($exceptionClass);
|
||||
|
||||
$file->move(__DIR__.'/Fixtures/directory');
|
||||
}
|
||||
|
||||
public function testMoveLocalFileIsAllowedInTestMode()
|
||||
{
|
||||
$path = __DIR__.'/Fixtures/test.copy.gif';
|
||||
|
Reference in New Issue
Block a user