null, 'key' => null, 'exception_class' => \UglyRobot\Infinite_Uploads\Aws\S3\Exception\S3MultipartUploadException::class]); } protected function loadUploadWorkflowInfo() { return ['command' => ['initiate' => 'CreateMultipartUpload', 'upload' => 'UploadPart', 'complete' => 'CompleteMultipartUpload'], 'id' => ['bucket' => 'Bucket', 'key' => 'Key', 'upload_id' => 'UploadId'], 'part_num' => 'PartNumber']; } protected function createPart($seekable, $number) { // Initialize the array of part data that will be returned. $data = []; // Apply custom params to UploadPart data $config = $this->getConfig(); $params = isset($config['params']) ? $config['params'] : []; foreach ($params as $k => $v) { $data[$k] = $v; } $data['PartNumber'] = $number; // Read from the source to create the body stream. if ($seekable) { // Case 1: Source is seekable, use lazy stream to defer work. $body = $this->limitPartStream(new \UglyRobot\Infinite_Uploads\GuzzleHttp\Psr7\LazyOpenStream($this->source->getMetadata('uri'), 'r')); } else { // Case 2: Stream is not seekable; must store in temp stream. $source = $this->limitPartStream($this->source); $source = $this->decorateWithHashes($source, $data); $body = \UglyRobot\Infinite_Uploads\GuzzleHttp\Psr7\stream_for(); \UglyRobot\Infinite_Uploads\GuzzleHttp\Psr7\copy_to_stream($source, $body); } $contentLength = $body->getSize(); // Do not create a part if the body size is zero. if ($contentLength === 0) { return false; } $body->seek(0); $data['Body'] = $body; $data['ContentLength'] = $contentLength; return $data; } protected function extractETag(\UglyRobot\Infinite_Uploads\Aws\ResultInterface $result) { return $result['ETag']; } protected function getSourceMimeType() { if ($uri = $this->source->getMetadata('uri')) { return \UglyRobot\Infinite_Uploads\GuzzleHttp\Psr7\mimetype_from_filename($uri) ?: 'application/octet-stream'; } } protected function getSourceSize() { return $this->source->getSize(); } /** * Decorates a stream with a sha256 linear hashing stream. * * @param Stream $stream Stream to decorate. * @param array $data Part data to augment with the hash result. * * @return Stream */ private function decorateWithHashes(\UglyRobot\Infinite_Uploads\Psr\Http\Message\StreamInterface $stream, array &$data) { // Decorate source with a hashing stream $hash = new \UglyRobot\Infinite_Uploads\Aws\PhpHash('sha256'); return new \UglyRobot\Infinite_Uploads\Aws\HashingStream($stream, $hash, function ($result) use(&$data) { $data['ContentSHA256'] = bin2hex($result); }); } }