Забрать файл с временной папки на Сервере и пересохранить в проэкт сайта

littus

Новичок
Доброго всем дня!

Есть файл gowhere.inc.php он у меня инклюдится в главный index.php при передаче методом GET cоответствующего id
(в частности query string у меня выглядит так: http://localhost/Level_1_Bau/index.php?id=gowhere).
Все файлы,которые инклюдятся,включая и gowhere.inc.php у меня лежат в отдельной папке [includes]

В самом файле gowhere.inc.php у меня лежит форма загрузки различных файлов на сервер и скрипт PHP-перемещение оных в другую, специально отведенную папку (в корневом каталоге сайта) под названием [upload].

Содержимое файла gowhere.inc.php:

if($_SERVER['REQUEST_METHOD']=='POST'){ // если была отправлена форма с загрузкой определенного файла на сервер
echo "<pre>"; print_r($_FILES); echo "<pre>"; //информация о загруженной файле (для наглядности)

$tmp_name = $_FILES['user_file']['tmp_name'];
$name = $_FILES['user_file']['name'];
move_uploaded_file($tmp_name, '../upload/'.$name);
}
?>

<form action='includes/gowhere.inc.php' method='POST' enctype='multipart/form-data'>
<input type='file' name='user_file'>
<input type='submit'>
</form>

1.Стал искать в обучающих материалах, там ссылка на обработку в форме отправки <form action.....> шла как: <?= $_SERVER['PHP_SELF'] ?>. Все хорошо
и правильно, но,поскольку у меня здесь контент файла gowhere.inc.php инклюдится по id, то серверная глоб.переменная $_SERVER['PHP_SELF'] меня просто
забрасывает на оснновную индексную страницу index.php, что не мудрено и никакого перемещения файла в мою папку [upload] не происходит.

2.Понимая, что мне надо считать то, что стоит в query string, попробовал другую серверную глоб.переменную поставить: $_SERVER['REQUEST_URI'].
Выдает 2 ошибки, первую, что не может открыть файл gowhere.inc.php (хотя полный путь к нему указывает точно !!??). Вторую, соответственно тянет за собою,
что не может переместить указанный файл в мою папку [upload].
Warning: move_uploaded_file(upload/form_aus-1.doc) [function.move-uploaded-file]: failed to open stream: No such file or directory in Z:\home\localhost\www\Level_1_Bau\includes\gowhere.inc.php on line 7

3.Если же просто ставлю в <form action.....> относительный путь на свой файл gowhere.inc.php:
<form action='includes/gowhere.inc.php' method='POST' enctype='multipart/form-data'> , то все работает и файл попадает куда нужно, однако и
оставляет меня,соответственно, на этом файле: http://localhost/Level_1_Bau/includes/gowhere.inc.php, а тут у меня только и только форма отправки,и мне нужно остаться именно на прежнем месте: http://localhost/Level_1_Bau/index.php?id=gowhere

Наверное можно сделать сразу же перезапрос страницы, отослав заголовок с $_SERVER['PHP_SELF'], но у меня он не отошлется на данном этапе,- до этого инклюда куча вывода контента в браузер.

хотелось бы знать как грамотно в данном примере и вообще прописать в <form action.....> и не хардить код простым includes/gowhere.inc.php, тем более, что это проблему не решает и перекидывает не туда куда надо.
Спасибо.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Надо узнать про автолоадеры, единую точку входа, желательно про composer и все остальное. А сейчас - это плохой код.
 

littus

Новичок
Да я это в рамках обучающего курса прохожу, думаю понять такие основы хотя бы, потом углубляться. То, что Вы написали загуглю почитаю, с таким еще не сталкивался.

В общем нашел я сам разобрался как и почему. Оказывается у меня путь к папке, именно в скрипте PHP, не верно указан был: move_uploaded_file($tmp_name, '../upload/'.$name);
а надо было: move_uploaded_file($tmp_name, 'upload/'.$name); т.к.относительный путь, в данном случае, исходит од файла index.php ,находящегося
в корневом каталоге сайта, как и папка,отведенная под перемещение файлов с сервера [upload], а я исходил от файла gowhere.inc.php ,который дополнительно
находится в папке [includes]. )))

Теперь,при указанном в форме отправки данных (в файле gowhere.inc.php):
<form action='<?= $_SERVER['REQUEST_URI'] ?>' method='POST' enctype='multipart/form-data'>
<input type='file' name='user_file'>
<input type='submit'>
</form>

и скрипте в файле gowhere.inc.php, -все работает как надо и корректно :
if($_SERVER['REQUEST_METHOD']=='POST'){ // если была отправлена форма с загрузкой определенного файла на сервер
echo "<pre>"; print_r($_FILES); echo "<pre>"; //информация о загруженной файле (для наглядности)

$tmp_name = $_FILES['user_file']['tmp_name'];
$name = $_FILES['user_file']['name'];
move_uploaded_file($tmp_name, 'upload/'.$name);
}
?>

Можно попутно вопрос.
Как сделать в моем примере, чтобы при выборе файла, который клиент собирается отправить на сервер, можно было выбрать не один, а сразу несколько, например при зажатом Ctr ?
 

fixxxer

К.О.
Партнер клуба
в рамках обучающего курса прохожу
А что за курс? Похоже, он устарел лет на 15.

