Загрузка изображений с помощью PHP и превышение лимита памяти скрипта - PullRequest
3 голосов
/ 25 августа 2010

Я пытаюсь загрузить изображение JPG с помощью скрипта PHP, но изображение продолжает вызывать тайм-аут моего скрипта и выдает ошибку:

Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 
2136 bytes) in image.php on line 38

Как я могу предотвратить загрузку, если изображение слишком велико или из-за этой ошибки возникла ошибка?

Ответы [ 6 ]

3 голосов
/ 25 августа 2010

На самом деле проблема не в исходном размере файла, а в размерах самого изображения (высота ширина colorDepth), поскольку у вас нет доступа к этой информации до того, как файл был загружен для Из соображений безопасности вам, вероятно, следует использовать загрузчик, написанный на Flash, Java или Silverlight, поскольку они действительно имеют доступ к этой информации заранее.

После загрузки вы можете проверить, превысит ли размер изображения ваш предел памяти, рассчитав размеры (несжатого) изображения, используя getimagesize и используя возвращенную ширину, высоту и битовую глубину.

Удачи.

2 голосов
/ 25 августа 2010

http://php.net/manual/en/features.file-upload.common-pitfalls.php говорит:

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

1 голос
/ 25 августа 2010

Просто установите предел памяти выше для этого конкретного сценария только с помощью ini_set.

В начале вашего сценария обработки изображений:

ini_set('memory_limit', '64M');

Эта ошибка обычно вызвана не размером файла изображения, а разрешением изображения. Таким образом, вы можете запустить проверку размера изображения. Запустите несколько тестов, чтобы увидеть, что приемлемо для текущего ограничения памяти, а если разрешение выше, завершите процесс и верните ошибку пользователю.

1 голос
/ 25 августа 2010

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

через php.ini, upload_max_filesize = 10M

через невидимый тег, такой как этот (10k): <input type="hidden" name="MAX_FILE_SIZE" value="10000" />

Я бы не рекомендовал увеличивать лимит памяти, если вы не знаете, какие последствия это может иметь для конфигурации вашего сервера.

0 голосов
/ 25 августа 2010

Это происходит со всеми попытками загрузки независимо от размера файла?Я сталкивался с такой проблемой только тогда, когда произошла ошибка сценария - обычно это неконтролируемый цикл.

0 голосов
/ 25 августа 2010
$size=filesize($_FILES['image']['tmp_name']);

даст вам размер файла в глобальном массиве $ _FILES.После этого просто сравните $ size с максимальным размером, который вам нужен.

Проверьте thies filesize () api: http://php.net/manual/en/function.filesize.php

...