4

My application is having images sent to it from mobile devices with the content-type "application/octet-stream".

I need to process these images using the GD library, which means I need to be able to create an image object from the data.

Typically, I have been using imagecreatefromjpeg, imagecreatefrompng, imagecreatefromgif, etc, to handle files uploaded from web forms, but these don't seem to work when coming to me as application/octet-stream.

Any ideas on how I can achieve my goal?

EDIT

Here is the code I use to create the image identifier...my handler works perfectly throughout my site, the only difference I can tell between my site and the data from the iOS is the content-type

public function open_image($path) {
        # JPEG:
        $im = @imagecreatefromjpeg($path);
        if ($im !== false) { $this->image = $im; return $im; }

        # GIF:
        $im = @imagecreatefromgif($path);
        if ($im !== false) { $this->image = $im; return $im; }

        # PNG:
        $im = @imagecreatefrompng($path);
        if ($im !== false) { $this->image = $im; return $im; }

        $this->error_messages[] = "Please make sure the image is a jpeg, a png, or a gif.";
        return false;
    }
johnnietheblack
  • 13,050
  • 28
  • 95
  • 133

3 Answers3

6

Easy :)

$image = imagecreatefromstring( $data );

Specifically:

$data = file_get_contents($_FILES['myphoto']['tmp_name']);
$image = imagecreatefromstring( $data );
Christian
  • 27,509
  • 17
  • 111
  • 155
  • HEYAAA, is the $data simply to be found as $_FILES['myphoto']['tmp_name']? – johnnietheblack May 09 '11 at 21:30
  • @johnnietheblack - Not exactly, but near enough: `$image = imagecreatefromstring( file_get_contents($_FILES['myphoto']['tmp_name']) );` – Christian May 09 '11 at 21:32
  • ahh, that makes sense...so the tmp file is basically just a "text file" with the string inside? (im obviously new to this aspect of data handling) – johnnietheblack May 09 '11 at 21:33
  • @johnnietheblack - The tmp file is probably binary (unless the uploaded image is an SVG), and `file_get_contents()` just gets the data. The `'tmp_file'` part just contains the file name as stored on the server. You can see this by using: `echo '
    '.print_r($_FILES,true).'
    ;` <- by the way, that's a very useful snippet for inspecting PHP variables.
    – Christian May 09 '11 at 21:36
0

you can use this function too. it not require any other dependency. and work perfectly for other types also.

function _getmime($file){
    if($info = @getimagesize($file)) {
        return image_type_to_mime_type($info[2]);
    } else {
        return mime_content_type($file);
    }
} 
Govind Totla
  • 1,128
  • 13
  • 16
0

I found this in the codeigniter forum a way to change the mime and it works, I suppose you can use for other frameworks as well, this is the link and this the code:

//if mime type is application/octet-stream (psp gives jpegs that type) try to find a   more specific mime type

$mimetype = strtolower(preg_replace("/^(.+?);.*$/", "\\1", $_FILES['form_field']  ['type'])); //reg exp copied from CIs Upload.php

if($mimetype == 'application/octet-stream'){
    $finfo = finfo_open(FILEINFO_MIME, '/usr/share/file/magic');
    if($finfo){
    $_FILES['form_field']['type'] = finfo_file($finfo, $_FILES['form_field']['tmp_name']);
    finfo_close($finfo);
    }
    else echo "finfo_open() returned false");
}  

Fileinfo extension needs to be installed on the server.

It worked for me.

jonaypelluz
  • 368
  • 4
  • 13