Подтвердить что ты не робот

Установка PHP tmp dir - загрузка PHP не работает

Я работаю над загрузкой файла через веб-страницу с помощью индикатора выполнения с помощью загрузчика файлов Valums. Почти все работает нормально, но я не могу изменить каталог tmp по умолчанию, где файл хранится во время загрузки.

Файлы должны храниться в директории /upload, а не в директории system /tmp по умолчанию, поскольку /tmp монтируется в RAM-диске, размер которого ограничен 4 Мб, а пользователь будет загружать файлы около 10 MB.

Я искал много веб-страниц, но ни один из решений не работал. Я установил каталог temp в php.ini:

upload_tmp_dir =/upload

Я установил разрешения для /upload dir, и apache является владельцем файла, поэтому каталог определенно доступен для записи через PHP.

Я установил целевой путь в загрузчик файлов на /upload, потому что я хочу, чтобы файлы сохранялись после загрузки также в этом каталоге. Конечный результат - небольшие файлы загружаются успешно, но файлы размером более 4 Мб не загружаются - единственная причина такого поведения, которая приходит мне на ум, заключается в том, что файлы хранятся в /tmp во время загрузки. Разумеется, я проверил его с помощью sys_get_temp_dir(), и результат был /tmp, так как PHP игнорирует мою директиву php.ini или есть другой способ установить, где файлы хранятся во время загрузки.

О, и последняя информация: open_basedir не установлена, поэтому доступ к диску на PHP ограничен только правами на файл.

4b9b3361

Ответ 1

Проблема, описанная здесь, была решена мною довольно давно, но я действительно не помню, что было основной причиной того, что загрузки не работали. Было много вещей, которые нуждались в исправлении, чтобы загрузка могла работать. Я создал контрольный список, который может помочь другим, имеющим аналогичные проблемы, и я отредактирую его, чтобы сделать его максимально полезным. Как я уже говорил в чате, я работал над встроенной системой, поэтому некоторые точки могут быть пропущены на не встроенных системах.

  • Проверьте 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. Максимальный объем памяти a script может потреблять. Совершенно очевидно, что он не может быть ниже размера загрузки (если честно, я не совсем уверен в этом - PHP, вероятно, буферизуется при копировании временных файлов).

  • Убедитесь, что вы проверяете правильный файл php.ini, который используется PHP на вашем веб-сервере. Лучшим решением является выполнение script с директивой, описанной здесь http://php.net/manual/en/function.php-ini-loaded-file.php (php_ini_loaded_file function)

  • Проверьте, как работает пользователь 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, забудьте перезагрузить сервер, чтобы конфигурация была перезагружена.

Ответ 2

Я долгое время боролся с этой проблемой... Моим решением было изменить файл php.ini в папке, содержащей PHP скрипт. Это было важно, так как изменение php.ini в корне не помогло решить проблему (у меня есть php.ini в каждой папке для детального управления). Соответствующие записи в моем php.ini выглядели так: (для этой проблемы вряд ли понадобится output_buffering)

output_buffering = On 
upload_max_filesize = 20M 
post_max_size = 21M