Как загрузить объект gzip в s3?

Я создаю строку 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, я могу распаковать его и увидеть исходную строку. Так что я должен загружать файл неправильно, есть мысли?

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 в text / plain, ваш файл может быть обрезан при появлении нулевого байта. Я бы попробовал с ‘application / gzip’, если у вас все еще есть проблемы с разархивированием файла.

1

Другие решения

У меня была очень похожая проблема, и единственный способ заставить его работать для нашего файла был с кодом, подобным этому (немного измененный в соответствии с вашим примером):

$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 параметр.

0

По вопросам рекламы [email protected]