Jump to content

PHP and dealing with PNG image file type.


Go to solution Solved by FalsAlarm,

Recommended Posts

Hello

 

I have a flash actionscript 3 project that creates a PNG image out of any Flash MovieClip. inside my as3 code i have this code which creates a successful POST to my php script. My question is how do I take the byte array variable and write it to the filesystem as a PNG image.

 
            //prepare data to send to php

            var bitmapData:BitmapData = graffitiGalore.drawingTab.main.canvas.drawing(true);

            

            var byteArray:ByteArray = PNGEncoder.encode(bitmapData);

            

            //create a parameters object

            var parametersObject:Object = new Object();

            

            //create a POST variable to be sent to php

            parametersObject.byte_array = byteArray;

            

            //create a new PHPRequest and pass in the parametersObject

            var phpRequest:PHPRequest = new PHPRequest();

            phpRequest.makeRequest(ApplicationConstants.SAVE_IMAGE, parametersObject);

            

            phpRequest.addEventListener(Event.COMPLETE, onCompleteSaveImage); );
 

Ok, so in php i'll have access to $_POST['byte_array'] variable which contains the PNG image byte array as data. How do I take this data and write a real PNG image to the filesystem? I'm new to lots of php stuff still.

 

 

 

file_put_contents

 

Depending on your system you may need to give PHP the permissions to create files in whatever folder: with *nix you can chmod 0777 (not optimal but gets you working quickly) and on Windows it... depends. on things.

file_put_contents

 

Depending on your system you may need to give PHP the permissions to create files in whatever folder: with *nix you can chmod 0777 <folder> (not optimal but gets you working quickly) and on Windows it... depends. on things.

Alright, I tried your idea. Below is a PHP object that I wrote to handle the SaveImage feature of my Flash application.

 

<code>

<?php
error_reporting(E_ALL);
ini_set('display_errors','On');
 
$newUser = new SaveImage();
 
class SaveImage
{
        //a reference to thd facebook object
        public $facebook;
       
        //holds the app users uid
        public $id;
       
        //holds the selected users uid
        public $targetUID;
       
        //the byte array data
        public $byteArray;
       
        //holds a reference to the db connection
        public $connection;
       
        //the output that gets returned to flash
        public $outputObject;
       
        public function __construct()
        {
                //include the database connection
                include 'database.php';
               
                //include the php sdk
                //include the facebook sdk library
                require_once('facebook.php');
               
                //instantiate a new Facebook Object, you must replace your APP_ID with your real apps app id. do the same for the secret.
                $this->facebook = new Facebook(array(
                                'appId' =>      'removed',
                                'secret'        =>      'removed',
                                'cookie'        =>      true));
               
                //store a reference to the db connection in this object
                $this->connection = $connection;
 
                //initialize the outputObject          
                $this->outputObject = new stdClass();
               
                //attempt to get the current user
                $this->id = mysqli_real_escape_string($this->connection, $this->facebook->getUser());
               
                $this->byteArray = $this->getByteArray();
               
                $this->targetUID = $this->getTargetUID();
               
                if($this->targetUID != NULL)
                {
                        //continue
                        if(isset($this->byteArray))
                        {
                                //create a filepatch where to put the file.
                                $filename = "wallImages/" . $this->targetUID . "_wallImage.png";
                               
                                //use file put contents to put the file
                                $result = file_put_contents($filename, $this->byteArray);
                               
                                $this->outputObject->result = "Sucess!";
                        }
                }
               
                echo json_encode($this->outputObject);
        }
        public function getByteArray()
        {
                return $_POST['byte_array'];
        }
        public function getTargetUID()
        {
                if(strlen($_POST['selectedWall']) > 0)
                {
                        return mysqli_real_escape_string($this->connection, $_POST['selectedWall']);
                } else
                {
                        return NULL;
                }
        }
}
 
?>

</code>

 

It's kind of odd, but i'm getting the final output PNG file created, but it's only 1kb in size and doesn't open up in any image editors. It says the data might be corrupted when I try to open it.

More specifically, imagecreatefromstring and imagepng

 

Something along the lines of this:

 

<?php

$image = imagecreatefromstring($_POST['byte_array']);
imagepng($image,'filename.png');

?>
Though FYI, simply using file_put_contents should have worked. If it didn't work, that means your data isn't right. Perhaps it needs to be base64_encoded or decoded? IOW I suspect you may run into issues even using these GD functions, because file_put_contents should have worked. But anyways, using the GD functions is safer since it offers a level of validation that it's actually real image data, before writing to your server..
  • Solution

Issue Resolved.

 

The problem is that since I was POSTING the data to php, i needed to Base64 encode the byte array before hand inside my Actionscript 3. Then on the receiving end php file, I needed to Base64_decode($byte_array)

 

which works perfectly, the Drawing is sent from my flash GUI to the server backend and it works!!! thanks to everyone that posted

This thread is more than a year old. Please don't revive it unless you have something important to add.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.