2017-08-03 85 views
0

我正在创建一个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我能够解压缩一下,看看原来的字符串。所以我必须错误地上传文件,有什么想法?

回答

1

根据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'。

+0

应该是gzencode($ content)而不是gzcompress($ content)。 gzencode将添加必要的标题数据以创建适当的gzip存档。 – Ben