annotate vendor/guzzlehttp/psr7/src/UploadedFile.php @ 19:fa3358dc1485 tip

Add ndrum files
author Chris Cannam
date Wed, 28 Aug 2019 13:14:47 +0100
parents 4c8ae668cc8c
children
rev   line source
Chris@0 1 <?php
Chris@0 2 namespace GuzzleHttp\Psr7;
Chris@0 3
Chris@0 4 use InvalidArgumentException;
Chris@0 5 use Psr\Http\Message\StreamInterface;
Chris@0 6 use Psr\Http\Message\UploadedFileInterface;
Chris@0 7 use RuntimeException;
Chris@0 8
Chris@0 9 class UploadedFile implements UploadedFileInterface
Chris@0 10 {
Chris@0 11 /**
Chris@0 12 * @var int[]
Chris@0 13 */
Chris@0 14 private static $errors = [
Chris@0 15 UPLOAD_ERR_OK,
Chris@0 16 UPLOAD_ERR_INI_SIZE,
Chris@0 17 UPLOAD_ERR_FORM_SIZE,
Chris@0 18 UPLOAD_ERR_PARTIAL,
Chris@0 19 UPLOAD_ERR_NO_FILE,
Chris@0 20 UPLOAD_ERR_NO_TMP_DIR,
Chris@0 21 UPLOAD_ERR_CANT_WRITE,
Chris@0 22 UPLOAD_ERR_EXTENSION,
Chris@0 23 ];
Chris@0 24
Chris@0 25 /**
Chris@0 26 * @var string
Chris@0 27 */
Chris@0 28 private $clientFilename;
Chris@0 29
Chris@0 30 /**
Chris@0 31 * @var string
Chris@0 32 */
Chris@0 33 private $clientMediaType;
Chris@0 34
Chris@0 35 /**
Chris@0 36 * @var int
Chris@0 37 */
Chris@0 38 private $error;
Chris@0 39
Chris@0 40 /**
Chris@0 41 * @var null|string
Chris@0 42 */
Chris@0 43 private $file;
Chris@0 44
Chris@0 45 /**
Chris@0 46 * @var bool
Chris@0 47 */
Chris@0 48 private $moved = false;
Chris@0 49
Chris@0 50 /**
Chris@0 51 * @var int
Chris@0 52 */
Chris@0 53 private $size;
Chris@0 54
Chris@0 55 /**
Chris@0 56 * @var StreamInterface|null
Chris@0 57 */
Chris@0 58 private $stream;
Chris@0 59
Chris@0 60 /**
Chris@0 61 * @param StreamInterface|string|resource $streamOrFile
Chris@0 62 * @param int $size
Chris@0 63 * @param int $errorStatus
Chris@0 64 * @param string|null $clientFilename
Chris@0 65 * @param string|null $clientMediaType
Chris@0 66 */
Chris@0 67 public function __construct(
Chris@0 68 $streamOrFile,
Chris@0 69 $size,
Chris@0 70 $errorStatus,
Chris@0 71 $clientFilename = null,
Chris@0 72 $clientMediaType = null
Chris@0 73 ) {
Chris@0 74 $this->setError($errorStatus);
Chris@0 75 $this->setSize($size);
Chris@0 76 $this->setClientFilename($clientFilename);
Chris@0 77 $this->setClientMediaType($clientMediaType);
Chris@0 78
Chris@0 79 if ($this->isOk()) {
Chris@0 80 $this->setStreamOrFile($streamOrFile);
Chris@0 81 }
Chris@0 82 }
Chris@0 83
Chris@0 84 /**
Chris@0 85 * Depending on the value set file or stream variable
Chris@0 86 *
Chris@0 87 * @param mixed $streamOrFile
Chris@0 88 * @throws InvalidArgumentException
Chris@0 89 */
Chris@0 90 private function setStreamOrFile($streamOrFile)
Chris@0 91 {
Chris@0 92 if (is_string($streamOrFile)) {
Chris@0 93 $this->file = $streamOrFile;
Chris@0 94 } elseif (is_resource($streamOrFile)) {
Chris@0 95 $this->stream = new Stream($streamOrFile);
Chris@0 96 } elseif ($streamOrFile instanceof StreamInterface) {
Chris@0 97 $this->stream = $streamOrFile;
Chris@0 98 } else {
Chris@0 99 throw new InvalidArgumentException(
Chris@0 100 'Invalid stream or file provided for UploadedFile'
Chris@0 101 );
Chris@0 102 }
Chris@0 103 }
Chris@0 104
Chris@0 105 /**
Chris@0 106 * @param int $error
Chris@0 107 * @throws InvalidArgumentException
Chris@0 108 */
Chris@0 109 private function setError($error)
Chris@0 110 {
Chris@0 111 if (false === is_int($error)) {
Chris@0 112 throw new InvalidArgumentException(
Chris@0 113 'Upload file error status must be an integer'
Chris@0 114 );
Chris@0 115 }
Chris@0 116
Chris@0 117 if (false === in_array($error, UploadedFile::$errors)) {
Chris@0 118 throw new InvalidArgumentException(
Chris@0 119 'Invalid error status for UploadedFile'
Chris@0 120 );
Chris@0 121 }
Chris@0 122
Chris@0 123 $this->error = $error;
Chris@0 124 }
Chris@0 125
Chris@0 126 /**
Chris@0 127 * @param int $size
Chris@0 128 * @throws InvalidArgumentException
Chris@0 129 */
Chris@0 130 private function setSize($size)
Chris@0 131 {
Chris@0 132 if (false === is_int($size)) {
Chris@0 133 throw new InvalidArgumentException(
Chris@0 134 'Upload file size must be an integer'
Chris@0 135 );
Chris@0 136 }
Chris@0 137
Chris@0 138 $this->size = $size;
Chris@0 139 }
Chris@0 140
Chris@0 141 /**
Chris@0 142 * @param mixed $param
Chris@0 143 * @return boolean
Chris@0 144 */
Chris@0 145 private function isStringOrNull($param)
Chris@0 146 {
Chris@0 147 return in_array(gettype($param), ['string', 'NULL']);
Chris@0 148 }
Chris@0 149
Chris@0 150 /**
Chris@0 151 * @param mixed $param
Chris@0 152 * @return boolean
Chris@0 153 */
Chris@0 154 private function isStringNotEmpty($param)
Chris@0 155 {
Chris@0 156 return is_string($param) && false === empty($param);
Chris@0 157 }
Chris@0 158
Chris@0 159 /**
Chris@0 160 * @param string|null $clientFilename
Chris@0 161 * @throws InvalidArgumentException
Chris@0 162 */
Chris@0 163 private function setClientFilename($clientFilename)
Chris@0 164 {
Chris@0 165 if (false === $this->isStringOrNull($clientFilename)) {
Chris@0 166 throw new InvalidArgumentException(
Chris@0 167 'Upload file client filename must be a string or null'
Chris@0 168 );
Chris@0 169 }
Chris@0 170
Chris@0 171 $this->clientFilename = $clientFilename;
Chris@0 172 }
Chris@0 173
Chris@0 174 /**
Chris@0 175 * @param string|null $clientMediaType
Chris@0 176 * @throws InvalidArgumentException
Chris@0 177 */
Chris@0 178 private function setClientMediaType($clientMediaType)
Chris@0 179 {
Chris@0 180 if (false === $this->isStringOrNull($clientMediaType)) {
Chris@0 181 throw new InvalidArgumentException(
Chris@0 182 'Upload file client media type must be a string or null'
Chris@0 183 );
Chris@0 184 }
Chris@0 185
Chris@0 186 $this->clientMediaType = $clientMediaType;
Chris@0 187 }
Chris@0 188
Chris@0 189 /**
Chris@0 190 * Return true if there is no upload error
Chris@0 191 *
Chris@0 192 * @return boolean
Chris@0 193 */
Chris@0 194 private function isOk()
Chris@0 195 {
Chris@0 196 return $this->error === UPLOAD_ERR_OK;
Chris@0 197 }
Chris@0 198
Chris@0 199 /**
Chris@0 200 * @return boolean
Chris@0 201 */
Chris@0 202 public function isMoved()
Chris@0 203 {
Chris@0 204 return $this->moved;
Chris@0 205 }
Chris@0 206
Chris@0 207 /**
Chris@0 208 * @throws RuntimeException if is moved or not ok
Chris@0 209 */
Chris@0 210 private function validateActive()
Chris@0 211 {
Chris@0 212 if (false === $this->isOk()) {
Chris@0 213 throw new RuntimeException('Cannot retrieve stream due to upload error');
Chris@0 214 }
Chris@0 215
Chris@0 216 if ($this->isMoved()) {
Chris@0 217 throw new RuntimeException('Cannot retrieve stream after it has already been moved');
Chris@0 218 }
Chris@0 219 }
Chris@0 220
Chris@0 221 /**
Chris@0 222 * {@inheritdoc}
Chris@0 223 * @throws RuntimeException if the upload was not successful.
Chris@0 224 */
Chris@0 225 public function getStream()
Chris@0 226 {
Chris@0 227 $this->validateActive();
Chris@0 228
Chris@0 229 if ($this->stream instanceof StreamInterface) {
Chris@0 230 return $this->stream;
Chris@0 231 }
Chris@0 232
Chris@0 233 return new LazyOpenStream($this->file, 'r+');
Chris@0 234 }
Chris@0 235
Chris@0 236 /**
Chris@0 237 * {@inheritdoc}
Chris@0 238 *
Chris@0 239 * @see http://php.net/is_uploaded_file
Chris@0 240 * @see http://php.net/move_uploaded_file
Chris@0 241 * @param string $targetPath Path to which to move the uploaded file.
Chris@0 242 * @throws RuntimeException if the upload was not successful.
Chris@0 243 * @throws InvalidArgumentException if the $path specified is invalid.
Chris@0 244 * @throws RuntimeException on any error during the move operation, or on
Chris@0 245 * the second or subsequent call to the method.
Chris@0 246 */
Chris@0 247 public function moveTo($targetPath)
Chris@0 248 {
Chris@0 249 $this->validateActive();
Chris@0 250
Chris@0 251 if (false === $this->isStringNotEmpty($targetPath)) {
Chris@0 252 throw new InvalidArgumentException(
Chris@0 253 'Invalid path provided for move operation; must be a non-empty string'
Chris@0 254 );
Chris@0 255 }
Chris@0 256
Chris@0 257 if ($this->file) {
Chris@0 258 $this->moved = php_sapi_name() == 'cli'
Chris@0 259 ? rename($this->file, $targetPath)
Chris@0 260 : move_uploaded_file($this->file, $targetPath);
Chris@0 261 } else {
Chris@0 262 copy_to_stream(
Chris@0 263 $this->getStream(),
Chris@0 264 new LazyOpenStream($targetPath, 'w')
Chris@0 265 );
Chris@0 266
Chris@0 267 $this->moved = true;
Chris@0 268 }
Chris@0 269
Chris@0 270 if (false === $this->moved) {
Chris@0 271 throw new RuntimeException(
Chris@0 272 sprintf('Uploaded file could not be moved to %s', $targetPath)
Chris@0 273 );
Chris@0 274 }
Chris@0 275 }
Chris@0 276
Chris@0 277 /**
Chris@0 278 * {@inheritdoc}
Chris@0 279 *
Chris@0 280 * @return int|null The file size in bytes or null if unknown.
Chris@0 281 */
Chris@0 282 public function getSize()
Chris@0 283 {
Chris@0 284 return $this->size;
Chris@0 285 }
Chris@0 286
Chris@0 287 /**
Chris@0 288 * {@inheritdoc}
Chris@0 289 *
Chris@0 290 * @see http://php.net/manual/en/features.file-upload.errors.php
Chris@0 291 * @return int One of PHP's UPLOAD_ERR_XXX constants.
Chris@0 292 */
Chris@0 293 public function getError()
Chris@0 294 {
Chris@0 295 return $this->error;
Chris@0 296 }
Chris@0 297
Chris@0 298 /**
Chris@0 299 * {@inheritdoc}
Chris@0 300 *
Chris@0 301 * @return string|null The filename sent by the client or null if none
Chris@0 302 * was provided.
Chris@0 303 */
Chris@0 304 public function getClientFilename()
Chris@0 305 {
Chris@0 306 return $this->clientFilename;
Chris@0 307 }
Chris@0 308
Chris@0 309 /**
Chris@0 310 * {@inheritdoc}
Chris@0 311 */
Chris@0 312 public function getClientMediaType()
Chris@0 313 {
Chris@0 314 return $this->clientMediaType;
Chris@0 315 }
Chris@0 316 }