Creating an image without storing it as a local file

前端 未结 8 999
时光取名叫无心
时光取名叫无心 2020-12-01 08:45

Here\'s my situation - I want to create a resized jpeg image from a user uploaded image, and then send it to S3 for storage, but am looking to avoid writing the resized jpeg

8条回答
  •  粉色の甜心
    2020-12-01 09:19

    I encounter the same problem, using openstack object store and php-opencloud library.

    Here is my solution, which does not use the ob_start and ob_end_clean function, but store the image in memory and in temp file. The size of the memory and the temp file may be adapted at runtime.

    // $image is a resource created by gd2
    var_dump($image); // resource(2) of type (gd)
    
    // we create a resource in memory + temp file 
    $tmp = fopen('php://temp', '$r+');
    
    // we write the image into our resource
    \imagejpeg($image, $tmp);
    
    // the image is now in $tmp, and you can handle it as a stream
    // you can, then, upload it as a stream (not tested but mentioned in doc http://docs.aws.amazon.com/aws-sdk-php/v2/guide/service-s3.html#uploading-from-a-stream)
    $s3->putObject(array(
       'Bucket' => $bucket,
       'Key'    => 'data_from_stream.txt',
       'Body'   => $tmp
    ));
    
    // or, for the ones who prefers php-opencloud :
    $container->createObject([
        'name'  => 'data_from_stream.txt',
        'stream' => \Guzzle\Psr7\stream_for($tmp),
        'contentType' => 'image/jpeg'
    ]);
    

    About php://temp (from the official documentation of php):

    php://memory and php://temp are read-write streams that allow temporary data to be stored in a file-like wrapper. The only difference between the two is that php://memory will always store its data in memory, whereas php://temp will use a temporary file once the amount of data stored hits a predefined limit (the default is 2 MB). The location of this temporary file is determined in the same way as the sys_get_temp_dir() function.

    The memory limit of php://temp can be controlled by appending /maxmemory:NN, where NN is the maximum amount of data to keep in memory before using a temporary file, in bytes.

提交回复
热议问题