null, 'key' => null, 'exception_class' => 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 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 = Psr7\stream_for(); 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(ResultInterface $result) { return $result['ETag']; } protected function getSourceMimeType() { if ($uri = $this->source->getMetadata('uri')) { return 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(Stream $stream, array &$data) { // Decorate source with a hashing stream $hash = new PhpHash('sha256'); return new HashingStream($stream, $hash, function ($result) use (&$data) { $data['ContentSHA256'] = bin2hex($result); }); } }