这是我的情况 - 我想从用户上传的图像创建一个调整大小的jpeg图像,然后将其发送到S3进行存储,但我希望避免将调整大小的jpeg写入磁盘,然后为S3请求重新加载它.
有没有办法在内存中完全执行此操作,图像数据JPEG格式化,保存在变量中?
大多数使用PHP的人选择ImageMagick 或Gd2
我从未使用过Imagemagick; Gd2方法:
storeResizedImage( $resizedJpegData ); ?>
希望这可以帮助.
这可以使用GD库和输出缓冲来完成.我不知道这与其他方法相比有多高效,但它不需要显式创建文件.
//$image contains the GD image resource you want to store ob_start(); imagejpeg($image); $jpeg_file_contents = ob_get_contents(); ob_end_clean(); //now send $jpeg_file_contents to S3
一旦你在内存中使用了JPEG(使用ImageMagick,GD或你选择的图形库),你就需要将对象从内存上传到S3.
许多PHP S3类似乎只支持文件上传,但Undesigned的那个似乎做了我们在这里的事情 -
// Manipulate image - assume ImageMagick, so $im is image object $im = new Imagick(); // Get image source data $im->readimageblob($image_source); // Upload an object from a resource (requires size): $s3->putObject($s3->inputResource($im->getimageblob(), $im->getSize()), $bucketName, $uploadName, S3::ACL_PUBLIC_READ);
如果您正在使用GD,您可以使用
imagecreatefromstring从流中读取图像,但我不确定您是否可以获得结果对象的大小,s3->inputResource
如上所述 - getimagesize返回高度,宽度,等,但不是图像资源的大小.
这个游戏的游戏相当晚,但如果你使用ConroyP和Imagick提到的S3库,你应该使用putObjectString()方法而不是putObject(),因为getImageBlob返回一个字符串.最终为我工作的例子:
$headers = array( 'Content-Type' => 'image/jpeg' ); $s3->putObjectString($im->getImageBlob(), $bucket, $file_name, S3::ACL_PUBLIC_READ, array(), $headers);
我有点挣扎这个,希望它可以帮助别人!
意识到这是一个古老的线索,但今天我花了一些时间在墙上撞到墙上,并且认为我会在这里为下一个人抓住我的解决方案.
此方法使用AWS SDK for PHP 2和GD进行图像调整大小(Imagick也可以轻松使用).
require_once('vendor/aws/aws-autoloader.php'); use Aws\Common\Aws; define('AWS_BUCKET', 'your-bucket-name-here'); // Configure AWS factory $aws = Aws::factory(array( 'key' => 'your-key-here', 'secret' => 'your-secret-here', 'region' => 'your-region-here' )); // Create reference to S3 $s3 = $aws->get('S3'); $s3->createBucket(array('Bucket' => AWS_BUCKET)); $s3->waitUntilBucketExists(array('Bucket' => AWS_BUCKET)); $s3->registerStreamWrapper(); // Do your GD resizing here (omitted for brevity) // Capture image stream in output buffer ob_start(); imagejpeg($imageRes); $imageFileContents = ob_get_contents(); ob_end_clean(); // Send stream to S3 $context = stream_context_create( array( 's3' => array( 'ContentType'=> 'image/jpeg' ) ) ); $s3Stream = fopen('s3://'.AWS_BUCKET.'/'.$filename, 'w', false, $context); fwrite($s3Stream, $imageFileContents); fclose($s3Stream); unset($context, $imageFileContents, $s3Stream);