使用PHP SDK在Amazon S3上上传调整大小后的图像

3
我有一个脚本,可以调整和裁剪图像,并希望能够即时将图像上传到我的Amazon S3。但是,当我尝试运行脚本时,出现了错误信息,我猜测是因为源文件($filepath)不被识别为直接从磁盘中获取的路径。你有什么想法来解决这个问题吗?
以下是错误信息: 致命错误:未捕获异常 'Aws\Common\Exception\InvalidArgumentException',错误消息为 ' 您必须为Body或SourceFile参数指定非空值。' 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";
}

你能发一下完整的代码吗?我遇到了相同的错误。 - gnganapath
3个回答

3
您需要将图像资源转换为包含图像数据的字符串。您可以使用此函数来实现此目的:
function image_data($gdimage)
{
    ob_start();
    imagejpeg($gdimage);
    return(ob_get_clean());
}

对于那些不想保存文件的人来说,这是一个好的解决方案。使用'Body'=>image_data($img)代替SourceFile - kmoney12

2
您正在将上传的SourceFile设置为$filepath,它是从$myImageCrop = imagecreatetruecolor(...)分配的。因此,它实际上不是路径,而是GD图像资源。您无法直接将这些资源上传到S3。
您需要将该图像写入文件(使用例如imagejpeg()+file_put_contents()),或者在内存中运行上传(同样来自imagejpeg()或类似函数)。

这意味着我需要将我的图像上传到我的EC2实例,然后再上传到S3吗? - casusbelli
我尝试了 $filepath = imagejpeg($myImageCrop); 但没有成功。 - casusbelli

1
     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";
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接