Как учебник «смотреть под обложки» для себя я создаю скрипт PHP для сбора писем из почтового ящика POP3. При попытке использовать двоичные вложения я застреваю, пытаясь понять, что делать с вложением.
Учитывая строку, которая будет собрана по электронной почте:
—— = _ Part_16735_17392833.1229653992102 Content-Type: image / jpeg; name = trans2.jpg Content-Transfer-Encoding: base64 X-Attachment-Id: f_fow87t5j0 Content-Disposition: attachment; имя файла = trans2.jpg
/ 9j / 4AAQSkZJRgABAgEASABIAAD / 4QxrRXhpZgAATU0AKgAAAAgABWESAAMAAAABAAEAAAEaAAUA AAABAAAAYgEbAAUAAAABAAAAAGEoAAMAAAABAAIAAAExAAIAAAAUAAAAcgEyAAIAAAAUAAAAhodp
(…)
EAgEAgEAgEAgEAg8IBQRL / Lbe / tJrScHqZ2lkmE4XUP2XcSDZZ2VvZ28dtbsDIYmhkbRxAIJCAQC AQCAQf / ScyAQCAQCAQCAQCAQCAQCAQCAQCAQCAQf / 9k = —— = _ Part_16735_17392833.1229653992102–
Есть ли способ сэкономить данные на диске, чтобы он был в удобном для использования формате?
Передайте данные на base64_decode (), чтобы получить двоичные данные, записать их в файл с файлом_put_contents ()
Если у вас есть много данных для записи, которые необходимо декодировать перед записью, я бы предложил использовать фильтры потока, чтобы декодировать данные по мере их записи …
$fh = fopen('where_you_are_writing', 'wb'); stream_filter_append($fh, 'convert.base64-decode'); // Do a lot of writing here. It will be automatically decoded from base64. fclose($h);
Я попробовал следующее, но не работал для меня, создавал пустой файл изображения.
file_put_contents('img.png', base64_decode($base64string));
вот как это сработало для меня:
$data = 'data:image/png;base64,AAAFBfj42Pj4'; list($type, $data) = explode(';', $data); list(, $data) = explode(',', $data); $data = base64_decode($data); file_put_contents('/tmp/image.png', $data);
Я взял код: Как сохранить PNG-изображение на стороне сервера, из строки данных base64
Хотя изобретать колесо имеет некоторую развлекательную и образовательную ценность, я постараюсь удержаться от соблазна: Mailparse , Mail_mimeDecode
У меня была аналогичная ситуация, и именно это я и сделал. Как отмечалось ранее, обязательно удалите посторонние строки до и после строки base64.
<?php $INPUT = "inputfile_base64_encoded.txt"; $OUTPUT = "output_decoded.zip"; $contents = file_get_contents($INPUT); $bin = base64_decode($contents); file_put_contents($OUTPUT, $bin); ?>
Отбросьте первую и последнюю строку, base64decode и сохраните их под заданным именем.
сделанный.
function base64_decode_file($data) { if(preg_match('/^data\:([a-zA-Z]+\/[a-zA-Z]+);base64\,([a-zA-Z0-9\+\/]+\=*)$/', $data, $matches)) { return [ 'mime' => $matches[1], 'data' => base64_decode($matches[2]), ]; } return false; }
,function base64_decode_file($data) { if(preg_match('/^data\:([a-zA-Z]+\/[a-zA-Z]+);base64\,([a-zA-Z0-9\+\/]+\=*)$/', $data, $matches)) { return [ 'mime' => $matches[1], 'data' => base64_decode($matches[2]), ]; } return false; }
Для больших строк base64 из БД вам нужно использовать load ()
$imgdata = $FromDB['BASE64']->load(); $imgdata = base64_decode($imgdata); file_put_contents($fileName, $imgdata);