2013-09-20 1 views
0

У меня возникают проблемы с настройкой опции «Метаданные» при загрузке файлов на Amazon S3 с использованием AWS SDK PHP v2. documentation that I'm reading для метода загрузки() говорится о том, что 5-й параметр является массивом вариантов ...Метаданные с настройками Amazon S3 не работают с использованием AWS SDK PHP v2 upload()

* $ опции Пользовательские параметры, используемые при выполнении команд: - параметры: Пользовательские параметры для использования с загрузкой. Параметры должны отображаться в параметрах операции PutObject или InitiateMultipartUpload. - min_part_size: Минимальный размер для каждой загруженной части, когда выполняет многостраничную загрузку. - параллелизм: максимальное количество одновременных многостраничных загрузок . - before_upload: Обратный вызов для вызова перед каждой многостраничной загрузкой. Обратный вызов получит объект жрать \ Common \ Event с контекстом. *

Мой upload() код выглядит следующим образом ..

$upload = $client->upload(
    '<BUCKETNAME>', 
    'metadatatest.upload.jpg', 
    fopen('metadatatest.jpg','r'), 
    'public-read', 
    array('Metadata' => array(
    'SomeKeyString' => 'SomeValueString' 
)) 
); 

... и нет мета данных устанавливается после загрузки.

Если же я использую putObject()as documented here, который я предполагаю, это метод «нижний уровень» по сравнению с upload() ...

$putObject = $client->putObject(
    array(
    'Bucket' => '<BUCKETNAME>', 
    'Key' => 'metadatatest.putobject.jpg', 
    'Body' => file_get_contents('metadatatest.jpg'), 
    'ACL' => 'public-read', 
    'Metadata' => array(
     'SomeKeyString' => 'SomeValueString' 
    ) 
) 
); 

мета данные успешно возвращается, когда я называю getObject() или просмотреть файл непосредственно в мой браузер при загрузке с помощью putObject()

$getObject = $client->getObject(
    array(
    'Bucket' => '<BUCKETNAME>', 
    'Key' => 'metadatatest.putobject.jpg' 
) 
); 

Я предпочел бы использовать метод $client->upload() в документации говорится

Загрузите файл, поток или строку в ведро. Если размер загрузки превышает указанный порог, загрузка будет выполняться с использованием параллельных многостраничных загрузок .

Я не уверен, что я пропустил?

+2

Кажется, что это может быть ошибка. Сообщите об этом по адресу https://github.com/aws/aws-sdk-php/issues. Я бы также упомянул размер загружаемых объектов, потому что это может быть только проблема с многостраничными загрузками. –

+0

@JeremyLindblom Cheers Я дам этот проспект выстрела. Файл был довольно маленьким, так как 'putObject()' обрабатывает его в порядке. – Scuzzy

+0

@JeremyLindblom Это не ошибка кода, а проблема с написанием документации для этого метода. Я также обнаружил, что это запутывает, пока я не посмотрел на фактический исходный код. Возможно, вы, ребята, можете улучшить его с помощью некоторых примеров, которые прояснят вещи. – dcro

ответ

1

Нет никакой разницы в использовании upload() или putObject(), если вы не делаете многостраничные загрузки. Вы можете посмотреть на AWS PHP SDK source code, но в основном метод upload просто вызывает putObject так:

// Perform a simple PutObject operation 
return $this->putObject(array(
    'Bucket' => $bucket, 
    'Key' => $key, 
    'Body' => $body, 
    'ACL' => $acl 
) + $options['params']); 

Это не очень понятно, в документации SDK, но вам нужно послать последний параметр как массив с ключ params и его значение представляет собой второй массив с Metadata ключом и значением, как это:

$upload = $client->upload(
    '<BUCKETNAME>', 
    'metadatatest.upload.jpg', 
    fopen('metadatatest.jpg','r'), 
    'public-read', 
    array('params' => array(
     'Metadata' => array(
      'SomeKeyString' => 'SomeValueString' 
    ))) 
); 

Однако я вы могли бы просто использовать вызов putObject, чтобы достичь того же.

+0

Фантастический, это объясняет это отлично @dcro, я фактически перешел на использование «UploadBuilder :: newInstance()», что немного помогло с ясностью. – Scuzzy

+0

На самом деле ... Я просто посмотрел на исходный код, с которым вы связались, и он будет вызывать 'putObject()', когда его внутри ограничений 'if ($ body-> getSize() <$ options ['min_part_size'])' в противном случае он выполнит вызов «UploadBuilder :: newInstance», поэтому с разъяснением массива 'params' я теперь могу использовать метод' upload() '. – Scuzzy

+1

Это правильно. Если вы не укажете значение для 'min_part_size', значение по умолчанию - 5 МБ. – dcro

Смежные вопросы