Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Specify Content-Type in AWS PHP's upload function

I am migrating my code from AWS PHP SDK1 to SDK2 (https://github.com/aws/aws-sdk-php).

I have an image uploader. In my previous version, I would specify the Content-Type of my image like so:

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

This is my new version:

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

I've tried different spellings of ContentType, in the S3 site it modifies the name to look like 'x-amz-meta-contenttype', while the value of 'Content-Type' is the default 'binary/octet-stream'.

I've also tried using the EntityBody feature, but same results:

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

How do I set the content-type in this new API?

EDIT: I see somewhere in the documentation:

The AWS SDK for PHP will attempt to automatically determine the most appropriate Content-Type header used to store the object. If you are using a less common file extension and your Content-Type header is not added automatically, you can add a Content-Type header by passing a ContentType option to the operation.

First off, I am uploading simple images, yet according to my S3 dashboard, they are uploaded as 'binary/octet-stream'. About their second point, I've tried many combinations of arrays with 'ContentType' I'm not sure why it's not working...

like image 235
Nathan H Avatar asked Feb 19 '14 21:02

Nathan H


Video Answer


2 Answers

At the end, this set of options worked:

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

No need for Metadata

like image 157
Nathan H Avatar answered Oct 13 '22 01:10

Nathan H


  1. Well, using AWS\S3\S3Client::putObject() directly would definitely give you the control you need.

  2. File extensions need to be lowercase for the automatic detection to work.

  3. You can find the list of supported mime types in Guzzle\Http\Mimetypes.

like image 34
Ryan Parman Avatar answered Oct 12 '22 23:10

Ryan Parman