Erro ao escrever para o arquivo de imagem do PHP

Estou tentando escrever para um arquivo de imagem de um blob.

if($_POST['logoFilename'] != 'undefined'){ $logoFile = fopen($_POST['logoFilename'], 'w') or die ("Cannot create ".$_POST['logoFilename']); fwrite($logoFile, $_POST['logoImage']); fclose($logoFile); } 

No snippet de código anterior, $_POST['logoImage'] é um BLOB. O arquivo está corretamente escrito no diretório raiz, porém o arquivo não pode ser aberto. No ubuntu 11.04 recebo o seguinte erro:

 Error interpreting JPEG image file (Not a JPEG file: starts with 0x64 0x61). 

O BLOB exibe corretamente se eu crie um img e defina seu src = blob

Incluído abaixo é o primeiro trecho do BLOB:

 data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEBLAEsAAD/2wBDAAgGBgcGBQgHBwcJCQ 

Seu “Blob” é realmente um URI de dados :

 data:[][;charset=][;base64], 

Como você só quer a parte de dados decodificada, você precisa fazer

 file_put_contents( 'image.jpg', base64_decode( str_replace('data:image/jpeg;base64,', '', $blob) ) ); 

Mas, como o PHP suporta nativamente dados: // streams, você também pode fazer (obrigado @NikiC)

 file_put_contents('image.jpg', file_get_contents($blob)); 

Se o acima não funcionar, você pode tentar com o GDlib:

 imagejpg( imagecreatefromstring( base64_decode( str_replace('data:image/jpeg;base64,', '', $blob) ) ), 'image.jpg' ); 

Se é realmente um blob, você pode querer tentar usar o modo “wb” como o segundo parâmetro para sua chamada fopen ().

EDITAR : Você também pode considerar apenas usar file_put_contents () , que é binário-seguro.

Se for um controle de upload de arquivo, $_POST não conterá a informação. Você está procurando movimentação de uploads de arquivos com $_FILES . (E mais especificamente, move_uploaded_file )

Dada a nova atualização, tente o seguinte:

  // // Export a image blob to a file using either the specific image name // @blob : The actual image blob // @fileName : Can be the explicit name (with an extension) or this can be // just a generic file name and the extension (based on data // type) will be appended automatically. This can also include // path information. // Exmaples: // storeBlob('data:image/png;base64,...', 'myimage'); :: saves as myimage.png // storeBlob('data:image/jpg;base64,...', 'img/new.jpg'); :: saves as img/new.jpg function storeBlob($blob, $fileName) { $blobRE = '/^data:((\w+)\/(\w+));base64,(.*)$/'; if (preg_match($blobRE, $blob, $m)) { $imageName = (preg_match('/\.\w{2,4}$/', $fileName) ? $fileName : sprintf('%s.%s', $fileName, $m[3])); return file_put_contents($imageName,base64_decode($m[4])); } return false; // error } 

Esta function irá salvar dados uri para arquivo:

 function saveDataUri($blob, $filename = null) { // generate unique name basing on content if (empty($filename)) { $filename = md5($blob); } // parse data URI $semiPos = strpos($blob, ';', 5); $comaPos = strpos($blob, ',', 5); $mime = substr($blob, 5, $semiPos - 5); $data = substr($blob, $comaPos + 1); $isEncoded = strpos(substr($blob, $semiPos, $comaPos), 'base64'); if ($isEncoded) { $data = base64_decode($data); } // save image data to file switch ($mime) { case 'image/png': $ext = 'png'; break; case 'image/gif': $ext = 'gif'; break; case 'image/jpg': case 'image/jpeg': default: $ext = 'jpg'; break; } $outFile = $filename . '.' . $ext; $funcName = 'image' . $ext; $result = $funcName(imagecreatefromstring($data), $outFile); if ($result) { return $outFile; } return $result; } 

Uso no seu caso:

 // some_validation($_POST); $filename = saveDataUri($_POST['logoImage']); echo 'http://img.bestphpide.com/file-writing/' . $filename . '';