Файлы Amazon S3, загруженные с помощью AWS SDK для PHP, всегда являются «application / octet-stream»? - PullRequest
5 голосов
/ 07 февраля 2012

В соответствии с документами , contentType является необязательным и будет пытаться определить правильный тип MIME на основе расширения файла . Тем не менее, он никогда не угадывал mime-тип и по умолчанию всегда имеет значение application / octet-stream

Вот мой код:

$s3 = new AmazonS3();

$opt = array(   'fileUpload'    => $_FILES['file']['tmp_name'],
                'storage'       => Amazons3::STORAGE_REDUCED);

$r = $s3->create_object('mybucket', $_FILES['file']['name'], $opt);

Вот скриншот моей консоли AWS:

enter image description here

Как вы на самом деле автоматически устанавливаете правильный тип контента без установки опции contentType, или вам действительно нужно устанавливать его вручную?

Дополнительная информация: Если я загружаю файл с консоли (который я изначально загружал через SDK), а затем загружаю его снова с помощью консоли, устанавливается соответствующий тип содержимого (например, image / gif для файлов GIF вместо application / октет-поток) * * тысяча двадцать-одна

Ответы [ 2 ]

6 голосов
/ 10 февраля 2012

Попробуйте добавить ключ «contentType» в ваш массив опций при создании объекта и использовать «body» вместо «fileUpload».Например:

$s3->create_object('MY_BUCKET', 'xml_file.xml', array(
                                        'body' => '<xml>Valid xml content</xml>',
                                        'contentType' => 'text/xml'
                                    ));

Успешно создает файл с типом содержимого text / xml.Как я знаю, Content-Type не устанавливается автоматически при загрузке через SDK.Но в чем проблема прореживания MIME-типа со стороны PHP и установки свойства 'contentType'?

1 голос
/ 18 июля 2012

Я только что столкнулся с такой ситуацией, когда при загрузке некоторых файлов тип контента не обнаруживался автоматически.Я не мог понять, в чем причина, пока не прошел код, наблюдая за выполнением SDK.Я обнаружил, что функция CFMimeTypes :: get_mimetype (), которая используется для автоматического определения Content-Type, использует сравнение с учетом регистра для определения типа MIME.Из-за этого будут соответствовать только строчные расширения.Если расширение вашего файла имеет верхний или смешанный регистр, то оно не будет совпадать с MIME-типом application / octet-stream и отступать от него.

Чтобы исправить, измените строку:

'fileUpload'    => $_FILES['file']['tmp_name']

на

'fileUpload'    => strtolower( $_FILES['file']['tmp_name'] )

Я использую SDK v 1.5.8.2, но никаких изменений в этом обнаружении не ожидается в выпусках 1.5.9 или 1.5.10, которые оба вышли вна прошлой неделе.Я считаю это ошибкой и буду регистрировать ее как таковую.

...