Closed
Description
Describe the bug
I'm trying to use SHA1 checksums when uploading files to amazon S3 bucket. It works when I upload small files. But with large files and Multipart Upload, process fails to complete.
Expected Behavior
Upload to AWS S3 bucket with SHA1 checksum algorithm enabled ends with success.
Current Behavior
Upload fails with 400 response code:
400 Bad Request
The upload was created using a sha1 checksum. The complete request must include the checksum for each part. It was missing for part 1 in the request.
Relevant part of the stack trace:
An exception occurred while completing a multipart upload: Error executing "CompleteMultipartUpload" on "https://BUCKET.s3.amazonaws.com/contents/myfile.dat?uploadId=ID"; AWS HTTP error: Client error: `POST https://BUCKET.s3.amazonaws.com/contents/myfile.dat?uploadId=ID` resulted in a `400 Bad Request` response:
<Error><Code>InvalidRequest</Code><Message>The upload was created using a sha1 checksum. The complete request must inclu (truncated...)
InvalidRequest (client): The upload was created using a sha1 checksum. The complete request must include the checksum for each part. It was missing for part 1 in the request. - <Error><Code>InvalidRequest</Code><Message>The upload was created using a sha1 checksum. The complete request must include the checksum for each part. It was missing for part 1 in the request.</Message><RequestId>VS9J72F799MSGTG1</RequestId><HostId>Vqgw2uJseIdwDBKKay3xT15fsADJLhd7bpqW+0k6denCuisH1pQzKKrKWYQMMQqcND144szIHVw=</HostId></Error> {"userId":25,"exception":"[object] (Aws\\S3\\Exception\\S3MultipartUploadException(code: 0): An exception occurred while completing a multipart upload: Error executing \"CompleteMultipartUpload\" on \"https://BUCKET.s3.amazonaws.com/contents/myfile.dat?uploadId=ID\"; AWS HTTP error: Client error: `POST https://BUCKET.s3.amazonaws.com/contents/myfile.dat?uploadId=ID` resulted in a `400 Bad Request` response:
<Error><Code>InvalidRequest</Code><Message>The upload was created using a sha1 checksum. The complete request must inclu (truncated...)
InvalidRequest (client): The upload was created using a sha1 checksum. The complete request must include the checksum for each part. It was missing for part 1 in the request. - <Error><Code>InvalidRequest</Code><Message>The upload was created using a sha1 checksum. The complete request must include the checksum for each part. It was missing for part 1 in the request.</Message><RequestId>VS9J72F799MSGTG1</RequestId><HostId>Vqgw2uJseIdwDBKKay3xT15fsADJLhd7bpqW+0k6denCuisH1pQzKKrKWYQMMQqcND144szIHVw=</HostId></Error> at ROOT\\vendor\\aws\\aws-sdk-php\\src\\Multipart\\AbstractUploadManager.php:147)
[stacktrace]
#0 ROOT\\vendor\\aws\\aws-sdk-php\\src\\Multipart\\AbstractUploadManager.php(156): Aws\\Multipart\\AbstractUploadManager->transformException(Object(Aws\\S3\\Exception\\S3Exception))
#1 ROOT\\vendor\\guzzlehttp\\promises\\src\\Promise.php(204): Aws\\Multipart\\AbstractUploadManager->Aws\\Multipart\\{closure}(Object(Aws\\S3\\Exception\\S3Exception))
#2 ROOT\\vendor\\guzzlehttp\\promises\\src\\Promise.php(153): GuzzleHttp\\Promise\\Promise::callHandler(2, Object(Aws\\S3\\Exception\\S3Exception), NULL)
#3 ROOT\\vendor\\guzzlehttp\\promises\\src\\TaskQueue.php(48): GuzzleHttp\\Promise\\Promise::GuzzleHttp\\Promise\\{closure}()
#4 ROOT\\vendor\\guzzlehttp\\guzzle\\src\\Handler\\CurlMultiHandler.php(159): GuzzleHttp\\Promise\\TaskQueue->run()
#5 ROOT\\vendor\\guzzlehttp\\guzzle\\src\\Handler\\CurlMultiHandler.php(184): GuzzleHttp\\Handler\\CurlMultiHandler->tick()
#6 ROOT\\vendor\\guzzlehttp\\promises\\src\\Promise.php(248): GuzzleHttp\\Handler\\CurlMultiHandler->execute(true)
#7 ROOT\\vendor\\guzzlehttp\\promises\\src\\Promise.php(224): GuzzleHttp\\Promise\\Promise->invokeWaitFn()
#8 ROOT\\vendor\\guzzlehttp\\promises\\src\\Promise.php(269): GuzzleHttp\\Promise\\Promise->waitIfPending()
#9 ROOT\\vendor\\guzzlehttp\\promises\\src\\Promise.php(226): GuzzleHttp\\Promise\\Promise->invokeWaitList()
#10 ROOT\\vendor\\guzzlehttp\\promises\\src\\Promise.php(269): GuzzleHttp\\Promise\\Promise->waitIfPending()
#11 ROOT\\vendor\\guzzlehttp\\promises\\src\\Promise.php(226): GuzzleHttp\\Promise\\Promise->invokeWaitList()
#12 ROOT\\vendor\\guzzlehttp\\promises\\src\\Promise.php(62): GuzzleHttp\\Promise\\Promise->waitIfPending()
#13 ROOT\\vendor\\guzzlehttp\\promises\\src\\Coroutine.php(67): GuzzleHttp\\Promise\\Promise->wait()
#14 ROOT\\vendor\\guzzlehttp\\promises\\src\\Promise.php(248): GuzzleHttp\\Promise\\Coroutine->GuzzleHttp\\Promise\\{closure}(true)
#15 ROOT\\vendor\\guzzlehttp\\promises\\src\\Promise.php(224): GuzzleHttp\\Promise\\Promise->invokeWaitFn()
#16 ROOT\\vendor\\guzzlehttp\\promises\\src\\Promise.php(269): GuzzleHttp\\Promise\\Promise->waitIfPending()
#17 ROOT\\vendor\\guzzlehttp\\promises\\src\\Promise.php(226): GuzzleHttp\\Promise\\Promise->invokeWaitList()
#18 ROOT\\vendor\\guzzlehttp\\promises\\src\\Promise.php(62): GuzzleHttp\\Promise\\Promise->waitIfPending()
#19 ROOT\\vendor\\aws\\aws-sdk-php\\src\\S3\\S3ClientTrait.php(35): GuzzleHttp\\Promise\\Promise->wait()
#20 ROOT\
outes\\web.php(542): Aws\\S3\\S3Client->upload('ws-company-55-6...', 'contents/myfile...', Resource id #8, 'private', Array)
Reproduction Steps
/* create s3 client */
$s3Client = new \Aws\S3\S3Client(
[
'version'=> 'latest',
'region' => REGION,
'credentials' => array(
'key' => AWS_KEY,
'secret' => AWS_SECRET
)
]);
/* open file stream large enough to initiate multipart upload ( 33 MB in my example) */
$stream = fopen("d:/temp/G320.MOV", "r");
/* send file to S3 with SHA1 checksum enabled */
$s3client->upload('ws-company-55-63fccce1bcddb', 'contents/myfile.dat', $stream, 'private',
// pass params to enable SHA1 checksum calculation
['params' => [
"ChecksumAlgorithm" => "SHA1"
]
]
);
Possible Solution
No response
Additional Information/Context
No response
SDK version used
3.261.0
Environment details (Version of PHP (php -v
)? OS name and version, etc.)
php 7.4.9, Windows 10, Laravel 8