Yerel bir dosya olarak saklamak olmadan bir görüntü oluşturma

7 Cevap php

İşte benim durum - Ben bir kullanıcı yükledi görüntüden yeniden boyutlandırılmış bir jpeg görüntüsü oluşturmak ve sonra depolama için S3 göndermek istiyorum, ama diske boyutlandırılan jpeg yazma ve sonra S3 istek için yeniden önlemek için arıyorum.

Bir değişken kaydedilen biçimlendirilmiş görüntü veri JPEG, ile, tamamen bellekte bunu yapmanın bir yolu var mı?

7 Cevap

Eğer (ImageMagick, GD kullanılarak, ya da seçtiğiniz grafik kütüphanesi) bellekte JPEG var sonra, S3 bellekten nesneyi yüklemek gerekir.

Birçok PHP S3 sınıfları tek destek dosya yükleme gibi görünüyor, ama en bir Undesigned Burada sonra konum ne yapmak gibi görünüyor -

// 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);

If you're using GD instead, you can use imagecreatefromstring to read an image in from a stream, but I'm not sure whether you can get the size of the resulting object, as required by s3->inputResource above - getimagesize returns the height, width, etc, but not the size of the image resource.

PHP kullanarak Çoğu kişi ya ImageMagick veya Gd2 seçin

Ben Imagemagick hiç kullanmadım; GD2 yöntemi:

<?php

// assuming your uploaded file was 'userFileName'

if ( ! is_uploaded_file(validateFilePath($_FILES[$userFileName]['tmp_name'])) ) {
    trigger_error('not an uploaded file', E_USER_ERROR);
}
$srcImage = imagecreatefromjpeg( $_FILES[$userFileName]['tmp_name'] );

// Resize your image (copy from srcImage to dstImage)
imagecopyresampled($dstImage, $srcImage, 0, 0, 0, 0, RESIZED_IMAGE_WIDTH, RESIZED_IMAGE_HEIGHT, imagesx($srcImage), imagesy($srcImage));

// Storing your resized image in a variable
ob_start(); // start a new output buffer
  imagejpeg( $dstImage, NULL, JPEG_QUALITY);
  $resizedJpegData = ob_get_contents();
ob_end_clean(); // stop this output buffer

// free up unused memmory (if images are expected to be large)
unset($srcImage);
unset($dstImage);

// your resized jpeg data is now in $resizedJpegData
// Use your Undesigned method calls to store the data.

// (Many people want to send it as a Hex stream to the DB:)
$dbHandle->storeResizedImage( bin2hex($resizedJpegData) );
?>

Umarım bu yardımcı olur.

Imagemagick kütüphane yapmak izin verir. this bunun için etrafında bir (hatta example code o sayfada ne yapmak istediğinizi için ;) var) gibi PHP sarma bol var

Eğer ConroyP ve Imagick'teki sözünü S3 kütüphanesini kullanıyorsanız oldukça geç bu bir oyun, ama getImageBlob bir dize döndürür aslında nedeniyle putObjectString () yöntemi yerine putObject () kullanmalısınız. Sonunda benim için çalıştı örnek:

$headers = array(
    'Content-Type' => 'image/jpeg'
);
$s3->putObjectString($im->getImageBlob(), $bucket, $file_name, S3::ACL_PUBLIC_READ, array(), $headers);

Ben umarım başkası yardımcı olur, bu bir biraz ile mücadele!

Bu GD kütüphanesini ve tamponu kullanılarak yapılabilir. Ben bu diğer yöntemlerle karşılaştırıldığında ne kadar etkili bilmiyorum, ama bu dosya açık oluşturulmasını gerektirmez.

//$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

Bu eski bir konu olduğunu biliyoruz, ama bugün bu konuda kafamı duvara vurarak biraz zaman geçirdim, ve ben bir sonraki adam için benim çözüm burada yakalamak düşündüm.

Bu yöntem kullanır AWS SDK for PHP 2 ve resim boyutlandırmak için GD (Imagick da kolayca kullanılabilir).

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);

Maye GD library ile.

Bir görüntünün bir bölümünü kopyalamak ve yeniden boyutlandırmak için bir işlevi vardır. Tabii bir parçası tüm görüntü, sadece yeniden boyutlandırmak olacağını yol olabilir.

bkz imagecopyresampled