casusbelli
casusbelli

Reputation: 463

Upload resized image on amazon S3 with PHP SDK

I have a script wich resize and crop an image and I would like to upload the image on my amazon S3 on the fly.

The problem is that I get an error message when I try to run my script because I guess the sourcefile is not recognized as a direct path from the disk ($filepath). Do you have any idea to get through this situation?

Fatal error: Uncaught exception 'Aws\Common\Exception\InvalidArgumentException' with message 'You must specify a non-null value for the Body or SourceFile parameters.' in phar:///var/www/submit/aws.phar/Aws/Common/Client/UploadBodyListener.php:...

$myResizedImage = imagecreatetruecolor($width,$height);
        imagecopyresampled($myResizedImage,$myImage,0,0,0,0, $width, $height, $origineWidth, $origineHeight);

$myImageCrop = imagecreatetruecolor(612,612);
        imagecopy( $myImageCrop, $myResizedImage, 0,0, $posX, $posY, 612, 612);

//Save image on Amazon S3

     require 'aws.phar';

use Aws\S3\S3Client;
use Aws\S3\Exception\S3Exception;

$bucket = 'yol';
$keyname = 'image_resized';                    
$filepath = $myImageCrop;

// Instantiate the client.
$s3 = S3Client::factory(array(
    'key'    => 'private-key',
    'secret' => 'secrete-key',
    'region' => 'eu-west-1'

    ));

try {
    // Upload data.
    $result = $s3->putObject(array(
        'Bucket' => $bucket,
        'Key'    => $keyname,
        'SourceFile'   => $filepath,
        'ACL'    => 'public-read',
        'ContentType' => 'image/jpeg'
    ));

    // Print the URL to the object.
    echo $result['ObjectURL'] . "\n";
} catch (S3Exception $e) {
    echo $e->getMessage() . "\n";
}

Upvotes: 3

Views: 5248

Answers (3)

logic
logic

Reputation: 319

You need to convert your image resource to an actual string containing image data. You can use this function to achieve this:

function image_data($gdimage)
{
    ob_start();
    imagejpeg($gdimage);
    return(ob_get_clean());
}

Upvotes: 3

casusbelli
casusbelli

Reputation: 463

     require 'aws.phar';

use Aws\S3\S3Client;
use Aws\S3\Exception\S3Exception;

$bucket = 'kkkk';
$keyname = 'test';
// $filepath should be absolute path to a file on disk  

$newFielName = tempnam(null,null); // take a llok at the tempnam and adjust parameters if needed
imagejpeg($myImageCrop, $newFielName, 100); // use $newFielName in putObjectFile()

$filepath = $newFielName;

// Instantiate the client.
$s3 = S3Client::factory(array(
    'key'    => 'jjj',
    'secret' => 'kkk',
    'region' => 'eu-west-1'

    ));

try {
    // Upload data.
    $result = $s3->putObject(array(
        'Bucket' => $bucket,
        'Key'    => $keyname,
        'SourceFile'   => $filepath,
        'ACL'    => 'public-read',
        'ContentType' => 'image/jpeg'
    ));

    // Print the URL to the object.
    echo $result['ObjectURL'] . "\n";
} catch (S3Exception $e) {
    echo $e->getMessage() . "\n";
}

Upvotes: 1

user149341
user149341

Reputation:

You are setting the SourceFile of the upload to $filepath, which is assigned from $myImageCrop = imagecreatetruecolor(...). As such, it's not actually a path at all — it's a GD image resource. You can't upload these to S3 directly.

You'll need to either write that image out to a file (using e.g. imagejpeg() + file_put_contents()), or run the upload using data in memory (again, from imagejpeg() or similar).

Upvotes: 2

Related Questions