Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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!

like image 234
Daniel Avatar asked Oct 27 '15 16:10

Daniel


Video Answer


1 Answers

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!

like image 166
Daniel Avatar answered Sep 28 '22 03:09

Daniel