0
votes

In our application a user is allowed to upload an image of dimension 1024 X 768(around 150 KB).
When the user upload an image following things happen :

1)Image uploaded on temporary directory
2)Crop the Image into four different sizes.
3)Upload the original image and its cropped images on amazon s3 server.

The above process prove to be time consuming for the user.

After profiling with xdebug it seems that 90% of the time is being consumed by uploading image on amazon s3. I am using given below method to save image in amazon s3 bucket

public function saveInBucket( $sourceLoc,$bucketName = '', $destinationLoc = '' ) {        
   if( $bucketName <> '' && $destinationLoc <> '' && $sourceLoc <> '') {   
        $s3 = new AmazonS3();
        $response = $s3->create_object( $bucketName.'.xyz.com',$destinationLoc, array(
                                            'contentType' => 'application/force-download',
                                            'acl' => AmazonS3::ACL_PUBLIC,
                                            'fileUpload' => $sourceLoc
                                            )
                                       );

        if ( ( int ) $response->isOK() ) {
            return TRUE;
        }

        $this->ErrorMessage = 'File upload operation failed,Please try again later';
        return FALSE;
    }
    return FALSE;
}     

I also thought of uploading image directly to amazon s3 but i can not do that since i also have to crop image into 4 different sizes
How can i speed up or improve image management process.

1

1 Answers

1
votes

This happened to me before. What you can do is:

When you resize your image, you have to convert to string. I was using WideImage class.

Example:

    $image = WideImage::load($_FILES["file"]['tmp_name']);
    $resized = $image->resize(1024);
    $data = $resized->asString('jpg');

And then when you're uploading on Amazon, you have to use the param 'body' instead of 'fileUpload'.

Example:

    $response = $s3->create_object( $bucketName.'.xyz.com',$destinationLoc, array(
                                        'contentType' => 'application/force-download',
                                        'acl' => AmazonS3::ACL_PUBLIC,
                                        'body' => $data
                                        )
                                   );

I hope that helps.