如何将gzip对象上传到s3?
问题描述:
我正在创建一个gzip字符串并将其作为对象上传到s3。然而,当我下载从S3相同的文件,用gunzip解本地解压缩它,我得到这个错误:gunzip: 111.gz: not in gzip format
当我看从下载的文件中返回的mime_content_type S3它被设置为:application/zlib
如何将gzip对象上传到s3?
这里是我的代码运行时要产生gzip文件,并将它推到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'
]
));
奇怪的是,如果我在本地查看gzip的内容之前,我送它到S3我能够解压缩一下,看看原来的字符串。所以我必须错误地上传文件,有什么想法?
答
根据http://docs.aws.amazon.com/aws-sdk-php/v3/api/api-s3-2006-03-01.html#putobject,ContentType和ContentEncoding参数属于顶层,而不属于元数据。所以,你的电话应该是这样的:
$result = $this->s3->putObject(array(
'Bucket' => 'my-bucket-name',
'Key' => '111.gz',
'Body' => gzcompress($content),
'ACL' => 'authenticated-read',
'ContentType' => 'text/plain',
'ContentEncoding' => 'gzip'
));
此外,它可能是通过设置的ContentType以纯文本/每当空字节时您的文件可能会被截断。如果您在解压文件时仍遇到问题,我会尝试'application/gzip'。
应该是gzencode($ content)而不是gzcompress($ content)。 gzencode将添加必要的标题数据以创建适当的gzip存档。 – Ben