PHP получает размер файла вложений imap
Я читаю электронную почту imap с помощью PHP и загружаю вложения, используя основные функции imap PHP. Я также подключаюсь по протоколу imap (не POP). Я хотел бы знать размер файлов вложений, прежде чем загружать их в память, чтобы уменьшить использование ресурсов сервера.
Например, мне нужно ограничение в 5 Мб на вложение, таким образом, я могу отбросить любые вложения, превышающие лимит, прежде чем они потребят какие-либо ресурсы сервера. Поиск размера электронного письма может помочь но проблема в том, что мне нужен лимит на вложение, а не на электронное письмо.
imap_fetchbody()
загружается вложение, которое все работает. Я, вероятно, мог бы прочитать размер результата этой функции, но это означало бы сначала загрузить вложение в память.
Спасибо
2 answers
Я понимаю, что это более старая запись, но, если это поможет, разница в размере обусловлена тем, что вложения закодированы в кодировке base64, что приводит к увеличению объема данных примерно на 33 %. Из RFC3501: "[Размер тела - это] Число, задающее размер тела в октетах. Обратите внимание, что этот размер является размером в кодировке передачи, а не результирующим размером после любого декодирования"
.Этому вопросу чуть больше 3 лет, и я удивлен, что на него нет реального ответа.
Загрузка структуры электронной почты с помощью imap_fetchstructure();
раскроет всю информацию, которая вам понадобится для выполнения этой задачи. Я предполагаю, что вы знаете, как получить конкретное электронное письмо, которое вы хотите проверить перед использованием imap_fetchstructure();
.
В любом случае функция вернет список "частей". Эти части соответствуют спецификации IMAP4. Результаты приведены в массиве, и один из индексов массива называется bytes
, который указывает количество байтов для этой части. Существует еще один индекс, называемый encoding
, который указывает метод кодирования для этой части.
Как ответил Пол, кодировка Base64 обычно примерно на 33% больше исходного размера, что должно быть достаточно для определения исходной длины данных вложения.
Я полагаю, что вы можете избежать хлопот с загрузкой данных в память, записав данные непосредственно в дескриптор файла с помощью imap_savebody();
функция. Ты можешь устраните проблему с кодировкой, добавив фильтр потока в этот дескриптор файла перед вызовом imap_savebody();
. Это достигается за счет stream_filter_append();
функция.
Я могу отредактировать свой ответ и добавить немного рабочего PHP-кода, когда у меня будет больше времени.