I am creating a gzip string and uploading it as an object to s3. However when I download the same file from s3 and decompress it locally with gunzip I get this error: gunzip: 111.gz: not in gzip format
When I look at the mime_content_type returned in the file downloaded from s3 it is set as: application/zlib
Here is the code I am running to generate the gzip file and push it to s3:
for($i=0;$i<=100;$i++) { $content .= $i . "n"; } $result = $this->s3->putObject(array( 'Bucket' => 'my-bucket-name', 'Key' => '111.gz', 'Body' => gzcompress($content), 'ACL' => 'authenticated-read', 'Metadata' => [ 'ContentType' => 'text/plain', 'ContentEncoding' => 'gzip' ] ));
The strange thing is that if I view the gzip content locally before I send it to s3 I am able to decompress it and see the original string. So I must be uploading the file incorrectly, any thoughts?
Advertisement
Answer
According to http://docs.aws.amazon.com/aws-sdk-php/v3/api/api-s3-2006-03-01.html#putobject the ContentType and ContentEncoding parameters belong on top level, and not under Metadata. So your call should look like:
$result = $this->s3->putObject(array( 'Bucket' => 'my-bucket-name', 'Key' => '111.gz', 'Body' => gzencode($content), 'ACL' => 'authenticated-read', 'ContentType' => 'text/plain', 'ContentEncoding' => 'gzip' ));
Also it’s possible that by setting ContentType to text/plain your file might be truncated whenever a null-byte occurs. I would try with’application/gzip’ if you still have problems unzipping the file.