Заливаю несколько файлов: for ($i = 0; $i < sizeof($_FILES['images']['name']); $i++) { if ($_FILES['images']['name'][$i]) { if (copy($_FILES['images']['tmp_name'][$i], '/images/bu/' . $_FILES['images']['name'][$i])) print "true<br />"; } } Выдает ошибку: Warning: copy(/images/bu/x_3ba432d1.jpg) [function.copy]: failed to open stream: No such file or directory in C:\ROOT\Apache2\htdocs\veles\www\admin\create_bu.php on line 23 Каталог существует! Делаю все на локале. Не могу понять, почему так происходит. Что же я делаю неправильно?
rar Из директории temp нужно копировать функцией move_uploaded_file. Она создана специально для этого и у нее есть доступ к temp-директории всегда, в отличие от других функций.
Поменял код: for ($i = 0; $i < sizeof($_FILES['images']['name']); $i++) { if ($_FILES['images']['name'][$i]) { if (move_uploaded_file($_FILES['images']['tmp_name'][$i], '/images/bu/' . $_FILES['images']['name'][$i])) { ... } } } Тоже самое: Warning: move_uploaded_file(/images/bu/3.png) [function.move-uploaded-file]: failed to open stream: No such file or directory in C:\ROOT\Apache2\htdocs\veles\www\admin\create_bu.php on line 23 Warning: move_uploaded_file() [function.move-uploaded-file]: Unable to move 'C:\WINDOWS\Temp\php795C.tmp' to '/images/bu/3.png' in C:\ROOT\Apache2\htdocs\veles\www\admin\create_bu.php on line 23 Посмотрите, может ошибки что скажут. Я чего-то не допонимаю.
В php.ini есть такая строчка ;upload_tmp_dir =. Может это из-за нее? Видимо надо раскомментировать и прописать путь, подскажите, как правильно прописать.
вот кусок моего контролера стоража, который отвечает за сохранение файлов. может чем- то поможет. Код (Text): foreach ($_FILES[$this->input().'_n']['name'] as $index=> $xxx){ $fileA['name']= $_FILES[$this->input().'_n']['name'][$index]; $fileA['tmp_name']= $_FILES[$this->input().'_n']['tmp_name'][$index]; $fileA['type'] = $_FILES[$this->input().'_n']['type'][$index]; //невыбранные файлы не обрабатываются if (!$fileA['name']) continue; //файл сохраненный с ошибкой обрывают загрузку всех файлов if (!is_uploaded_file($fileA['tmp_name']) || !move_uploaded_file($fileA['tmp_name'], UPLOADPATH.$fileA['name'])){ switch($fileA['error']){ case UPLOAD_ERR_INI_SIZE: case UPLOAD_ERR_FORM_SIZE: throw new OException("Файл {$fileA['name']}: Превышен допустимый размер закачиваемого файла"); break; case UPLOAD_ERR_PARTIAL: throw new OException("Файл {$fileA['name']}: Во время передачи файла произошла ошибка. Повторите операцию еще раз"); break; case UPLOAD_ERR_NO_FILE: throw new OException("Файл {$fileA['name']}: Файл не выбран"); break; default: throw new OException("Файл {$fileA['name']}: Во время передачи файла произошла ошибка. Повторите операцию еще раз"); break; } } $fileA['tmp_name']= UPLOADPATH.$fileA['name']; //файлы сохраненные правильно, добавляются в стораж $storage->add($fileA['name'],$fileA['tmp_name'], $fileA['type']); }
Спасибо. $_SERVER['DOCUMENT_ROOT'] помог. Только не пойму почему при загрузки файлов он нужен, а при простом инклудинке или руадеринге он не нужен?
дело в другом, если ты делаешь аплоад файла из под каталога, например www.mysite.com/admin - то тебе надо указывать относительный путь такого вида '../images/bu/' если же из корня www.mysite.com - то просто 'images/bu/' у меня на всех проектах так стоит и работает нормально без всякого $_SERVER['DOCUMENT_ROOT']