Ответ 1
Передайте данные base64_decode(), чтобы получить двоичные данные, записать их в файл с помощью file_put_contents()
Как учебник "смотреть под обложки" для себя, я создаю 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 -
Есть ли способ сэкономить данные на диске, чтобы он был в удобном для использования формате?
Передайте данные base64_decode(), чтобы получить двоичные данные, записать их в файл с помощью file_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
Отключите первую и последнюю строку, base64decode и сохраните их под заданным именем.
сделано.
В то время как изобретать колесо имеет некоторую развлекательную и учебную ценность, я постараюсь удержаться от искушения: 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);
?>
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);