Сохранение строки Base64 на диск как двоичный файл с использованием PHP

Как учебник "смотреть под обложки" для себя, я создаю PHP script для сбора писем из почтового ящика POP3. При попытке использовать двоичные вложения я застреваю, пытаясь понять, что делать с информацией вложения.

Учитывая строку, которая будет собрана из электронной почты:

------ = _ Part_16735_17392833.1229653992102 Content-Type: image/jpeg; имя = trans2.jpg Content-Transfer-Encoding: base64 X-Attachment-Id: f_fow87t5j0 Content-Disposition: вложение; имя файла = trans2.jpg

/9J/4AAQSkZJRgABAgEASABIAAD/4QxrRXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEAAAEaAAUA AAABAAAAYgEbAAUAAAABAAAAagEoAAMAAAABAAIAAAExAAIAAAAUAAAAcgEyAAIAAAAUAAAAhodp

(...)

EAgEAgEAgEAgEAg8IBQRL/Lbe/tJrScHqZ2lkmE4XUP2XcSDZZ2VvZ28dtbsDIYmhkbRxAIJCAQC AQCAQf/ScyAQCAQCAQCAQCAQCAQCAQCAQCAQCAQf/9k = ------ = _ Part_16735_17392833.1229653992102 -

Есть ли способ сэкономить данные на диске, чтобы он был в удобном для использования формате?

Ответ 1

Передайте данные base64_decode(), чтобы получить двоичные данные, записать их в файл с помощью file_put_contents()

Ответ 2

Если у вас много данных для записи, которые необходимо декодировать перед записью, я бы предложил использовать фильтры потока, чтобы декодировать данные по мере их записи...

$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);

Ответ 3

Я попробовал следующее, но не работал у меня, создавал пустой файл изображения.

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

Ответ 4

Отключите первую и последнюю строку, base64decode и сохраните их под заданным именем.

сделано.

Ответ 5

В то время как изобретать колесо имеет некоторую развлекательную и учебную ценность, я постараюсь удержаться от искушения: Mailparse, Mail_mimeDecode

Ответ 6

У меня была подобная ситуация, и именно это я и сделал. Как отмечалось ранее, обязательно удалите посторонние строки до и после строки 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);
?>

Ответ 7

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;
}

Ответ 8

Для больших строк base64 из БД вам понадобится load()

$imgdata = $FromDB['BASE64']->load();
$imgdata =  base64_decode($imgdata);
file_put_contents($fileName, $imgdata);