Укажите Content-Type в функции загрузки AWS PHP.

Я переношу свой код из AWS PHP SDK1 в SDK2 (https://github.com/aws/aws-sdk-php).

У меня есть загрузчик изображений. В моей предыдущей версии я бы указал Content-Type моего изображения следующим образом:

$response = $this->s3->create_object(
                $bucket,
                $key,
                array(
                    'fileUpload'=>$file_resource,
                    'contentType'=>$mime, 
                    'acl' => AmazonS3::ACL_PUBLIC,
                    )
                );

Это моя новая версия:

$response = $this->s3->upload(
                    $bucket, 
                    $key, 
                    $file_resource, 
                    'public-read',
                    array('params' => array('Metadata' => array('ContentType'=>$mime)))
                    );

Я пробовал разные варианты написания ContentType, на сайте S3 оно изменяет имя, чтобы оно выглядело как «x-amz-meta-contenttype», а значение «Content-Type» по умолчанию — «двоичный/октетный поток».

Я также пытался использовать функцию EntityBody, но те же результаты:

$response = $this->s3->upload(
                    $this->bucket, 
                    $to, 
                    EntityBody::factory($file_resource), 
                    'public-read',
                    array('params' => array('Metadata' => array('ContentType'=>$mime)))
                    );

Как установить тип контента в этом новом API?

РЕДАКТИРОВАТЬ: я вижу где-то в документации:

AWS SDK для PHP попытается автоматически определить наиболее подходящий заголовок Content-Type, используемый для хранения объекта. Если вы используете менее распространенное расширение файла и ваш заголовок Content-Type не добавляется автоматически, вы можете добавить заголовок Content-Type, передав в операцию параметр ContentType.

Во-первых, я загружаю простые изображения, но, согласно моей панели управления S3, они загружаются как «двоичный/октетный поток». Что касается их второго пункта, я пробовал много комбинаций массивов с ContentType. Я не уверен, почему это не работает...


person Nathan H    schedule 19.02.2014    source источник


Ответы (3)


В итоге сработал такой набор опций:

array('params' => array('ContentType' => $mime))

Нет необходимости в метаданных

person Nathan H    schedule 21.02.2014

  1. Ну, используя AWS\S3\ S3Client::putObject() напрямую определенно даст вам необходимый контроль.

  2. Расширения файлов должны быть строчными, чтобы автоматическое определение работало.

  3. Вы можете найти список поддерживаемых типов mime в Guzzle\Http. \Mimetypes.

person Ryan Parman    schedule 20.02.2014
comment
1) Насколько я понимаю, upload() использует putObject за кулисами и является рекомендуемым решением для загрузки файлов. 2) Это расширение файла источника или имени назначения? Мой пункт назначения указан в нижнем регистре, а источник - из временного местоположения PHP для загрузки, которое, я думаю, не имеет расширений. 3) Как и ожидалось, большинство расширений изображений находятся в этом списке. - person Nathan H; 20.02.2014
comment
Исходный файл $_FILES["avatar-file"]["tmp_name"], использующий PHP-обработку загруженных файлов. Поправьте меня, если я ошибаюсь, но я считаю, что временные имена, сгенерированные PHP, не сохраняют расширение файла... - person Nathan H; 20.02.2014
comment
Я лично использую finfo(FILEINFO_MIME_TYPE) для определения типа пантомимы, который я использовал для передачи в AWS SDK. Работал нормально, пока я не переключился на новый SDK. - person Nathan H; 20.02.2014
comment
Это действительно странно. Отлично работает с aws-sdk-php-3.19.8, Ubuntu 14.04. PHP-5.5.9 - person ALex_hha; 28.09.2016

Я считаю, что более поздние версии API AWS требуют, чтобы тип контента был установлен напрямую, например.

$client->putObject([
       'Bucket'      => $sBucket,
       'Key'         => $sPath,
       'SourceFile'  => $sData,
       'ContentType' => $sMimeType]);
person Charlie Hileman    schedule 18.02.2021