Search code examples
phpamazon-web-servicesaws-php-sdk

How to add ContentType to AWS PHP SDK MultiPartUploader


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!


Solution

  • 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!