diff options
Diffstat (limited to 'vendor/aws/aws-sdk-php/src/Multipart/AbstractUploader.php')
-rw-r--r-- | vendor/aws/aws-sdk-php/src/Multipart/AbstractUploader.php | 150 |
1 files changed, 150 insertions, 0 deletions
diff --git a/vendor/aws/aws-sdk-php/src/Multipart/AbstractUploader.php b/vendor/aws/aws-sdk-php/src/Multipart/AbstractUploader.php new file mode 100644 index 0000000..75e6794 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Multipart/AbstractUploader.php @@ -0,0 +1,150 @@ +<?php +namespace Aws\Multipart; + +use Aws\AwsClientInterface as Client; +use Aws\Exception\AwsException; +use GuzzleHttp\Psr7; +use InvalidArgumentException as IAE; +use Psr\Http\Message\StreamInterface as Stream; + +abstract class AbstractUploader extends AbstractUploadManager +{ + /** @var Stream Source of the data to be uploaded. */ + protected $source; + + /** + * @param Client $client + * @param mixed $source + * @param array $config + */ + public function __construct(Client $client, $source, array $config = []) + { + $this->source = $this->determineSource($source); + parent::__construct($client, $config); + } + + /** + * Create a stream for a part that starts at the current position and + * has a length of the upload part size (or less with the final part). + * + * @param Stream $stream + * + * @return Psr7\LimitStream + */ + protected function limitPartStream(Stream $stream) + { + // Limit what is read from the stream to the part size. + return new Psr7\LimitStream( + $stream, + $this->state->getPartSize(), + $this->source->tell() + ); + } + + protected function getUploadCommands(callable $resultHandler) + { + // Determine if the source can be seeked. + $seekable = $this->source->isSeekable() + && $this->source->getMetadata('wrapper_type') === 'plainfile'; + + for ($partNumber = 1; $this->isEof($seekable); $partNumber++) { + // If we haven't already uploaded this part, yield a new part. + if (!$this->state->hasPartBeenUploaded($partNumber)) { + $partStartPos = $this->source->tell(); + if (!($data = $this->createPart($seekable, $partNumber))) { + break; + } + $command = $this->client->getCommand( + $this->info['command']['upload'], + $data + $this->state->getId() + ); + $command->getHandlerList()->appendSign($resultHandler, 'mup'); + $numberOfParts = $this->getNumberOfParts($this->state->getPartSize()); + if (isset($numberOfParts) && $partNumber > $numberOfParts) { + throw new $this->config['exception_class']( + $this->state, + new AwsException( + "Maximum part number for this job exceeded, file has likely been corrupted." . + " Please restart this upload.", + $command + ) + ); + } + + yield $command; + if ($this->source->tell() > $partStartPos) { + continue; + } + } + + // Advance the source's offset if not already advanced. + if ($seekable) { + $this->source->seek(min( + $this->source->tell() + $this->state->getPartSize(), + $this->source->getSize() + )); + } else { + $this->source->read($this->state->getPartSize()); + } + } + } + + /** + * Generates the parameters for an upload part by analyzing a range of the + * source starting from the current offset up to the part size. + * + * @param bool $seekable + * @param int $number + * + * @return array|null + */ + abstract protected function createPart($seekable, $number); + + /** + * Checks if the source is at EOF. + * + * @param bool $seekable + * + * @return bool + */ + private function isEof($seekable) + { + return $seekable + ? $this->source->tell() < $this->source->getSize() + : !$this->source->eof(); + } + + /** + * Turns the provided source into a stream and stores it. + * + * If a string is provided, it is assumed to be a filename, otherwise, it + * passes the value directly to `Psr7\Utils::streamFor()`. + * + * @param mixed $source + * + * @return Stream + */ + private function determineSource($source) + { + // Use the contents of a file as the data source. + if (is_string($source)) { + $source = Psr7\Utils::tryFopen($source, 'r'); + } + + // Create a source stream. + $stream = Psr7\Utils::streamFor($source); + if (!$stream->isReadable()) { + throw new IAE('Source stream must be readable.'); + } + + return $stream; + } + + protected function getNumberOfParts($partSize) + { + if ($sourceSize = $this->source->getSize()) { + return ceil($sourceSize/$partSize); + } + return null; + } +} |