Я создаю строку gzip и загружаю ее как объект в s3. Однако, когда я загружаю тот же файл из s3 и распаковываю его локально с помощью gunzip, я получаю эту ошибку: gunzip: 111.gz: not in gzip format
Когда я смотрю на mime_content_type, возвращенный в файле, загруженном с s3, он устанавливается как: application/zlib
Вот код, который я запускаю, чтобы сгенерировать файл 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 в text / plain, ваш файл может быть обрезан при появлении нулевого байта. Я бы попробовал с ‘application / gzip’, если у вас все еще есть проблемы с разархивированием файла.
У меня была очень похожая проблема, и единственный способ заставить его работать для нашего файла был с кодом, подобным этому (немного измененный в соответствии с вашим примером):
$this->s3->putObject(array(
'Bucket' => 'my-bucket-name',
'Key' => '111.gz',
'Body' => gzcompress($content, 9, ZLIB_ENCODING_GZIP),
'ACL' => 'public-read',
'ContentType' => 'text/javascript',
'ContentEncoding' => 'gzip'
));
Соответствующая часть gzcompress($content, 9, ZLIB_ENCODING_GZIP)
поскольку AWS S3 не распознает файл и не предоставит его в нужном формате без последнего ZLIB_ENCODING_GZIP
параметр.