У меня есть большая строка данных изображения base64 (около 200 КБ). Когда я пытаюсь преобразовать эти данные, выведя декодированные данные с правильным заголовком, скрипт умирает, как будто памяти недостаточно. Я не ошибаюсь в своих журналах Apache. Пример кода, который я ниже, работает с небольшими изображениями. Как я могу декодировать большое изображение?
<?php // function to display the image function display_img($imgcode,$type) { header('Content-type: image/'.$type); header('Content-length: '.strlen($imgcode)); echo base64_decode($imgcode); } $imgcode = file_get_contents("image.txt"); // show the image directly display_img($imgcode,'jpg'); ?>
Поскольку базы данных с кодировкой base64 чисто разделяются каждые 4 байта (т. Е. 3 байта открытого текста кодируются в 4 байта текста с кодировкой base64), вы можете разделить свою строку b64 на кратные 4 байта и обрабатывать их отдельно:
while (not at end of string) { take next 4096 bytes // for example - 4096 is 2^12, therefore a multiple of 4 // you could use much larger blocks, depends on your memory limits base64-decode them append the decoded result to a file, or a string, or send it to the output }
Если у вас есть допустимая строка base64, это будет работать одинаково для его декодирования сразу.
Хорошо, вот более близкое разрешение. Хотя это, по-видимому, расшифровывает данные base64 в небольших кусках, я до сих пор не получаю изображения в браузере. Если я повторяю данные перед размещением заголовка, я получаю вывод. Опять же, это работает с небольшим изображением, но не с большим. Мысли?
<?php // function to display the image function display_img($file,$type) { $src = fopen($file, 'r'); $data = ""; while(!feof($src)) { $data .= base64_decode(fread($src, 4096)); } $length = strlen($data); header('Content-type: image/'.$type); header('Content-length: '.$length); echo $data; } // show the image directly display_img('image.txt','jpg'); ?>
Длина контента должна указывать фактическую (декодированную) длину содержимого, а не длину данных, кодированных base64.
Хотя я не уверен, что это исправление решит эту проблему …
Сохраните строку base64 в файл изображения, используя функцию imagejpeg()
или правильную функцию для разных форматов, а затем отобразите изображение с помощью простого <img>
.