options = array_replace(array( 'min_part_size' => self::MIN_PART_SIZE, 'part_md5' => true ), $this->options); // Make sure the part size can be calculated somehow if (!$this->options['min_part_size'] && !$this->source->getContentLength()) { throw new RuntimeException('The ContentLength of the data source could not be determined, and no ' . 'min_part_size option was provided'); } } /** * {@inheritdoc} */ protected function calculatePartSize() { $partSize = $this->source->getContentLength() ? (int) ceil(($this->source->getContentLength() / self::MAX_PARTS)) : self::MIN_PART_SIZE; $partSize = max($this->options['min_part_size'], $partSize); $partSize = min($partSize, self::MAX_PART_SIZE); $partSize = max($partSize, self::MIN_PART_SIZE); return $partSize; } /** * {@inheritdoc} */ protected function complete() { /** @var $part UploadPart */ $parts = array(); foreach ($this->state as $part) { $parts[] = array( 'PartNumber' => $part->getPartNumber(), 'ETag' => $part->getETag(), ); } $params = $this->state->getUploadId()->toParams(); $params[Ua::OPTION] = Ua::MULTIPART_UPLOAD; $params['Parts'] = $parts; $command = $this->client->getCommand('CompleteMultipartUpload', $params); return $command->getResult(); } /** * {@inheritdoc} */ protected function getAbortCommand() { $params = $this->state->getUploadId()->toParams(); $params[Ua::OPTION] = Ua::MULTIPART_UPLOAD; /** @var $command OperationCommand */ $command = $this->client->getCommand('AbortMultipartUpload', $params); return $command; } }