Я работаю над загрузкой файлов через веб-страницу с индикатором выполнения, используя загрузчик файлов Valums . Почти все работает нормально, но я не могу изменить каталог tmp по умолчанию, где файл хранится во время загрузки.
Файлы должны храниться в каталоге /upload
а не в каталоге system /tmp
по умолчанию, поскольку /tmp
монтируется на RAM-диске, размер которого ограничен 4 МБ, и пользователь будет загружать файлы размером около 10 МБ.
Я искал множество веб-страниц, но ни один из решений не работал. Я установил каталог temp в php.ini
:
upload_tmp_dir =/upload
Я установил разрешения для /upload
dir, и apache является владельцем файла, поэтому каталог определенно доступен для записи через PHP.
Я установил целевой путь в загрузчик файлов в /upload
, потому что я хочу, чтобы файлы сохранялись после загрузки также в этом каталоге. Конечный результат – небольшие файлы загружаются успешно, но файлы размером более 4 МБ не загружаются – единственная причина такого поведения, которая приходит мне на ум, заключается в том, что файлы хранятся в /tmp
во время загрузки. Разумеется, я проверил его с помощью sys_get_temp_dir()
и результат был /tmp
-so PHP игнорирует мою директиву php.ini или есть другой способ установить, где файлы хранятся во время загрузки.
О, и последняя информация: open_basedir
не установлен, поэтому доступ PHP к диску ограничен только правами на файл.
Проблема, описанная здесь, была решена мною довольно давно, но я действительно не помню, что было основной причиной того, что загрузки не работали. Было много вещей, которые нуждались в исправлении, чтобы загрузка могла работать. Я создал контрольный список, который может помочь другим, имеющим аналогичные проблемы, и я отредактирую его, чтобы сделать его максимально полезным. Как я уже говорил в чате, я работал над встроенной системой, поэтому некоторые точки можно пропустить в не встроенных системах.
Проверьте upload_tmp_dir
в php.ini. Это каталог, в котором PHP хранит временные файлы при загрузке.
Проверьте open_basedir
в php.ini. Если определено, он ограничивает права чтения / записи PHP указанному пути и его подкаталогам. Убедитесь, что upload_tmp_dir
находится внутри этого пути.
Проверьте post_max_size
в php.ini. Если вы хотите загрузить 20 Мбайт файлов, попробуйте что-то немного больше, например post_max_size = 21M
. Это определяет наибольший размер сообщения POST, которое вы, вероятно, используете во время загрузки.
Проверьте upload_max_filesize
в php.ini. Это указывает самый большой файл, который можно загрузить.
Проверьте memory_limit
в php.ini. Это максимальный объем памяти, который может потреблять сценарий. Совершенно очевидно, что он не может быть ниже размера загрузки (если честно, я не совсем уверен в этом – PHP, вероятно, буферизуется при копировании временных файлов).
Убедитесь, что вы проверяете правильный файл php.ini, который используется PHP на вашем веб-сервере. Лучшим решением является выполнение скрипта с директивой, описанной здесь http://php.net/manual/en/function.php-ini-loaded-file.php (функция php_ini_loaded_file
)
Проверьте, как работает пользователь php (см. Здесь, как это сделать: как проверить, какой пользовательский php работает как? ). Я работал над разными дистрибутивами и серверами. Иногда это apache
, но иногда это может быть root
. Во всяком случае, убедитесь, что этот пользователь имеет права на чтение и запись во временном каталоге и каталоге, в который вы загружаете. Проверьте все каталоги в пути, если вы загружаете их в подкаталог (например, /dir1/dir2/
-check как dir1
и dir2
.
На встроенных платформах вам иногда необходимо ограничить запись в корневую файловую систему, поскольку она хранится на флеш-карте, и это помогает продлить срок службы этой карты. Если вы используете скрипты для включения / отключения записи файлов, убедитесь, что вы включили запись перед загрузкой.
У меня были серьезные проблемы с PHP> 5.4 загрузкой мониторинга на основе сеансов (как описано здесь http://phpmaster.com/tracking-upload-progress-with-php-and-javascript/ ) на некоторых платформах. Сначала попробуйте что-то простое (например, здесь: http://www.dzone.com/snippets/very-simple-php-file-upload ). Если это сработает, вы можете попробовать более сложные механизмы.
Если вы внесете какие-либо изменения в php.ini, забудьте перезагрузить сервер, чтобы конфигурация была перезагружена.
Я долгое время боролся с этой проблемой … Мое решение состояло в том, чтобы изменить файл php.ini в папке, содержащей скрипт php. Это было важно, так как изменение php.ini в корне не помогло решить проблему (у меня есть php.ini в каждой папке для детального управления). Соответствующие записи в моем php.ini были похожи на это …. (для этой проблемы не требуется output_buffering)
output_buffering = On upload_max_filesize = 20M post_max_size = 21M