|
|
|
|
|
для: aetern
(17.07.2009 в 20:28)
| | А раньше, когда я вам давал ссылку почитать, вы значит все таки поленились, и не читали? А в мануале как раз многое сказано и об copy(), и о нежелательности именовать файлы именами пользователя, и многое еще.... Вот вам о загрузке файлов сводная информация:
PHP версии 3 не имел функции move_uploaded_file(), поэтому до выхода четвертой версии использовалась функция copy(), которая до сих пор находится в документации и пользуется популярностью. Но нежелательно использовать copy() при закачке файлов, т.к. возможны проблемы. Copy() вообще не будет работать при включенном open_basedir! При safe_mode=On чтобы использовать copy(), нужно установить на временную папку того же владельца, что и выполняет скрипт, тоесть загрузка файлов будет невозможна, если у вас несколько пользователей (как и должно быть в случае виртуальных доменов). Кроме того copy() не выполняет проверку файла на существование.
Возможные проблемы при загрузке файлов
1. Закачка файлов запрещена - file_uploads=Off в php.ini.
2. Нету прав на папку - измените владельца на пользователя под которым запущен скрипт или поставьте на папку chmod 0777
3. Целевая директория имеет другого владельца, чем под которым запущен PHP, когда safe_mode=On. Это повсеместно распространенный случай для шарового хостинга, когда пользователь Апача для примера www или nobody, тогда как доступ по FTP, например, для pupkin. Выхода два:
а) обратиться в службу поддержки для настройки одинаковых юзеров на FTP и Apache (для вашего виртуального домена);
б) папку для загрузки создать из скрипта под Апачем и поставить на неё 'chmod 0777'. Тогда вы сможете работать из скриптов обходя safe_mode запреты и редактировать файлы по FTP.
4. Нету прав на upload_tmp_dir (настройка в php.ini). Поставьте chmod 0777 на эту папку.
5. Файлы могут быть испорченными если под Апачем запущены некоторые модули, например mod_charset (также известный как Russian Apache). Выключите его для определенных файлов:
<Files upload.php>
CharsetDisable On
</Files>
6. Не закачиваются большие файлы. Причин может быть несколько, если не выполняется хоть одно из условий, файл не закачается:
а) размер файла больше $_POST['MAX_FILE_SIZE']
б) размер файла больше upload_max_filesize=2M (php.ini)
в) размер файла больше post_max_size=8M (php.ini)
г) размер файла больше LimitRequestBody (httpd.conf)
д) исчерпана дисковая квота или на upload_tmp_dir, или на целевую директорию
е) время выполнения скрипта превысило max_execution_time (php.ini)
ж) время выполнения скрипта превысило Timeout 30 (httpd.conf)
3) время выполнения скрипта превысило таймаут для CGI (Консоль IIS)
7. Пользователь сидит за прокси, который запрещает передачу.
8. Вы использовали другой способ закачки, например, сокращенный синтаксис, при том что register_globals=Off или старая версия PHP, или ещё хуже - использовали copy() вместо move_uploaded_file().
9. Неправильно работает $_FILES[$field_name]['type']. Это не глюк PHP, этот параметр передаётся броузером, так что никогда не полагайтесь на него.
10. Проблемы с закачкой файлов не из под броузера (не URI encoded форма). В большинстве случаев для этого понадобится использовать $HTTP_RAW_POST_DATA.
11. Проблемы с закачкой файлов нулевой длины. Суть проблемы не в том, что файлы не закачиваются, а в том, что невозможно определить закачался ли файл на самом деле. Многие проверяют статус закачки через $_FILES[$field_name]['size'], но как в случае когда файл не закачался, так и в случае пустого файла, переменная будет равна 0. Если пользователь сам напечатает имя несуществующего файла в поле броузера, он передастся как файл нулевой длины. Проверить это средствами PHP нельзя.
12. magic_quotes_gpc=On и stripslashes на Win платформе создаст проблемы с получением имен файлов, так, например, $_FILES[$field_name]['name'] всё-таки должен содержать двойные бек-слеши.
13. Неправильные параметры переданы в move_uploaded_file(). | |
|
|
|
|
|
|
|
для: aetern
(17.07.2009 в 21:14)
| | потому что диагностику нотайсов блокируете.
Нотайс об отсутствии поля tmp_name и name тут же бы нарыв вскрыл.
Впрочем, блокируете Вы её по рекомендации софттайма, который этот фреймворк написал, и который (фреймворк) при включенных нотайсах вообще взбеситься может. Так что тут палка о двух концах....
[М.! Имей совесть... ] | |
|
|
|
|
|
|
|
для: Trianon
(17.07.2009 в 21:06)
| | Непонятно осталось лишь одно, почему дома ошибка была не видна?
Я работаю с Денвером. | |
|
|
|
|
|
|
|
для: aetern
(17.07.2009 в 20:56)
| | >Это была ключевая фраза всей темы, что же Вы раньше-то молчали?
Мы с Sim5 охрипли уже бороться с продвинутыми аплоадерами...
Плюс к тому, модератор очередной раз выдал рекомендацию помолчать. | |
|
|
|
|
|
|
|
для: Trianon
(17.07.2009 в 20:28)
| | >а) начинать работу с массивом $_FILES с анализа ключа 'error'
Спасибо за совет, я вообще забыл о существовании $_FILES['userfile']['error']
>б) никогда не применять клиентское имя файла (элемент 'name') для сохранения файла на сервере.
Знаю, знаю, но все равно спасибо.
>Ну, в $_FILES обычно всегда что-то есть
Это была ключевая фраза всей темы, что же Вы раньше-то молчали?
Проблему решил так:
if(!empty($this->value[$this->name]['tmp_name'])) { }
|
Видимо, вера в знание и в безошибочность авторов вышеуказанной книги затмила глаза ;-).
Спасибо всем кто участвовал и отдельное Trianon. | |
|
|
|
|
|
|
|
для: Trianon
(17.07.2009 в 20:25)
| | Я же , в свою очередь, тоже рекомендую, но другое.
а) начинать работу с массивом $_FILES с анализа ключа 'error'
б) никогда не применять клиентское имя файла (элемент 'name') для сохранения файла на сервере. | |
|
|
|
|
|
|
|
для: Trianon
(17.07.2009 в 20:25)
| | Чтоже там такого!? Ушел читать... | |
|
|
|
|
|
|
|
для: aetern
(17.07.2009 в 20:24)
| | Не я. Мануал рекомендует. | |
|
|
|
|
|
|
|
для: Trianon
(17.07.2009 в 20:17)
| | Вы рекомендуете move_uploaded_file() | |
|
|
|
|
|
|
|
для: aetern
(17.07.2009 в 20:04)
| | Ну, в $_FILES обычно всегда что-то есть. Даже если самого файла и нет.
Но почему Вы применяете именно copy() , мне всё равно не понять. | |
|
|
|
|