How to add ContentType to AWS PHP SDK MultiPartUploader
Asked Answered
R

1

6

I have searched high and low for how to add a simple ContentType metadata to a MultiPartUploader in AWS PHP SDK. The docs specifically mention how to do it for PutObject, but have no mention of how to do it with a MultiPartUploader.

I have tried every method I could find online, but nothing is working and my file is always getting set to application/octet-stream.

Does anyone have any experience with this? Here is my code:

$uploader = new MultipartUploader($this->s3, $local_path, [
    'bucket'      => env('AWS_BUCKET'),
    'key'         => $path .'/'. $filename,
    'contentType' => 'video/mp4',  //  have tried this
    'metaData'    => [             //  have tried this (all well as all variations of caps)
        'contentType' => 'video/mp4',
    ]
]);

do 
{
    try 
    {
        $result = $uploader->upload();
    } 
    catch (MultipartUploadException $e) 
    {
        $uploader = new MultipartUploader($this->s3, $local_path, [
            'state' => $e->getState(),
        ]);
    }
} 
while (!isset($result));

After reading through the MultiPartUploader class, it looks like the ContentType should be automatically set, but it is not being set.

I am using v3 of the SDK

Any advice would be greatly appreciated!

Rillis answered 27/10, 2015 at 16:46 Comment(0)
R
11

I figured it out right after I posted this question! I will post the answer so that if anyone else hits this problem, they can look here.

The page I linked in the question has the answer, just not specifically related to ContentType!

Here is the working code:

$uploader = new \Aws\S3\MultipartUploader($this->s3, $local_path, [
    'bucket'      => env('AWS_BUCKET'),
    'key'         => $path .'/'. $filename,
    'before_initiate' => function(\Aws\Command $command) use ($mime_type)  //  HERE IS THE RELEVANT CODE
    {
        $command['ContentType'] = $mime_type;  //  video/mp4
    }
]);

do 
{
    try 
    {
        $result = $uploader->upload();
    } 
    catch (\Aws\Exception\MultipartUploadException $e) 
    {
        $uploader = new \Aws\S3\MultipartUploader($this->s3, $local_path, [
            'state' => $e->getState(),
        ]);
    }
} 
while (!isset($result));

return $result ? $result['ObjectURL'] : null;

I hope this helps someone else in the future!

Rillis answered 27/10, 2015 at 16:55 Comment(1)
I was about to respond with a similar answer (and a link to docs.aws.amazon.com/aws-sdk-php/v3/guide/service/…). You should accept this answer.Keithakeithley

© 2022 - 2024 — McMap. All rights reserved.