По вопросу:
1) http://www.w3.org/TR/html-markup/input.file.html#input.file.attrs.multiple - но это работает только в новых браузерах
2) http://php.net/manual/en/features.file-upload.multiple.php

Пути к файлам лучше указывать абсолютные, константа __DIR__ в помощь. Ну и http://phpfaq.ru/paths
 
Последнее редактирование:

littus

Новичок
Курс "Специалист" (Игорь Борисов) (ун.Баумена) -2013г. Вроде не совсем старые.
Спасибо за ссылки. Буду пробовать.
 

fixxxer

К.О.
Партнер клуба
Ну видимо переиздания. Практику именовать файлы .inc.php я в последний раз встречал году в 2004-м.

Главный совет - прежде, чем учиться писать, учиться читать. :) В смысле - ориентироваться в документации и уметь спросить в гугле.
 

littus

Новичок
Практику именовать файлы .inc.php я в последний раз встречал году в 2004-м.
А можно в 2-х словах почему? Я так понял это для удобства, когда видишь .inc.php значит что-то подинклюжено,- информативно. Наверное сейчас вообще по-другому строят саму модель/структуру сайта типа Model-View-Controller.
 

fixxxer

К.О.
Партнер клуба
Сейчас никто не делает php-файлы с сайд-эффектами (которые выполняют код только лишь от своего подключения), кроме единственной входной точки index.php.

Даже если не ООП, а процедурщина - в файлах просто объявляются функции, но ничего не происходит, пока их не вызовешь
 

С.

Продвинутый новичок
А можно в 2-х словах почему? Я так понял это для удобства, когда видишь .inc.php значит что-то подинклюжено,- информативно.
В современных проектах ВСЕ файлы кроме index.php "подинклюжены". Пэтому смысла их как-то маркировать нет.
 

littus

Новичок
У меня также вроде,- все файлы подынклюжены в index.php:
все конфигурационные с константами, сессия юзера, куки, а также единый файл с библиотекой функций в самом начале файла, еще до html тегов;
потом в теле html файлы, хранящиеся куски html кода,
а контент динамический в index инклюдится через файл типа роутера.
 

littus

Новичок
Возвращаясь к своему примеру.
Объясните пожалуйста момент с относительными и абсолютными путями и правильным отображением на веб-сервере.

Содержимое файла library.inc.php:

Код:
function f_fileMoveUploaded($uploaddir) {  // param.:1- (str)$uploaddir - содержит абсолютный путь к файлу,который перемещаем
    if($_SERVER['REQUEST_METHOD']=='POST') {
        foreach ($_FILES['user_file']['error'] as $key => $error) {
              if ($error == UPLOAD_ERR_OK) {
                $tmp_name = $_FILES['user_file']['tmp_name'][$key];
                $name = $_FILES['user_file']['name'][$key];
                move_uploaded_file($tmp_name, $uploaddir.$name);
                return true;
              }
          }
    }
}
Содержимое файла gowhere.inc.php:

Код:
<?
$uploaddir = "/home/localhost/www/Level_1_Bau/upload/";

f_fileMoveUploaded($uploaddir);
?>

<form action='<?= $_SERVER['REQUEST_URI'] ?>' method='POST' enctype='multipart/form-data'>
  <input type='file' name='user_file[]'>
  <input type='file' name='user_file[]'>
  <input type='submit'>
</form> <!-- форма загрузки файлов на сервер -->

На ПК весь физический путь к данной папке, в которую я хочу пересохранять файлы, загружаемые на сервер, такой:
Z:\home\localhost\www\Level_1_Bau\upload/

Если я правильно понял статью по ссылке выше, то мое '/home/localhost/www/Level_1_Bau/upload/' - это абсолютный путь. Который и нужно использовать.
Относительный был бы просто "upload/'. Если что не верно понял поправьте.
Вообще будет такое работать на реальном сервере, мой путь там окажется жизнесспособным? /home/localhost будет меняться насколько я понимаю в зависимости от хоста.
Вы,конечно, если что извините за глупые вопросы, просто не сталкивался еще.
 
Последнее редактирование:

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
да, если ты написал все верно, то все заработает, хоть даже там будет путь к сайту от корня файловой системы в виде /var/www/...

только пути надо задавать в виде $path = __DIR__ . '/some/path/';
 

littus

Новичок
только пути надо задавать в виде $path = __DIR__ . '/some/path/';
Если я поставлю в свой код __DIR__ или dirname(__FILE__) в файле gowhere.inc.php , который лежит не в том же каталоге, что и index.php и папка,отведенная для перемещения файлов [upload], а на уровень ниже их, то эта константа даст мне абсолютный путь именно к этому же файлу в виде:
Z:\home\localhost\www\Level_1_Bau\includes , а мне надо
Z:\home\localhost\www\Level_1_Bau\upload

или нужно еще что-то прописать в дополнение к __DIR__ ?
 

AmdY

Пью пиво
Команда форума
ну вы же уже в первом примере пользовались ".." move_uploaded_file($tmp_name, '../upload/'.$name);, здесь нужно аналогично __DIR__ . '../upload/'
 

littus

Новичок
Ясно, спасибо за ответы.
В моем случае получилось вот так __DIR__ .'/../upload/' ;
 
Сверху