Я пытаюсь записать файл изображения из blob.
if($_POST['logoFilename'] != 'undefined'){ $logoFile = fopen($_POST['logoFilename'], 'w') or die ("Cannot create ".$_POST['logoFilename']); fwrite($logoFile, $_POST['logoImage']); fclose($logoFile); }
В предыдущем фрагменте кода $_POST['logoImage']
является BLOB. Файл правильно записан в корневой каталог, однако файл не может быть открыт. В Ubuntu 11.04 я получаю следующую ошибку:
Error interpreting JPEG image file (Not a JPEG file: starts with 0x64 0x61).
BLOB правильно отображает, если я создаю img и задаю его src = blob
Ниже приведен первый фрагмент BLOB:
data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEBLAEsAAD/2wBDAAgGBgcGBQgHBwcJCQ
Ваш «Blob» – это действительно URI данных :
data:[<MIME-type>][;charset=<encoding>][;base64],<data>
Поскольку вам нужна только часть декодированных данных, вам нужно сделать
file_put_contents( 'image.jpg', base64_decode( str_replace('data:image/jpeg;base64,', '', $blob) ) );
Но поскольку PHP изначально поддерживает данные: // потоки, вы также можете сделать (спасибо @NikiC)
file_put_contents('image.jpg', file_get_contents($blob));
Если выше не работает, вы можете попробовать GDlib:
imagejpg( imagecreatefromstring( base64_decode( str_replace('data:image/jpeg;base64,', '', $blob) ) ), 'image.jpg' );
Если это действительно капля, вы можете попробовать использовать режим «wb» в качестве второго параметра для вашего вызова fopen ().
EDIT : Вы можете также рассмотреть возможность использования file_put_contents () , который является двоичным.
Если это элемент управления загрузкой файлов, $_POST
не будет содержать информацию.Вы ищете обработку файлов с помощью $_FILES
.(И более конкретно, move_uploaded_file )
Учитывая новое обновление, попробуйте следующее:
// // 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 }
Эта функция будет сохранять данные uri в файл:
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; }
Использование в вашем случае:
// some_validation($_POST); $filename = saveDataUri($_POST['logoImage']); echo '<img src="' . $filename . '" alt="' . $filename . '" />';