|
|
|
@ -77,22 +77,32 @@ trait S3ObjectTrait { |
|
|
|
|
return $fh; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private function buildS3Metadata(array $metadata): array { |
|
|
|
|
$result = []; |
|
|
|
|
foreach ($metadata as $key => $value) { |
|
|
|
|
$result['x-amz-meta-' . $key] = $value; |
|
|
|
|
} |
|
|
|
|
return $result; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Single object put helper |
|
|
|
|
* |
|
|
|
|
* @param string $urn the unified resource name used to identify the object |
|
|
|
|
* @param StreamInterface $stream stream with the data to write |
|
|
|
|
* @param string|null $mimetype the mimetype to set for the remove object @since 22.0.0 |
|
|
|
|
* @param array $metaData the metadata to set for the object |
|
|
|
|
* @throws \Exception when something goes wrong, message will be logged |
|
|
|
|
*/ |
|
|
|
|
protected function writeSingle(string $urn, StreamInterface $stream, ?string $mimetype = null): void { |
|
|
|
|
protected function writeSingle(string $urn, StreamInterface $stream, array $metaData): void { |
|
|
|
|
$mimetype = $metaData['mimetype'] ?? null; |
|
|
|
|
unset($metaData['mimetype']); |
|
|
|
|
$this->getConnection()->putObject([ |
|
|
|
|
'Bucket' => $this->bucket, |
|
|
|
|
'Key' => $urn, |
|
|
|
|
'Body' => $stream, |
|
|
|
|
'ACL' => 'private', |
|
|
|
|
'ContentType' => $mimetype, |
|
|
|
|
'Metadata' => $this->buildS3Metadata($metaData), |
|
|
|
|
'StorageClass' => $this->storageClass, |
|
|
|
|
] + $this->getSSECParameters()); |
|
|
|
|
} |
|
|
|
@ -103,10 +113,12 @@ trait S3ObjectTrait { |
|
|
|
|
* |
|
|
|
|
* @param string $urn the unified resource name used to identify the object |
|
|
|
|
* @param StreamInterface $stream stream with the data to write |
|
|
|
|
* @param string|null $mimetype the mimetype to set for the remove object |
|
|
|
|
* @param array $metaData the metadata to set for the object |
|
|
|
|
* @throws \Exception when something goes wrong, message will be logged |
|
|
|
|
*/ |
|
|
|
|
protected function writeMultiPart(string $urn, StreamInterface $stream, ?string $mimetype = null): void { |
|
|
|
|
protected function writeMultiPart(string $urn, StreamInterface $stream, array $metaData): void { |
|
|
|
|
$mimetype = $metaData['mimetype'] ?? null; |
|
|
|
|
unset($metaData['mimetype']); |
|
|
|
|
$uploader = new MultipartUploader($this->getConnection(), $stream, [ |
|
|
|
|
'bucket' => $this->bucket, |
|
|
|
|
'concurrency' => $this->concurrency, |
|
|
|
@ -114,6 +126,7 @@ trait S3ObjectTrait { |
|
|
|
|
'part_size' => $this->uploadPartSize, |
|
|
|
|
'params' => [ |
|
|
|
|
'ContentType' => $mimetype, |
|
|
|
|
'Metadata' => $this->buildS3Metadata($metaData), |
|
|
|
|
'StorageClass' => $this->storageClass, |
|
|
|
|
] + $this->getSSECParameters(), |
|
|
|
|
]); |
|
|
|
@ -131,15 +144,15 @@ trait S3ObjectTrait { |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* @param string $urn the unified resource name used to identify the object |
|
|
|
|
* @param resource $stream stream with the data to write |
|
|
|
|
* @param string|null $mimetype the mimetype to set for the remove object @since 22.0.0 |
|
|
|
|
* @throws \Exception when something goes wrong, message will be logged |
|
|
|
|
* @since 7.0.0 |
|
|
|
|
*/ |
|
|
|
|
public function writeObject($urn, $stream, ?string $mimetype = null) { |
|
|
|
|
$metaData = []; |
|
|
|
|
if ($mimetype) { |
|
|
|
|
$metaData['mimetype'] = $mimetype; |
|
|
|
|
} |
|
|
|
|
$this->writeObjectWithMetaData($urn, $stream, $metaData); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public function writeObjectWithMetaData(string $urn, $stream, array $metaData): void { |
|
|
|
|
$canSeek = fseek($stream, 0, SEEK_CUR) === 0; |
|
|
|
|
$psrStream = Utils::streamFor($stream); |
|
|
|
|
|
|
|
|
@ -154,16 +167,16 @@ trait S3ObjectTrait { |
|
|
|
|
$buffer->seek(0); |
|
|
|
|
if ($buffer->getSize() < $this->putSizeLimit) { |
|
|
|
|
// buffer is fully seekable, so use it directly for the small upload |
|
|
|
|
$this->writeSingle($urn, $buffer, $mimetype); |
|
|
|
|
$this->writeSingle($urn, $buffer, $metaData); |
|
|
|
|
} else { |
|
|
|
|
$loadStream = new Psr7\AppendStream([$buffer, $psrStream]); |
|
|
|
|
$this->writeMultiPart($urn, $loadStream, $mimetype); |
|
|
|
|
$this->writeMultiPart($urn, $loadStream, $metaData); |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
if ($size < $this->putSizeLimit) { |
|
|
|
|
$this->writeSingle($urn, $psrStream, $mimetype); |
|
|
|
|
$this->writeSingle($urn, $psrStream, $metaData); |
|
|
|
|
} else { |
|
|
|
|
$this->writeMultiPart($urn, $psrStream, $mimetype); |
|
|
|
|
$this->writeMultiPart($urn, $psrStream, $metaData); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
$psrStream->close(); |
|
|
|
|