Specify Content-Type in AWS PHP's upload funct

2019-02-14 19:17发布

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...

2条回答
ゆ 、 Hurt°
2楼-- · 2019-02-14 19:41
  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.

查看更多
3楼-- · 2019-02-14 19:47

At the end, this set of options worked:

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

No need for Metadata

查看更多
登录 后发表回答