src/UploadedFile.php
public function moveTo($targetPath)
    {
        if ($this->hasMoved()) {
            throw new \RuntimeException(sprintf('Uploaded file "%s" has already moved', $this->file));
        }

        if (!is_writable(dirname($targetPath))) {
            throw new \InvalidArgumentException(sprintf('Target path "%s" is not writable', $targetPath));
        }

        if (is_uploaded_file($this->file)) {
            $this->moved = move_uploaded_file($this->file, $targetPath);
        } else {
            throw new \RuntimeException(sprintf('"%s" is not a valid uploaded file', $this->file));
        }
    }
public function moveTo($targetPath)
    {
        if ($this->hasMoved()) {
            throw new \RuntimeException(sprintf('Uploaded file "%s" has already moved', $this->file));
        }

        if (!is_writable(dirname($targetPath))) {
            throw new \InvalidArgumentException(sprintf('Target path "%s" is not writable', $targetPath));
        }

        if (is_uploaded_file($this->file)) {
            $this->moved = move_uploaded_file($this->file, $targetPath);
        } else {
            throw new \RuntimeException(sprintf('"%s" is not a valid uploaded file', $this->file));
        }
    }
Move the uploaded file to a new location.

Use this method as an alternative to move_uploaded_file(). This method is
guaranteed to work in both SAPI and non-SAPI environments.
Implementations must determine which environment they are in, and use the
appropriate method (move_uploaded_file(), rename(), or a stream
operation) to perform the operation.

$targetPath may be an absolute path, or a relative path. If it is a
relative path, resolution should be the same as used by PHP's rename()
function.

The original file or stream MUST be removed on completion.

If this method is called more than once, any subsequent calls MUST raise
an exception.

When used in an SAPI environment where $_FILES is populated, when writing
files via moveTo(), is_uploaded_file() and move_uploaded_file() SHOULD be
used to ensure permissions and upload status are verified correctly.

If you wish to move to a stream, use getStream(), as SAPI operations
cannot guarantee writing to stream destinations.

@see http://php.net/is_uploaded_file
@see http://php.net/move_uploaded_file

@param string $targetPath Path to which to move the uploaded file.

@throws \InvalidArgumentException if the $targetPath specified is invalid.
@throws \RuntimeException on any error during the move operation, or on
the second or subsequent call to the method.