Как base64-декодировать большие файлы в PHP - PullRequest
5 голосов
/ 20 мая 2009

В моем веб-приложении PHP есть API, который может принимать достаточно большие файлы (до 32 МБ), которые закодированы в формате base64. Цель - записать эти файлы где-нибудь в моей файловой системе. Декодировать конечно. Каков был бы наименее ресурсоемкий способ сделать это?

Редактировать: Получение файлов через API означает, что в моем приложении PHP есть строка размером 32 МБ, а не где-то на диске исходный файл размером 32 МБ. Мне нужно, чтобы эта строка была декодирована в файловую систему.

Использование собственного PHP64 base64_decode () не сокращает его, потому что он использует много памяти, поэтому я продолжаю работать с пределом памяти PHP (я знаю, я мог бы поднять этот предел, но я не чувствую хорошо, что PHP разрешает использовать 256МБ или около того на процесс).

Есть еще варианты? Могу ли я сделать это вручную? Или записать файл на диск в кодировке и вызвать какую-нибудь внешнюю команду? Есть мысли?

Ответы [ 2 ]

20 голосов
/ 22 мая 2009

Несмотря на то, что на это есть принятый ответ, у меня есть другое предложение.

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

Предполагается, что вы извлекаете данные через простой GET URL:

$url = 'http://www.example.com/myfile.base64';
$target = 'localfile.data';

$rhandle = fopen($url,'r');
stream_filter_append($rhandle, 'convert.base64-decode');

$whandle = fopen($target,'w');

stream_copy_to_stream($rhandle,$whandle);
fclose($rhandle);
fclose($whandle);

Преимущества:

  • Должно быть быстрее (меньше копирование огромных переменных)
  • Очень мало памяти

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

$data = 'your base64 data';
$target = 'localfile.data';

$whandle = fopen($target,'w');
stream_filter_append($whandle, 'convert.base64-decode',STREAM_FILTER_WRITE);

fwrite($whandle,$data);

fclose($whandle);
11 голосов
/ 20 мая 2009

Расшифруйте данные небольшими порциями. Четыре символа данных Base64 равны трем байтам данных «Base256».

Таким образом, вы можете сгруппировать каждые 1024 символа и декодировать их до 768 октетов двоичных данных:

$chunkSize = 1024;
$src = fopen('base64.data', 'rb');
$dst = fopen('binary.data', 'wb');
while (!feof($src)) {
    fwrite($dst, base64_decode(fread($src, $chunkSize)));
}
fclose($dst);
fclose($src);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...