Fix empty file uploads to S3

Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
This commit is contained in:
Roeland Jago Douma 2019-02-14 15:51:40 +01:00
parent 49a0ea01e5
commit 61d66d7954
No known key found for this signature in database
GPG Key ID: F941078878347C0C
1 changed files with 23 additions and 2 deletions

View File

@ -23,8 +23,11 @@
namespace OC\Files\ObjectStore; namespace OC\Files\ObjectStore;
use Aws\S3\Exception\S3MultipartUploadException;
use Aws\S3\MultipartUploader; use Aws\S3\MultipartUploader;
use Aws\S3\ObjectUploader;
use Aws\S3\S3Client; use Aws\S3\S3Client;
use Icewind\Streams\CallbackWrapper;
const S3_UPLOAD_PART_SIZE = 524288000; // 500MB const S3_UPLOAD_PART_SIZE = 524288000; // 500MB
@ -73,12 +76,30 @@ trait S3ObjectTrait {
* @since 7.0.0 * @since 7.0.0
*/ */
function writeObject($urn, $stream) { function writeObject($urn, $stream) {
$uploader = new MultipartUploader($this->getConnection(), $stream, [ $count = 0;
$countStream = CallbackWrapper::wrap($stream, function ($read) use (&$count) {
$count += $read;
});
$uploader = new MultipartUploader($this->getConnection(), $countStream, [
'bucket' => $this->bucket, 'bucket' => $this->bucket,
'key' => $urn, 'key' => $urn,
'part_size' => S3_UPLOAD_PART_SIZE 'part_size' => S3_UPLOAD_PART_SIZE
]); ]);
try {
$uploader->upload(); $uploader->upload();
} catch (S3MultipartUploadException $e) {
// This is an emty file so just touch it then
if ($count === 0 && feof($countStream)) {
$uploader = new ObjectUploader($this->getConnection(), $this->bucket, $urn, '');
$uploader->upload();
} else {
throw $e;
}
}
fclose($countStream);
} }
/** /**