Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: При загрузке файл проверка на наличие папки на сервере и …
 
 автор: nikolai   (24.11.2009 в 02:11)   письмо автору
 
 

Помогите плз. Уже 3 часа мучаюсь не чего, не получается. Проблема в следующем:
Есть часть кода:

. . . . . . . . . 


        $language = rus;
        $cur_id = 10;

        $dir = 'files/ ';
        if(sizeof($_FILES)>0 && !empty($_FILES['newfile']) && empty($_FILES['newfile']['error']))
        {
            $file = get_filename($dir, $_FILES['newfile']['name']);
            copy($_FILES['newfile']['tmp_name'], $dir.$file);
            header('Location: ?obj=struct&id='.$cur_id.'&lng='.$language);
        }

      $cont .= '<form method="post" ENCTYPE="multipart/form-data"><table>';
      $cont .= '<tr><td><input type=file name=newfile></td><td><input type=submit name=create value=upload></td></tr>';
      $cont .= '</table></form>';


. . . . . . . . . 


Т.е есть форма через которую я загружаю фаил в категорию $dir.
Задача в следующем, чтоб при загрузке файла проверялось наличие папки (има которой равно $cur_id) на сервере и если папка не существует, то чтоб он ее создавал и закидывал туда фаил, а если папка существует, то чтоб просто закидывал туда фаил.

Надеюсь, моя мысль понятна.
Заранее спасибо!

  Ответить  
 
 автор: Slo_Nik   (24.11.2009 в 03:02)   письмо автору
 
   для: nikolai   (24.11.2009 в 02:11)
 

попробуй mkdir();

  Ответить  
 
 автор: nikolai   (24.11.2009 в 23:57)   письмо автору
 
   для: Slo_Nik   (24.11.2009 в 03:02)
 

а как сделать проверку... существует ли папка на сервере ?
if (isset папка на сервере)
{
....
}
else
{
...
}

  Ответить  
 
 автор: neadekvat   (25.11.2009 в 00:01)   письмо автору
 
   для: nikolai   (24.11.2009 в 23:57)
 

Ну ведь признайтесь, даже не пытались поискать в документации?

  Ответить  
 
 автор: nikolai   (25.11.2009 в 00:37)   письмо автору
 
   для: neadekvat   (25.11.2009 в 00:01)
 

Вы ошиблись, возможно я плохая поисковая машина… да и ко всему совершенно не разбираюсь в php..

вот что нашел:

if(file_exists("/files/10"))
{
if(is_dir("/files/10"))
{
echo "Директория существует";
}
}

токо не получается все вышесказанное граматно написать :(

  Ответить  
 
 автор: nikolai   (25.11.2009 в 01:00)   письмо автору
 
   для: nikolai   (25.11.2009 в 00:37)
 

все сделал. результат:

. . . . . . . . .

      $language = rus; 
      $cur_id = 10;


      $dir = 'files/gallery/'.$cur_id.'/'; 
      if(file_exists($dir))
      {
         if(is_dir($dir))
         {//Директория существует
            if(sizeof($_FILES)>0 && !empty($_FILES['newfile']) && empty($_FILES['newfile']['error']))
            {
                $file = get_filename($dir, $_FILES['newfile']['name']);
                copy($_FILES['newfile']['tmp_name'], $dir.$file);
                header('Location: ?obj=struct&id='.$cur_id.'&lng='.$language);
            }
            $cont .= '<form method="post" ENCTYPE="multipart/form-data"><table>'; 
            $cont .= '<tr><td><input type=file name=newfile></td><td><input type=submit name=create value=upload></td></tr>'; 
            $cont .= '</table></form>';
            return $cont;
         }
      }
      else
      {//Директория не существует
         $new_dir = mkdir ($dir, 0777);
         if($new_dir)
              // Каталог успешно создан
              header('Location: ?obj=struct&id='.$cur_id.'&lng='.$language);
         else
              $cont .= 'Ошибка создания каталога - Error Creating directory';
         return $cont;
      }

. . . . . . . . .


Теперь надо попробовать реализовать удаление папки, когда будет удален последний фаил из нее :)

Всем спасибо !

  Ответить  
 
 автор: sim5   (25.11.2009 в 06:17)   письмо автору
 
   для: nikolai   (25.11.2009 в 01:00)
 

copy($_FILES['newfile']['tmp_name'], $dir.$file); - о copy в этом случае забыть.

  Ответить  
 
 автор: nikolai   (25.11.2009 в 13:54)   письмо автору
 
   для: sim5   (25.11.2009 в 06:17)
 

Не совсем Вас понел…

  Ответить  
 
 автор: Slo_Nik   (25.11.2009 в 14:02)   письмо автору
 
   для: nikolai   (25.11.2009 в 13:54)
 

имелось ввиду, что вместо copy использовать move_uploaded_file

  Ответить  
 
 автор: nikolai   (25.11.2009 в 14:09)   письмо автору
 
   для: Slo_Nik   (25.11.2009 в 14:02)
 

Как я уже говорил, я не силен в пхп. По этому я не вижу разницы между этими функциями.

  Ответить  
 
 автор: sim5   (25.11.2009 в 14:10)   письмо автору
 
   для: nikolai   (25.11.2009 в 14:09)
 

Разница как раз большая.

  Ответить  
 
 автор: nikolai   (25.11.2009 в 14:27)   письмо автору
 
   для: sim5   (25.11.2009 в 14:10)
 

чтото не павельно у меня.




. . . . . . . . . 

      $language = rus;  
      $cur_id = 10; 


      $dir = 'files/gallery/'.$cur_id.'/';  
      if(file_exists($dir)) 
      { 
         if(is_dir($dir)) 
         {//Директория существует 
            if(sizeof($_FILES)>0 && !empty($_FILES['newfile']) && empty($_FILES['newfile']['error'])) 
            { 
                /* $file = get_filename($dir, $_FILES['newfile']['name']);
                copy($_FILES['newfile']['tmp_name'], $dir.$file);
                header('Location: ?obj=struct&id='.$cur_id.'&lng='.$language);  */


                foreach ($_FILES["newfile"]["error"] as $key => $error) {
                    if ($error == UPLOAD_ERR_OK) {
                        $tmp_name = $_FILES["newfile"]["tmp_name"][$key];
                        $name = $_FILES["newfile"]["name"][$key];
                        move_uploaded_file($tmp_name, "$dir/$name");
                        header('Location: ?obj=struct&id='.$cur_id.'&lng='.$language);
                    }
                }


            } 
            $cont .= '<form method="post" ENCTYPE="multipart/form-data"><table>';  
            $cont .= '<tr><td><input type=file name=newfile></td><td><input type=submit name=create value=upload></td></tr>';  
            $cont .= '</table></form>'; 
            return $cont; 
         } 
      } 
      else 
      {//Директория не существует 
         $new_dir = mkdir ($dir, 0777); 
         if($new_dir) 
              // Каталог успешно создан 
              header('Location: ?obj=struct&id='.$cur_id.'&lng='.$language); 
         else 
              $cont .= 'Ошибка создания каталога - Error Creating directory'; 
         return $cont; 
      } 

. . . . . . . . 



Warning: Invalid argument supplied for foreach() in /home/v3863/public_html/inc/obj_gallery.php on line 38

38линия:
foreach ($_FILES["newfile"]["error"] as $key => $error) {

  Ответить  
 
 автор: Slo_Nik   (25.11.2009 в 14:47)   письмо автору
 
   для: nikolai   (25.11.2009 в 14:27)
 

вот с этой строки начни ошибку искать
if(sizeof($_FILES)>0 && !empty($_FILES['newfile']) && empty($_FILES['newfile']['error']))

  Ответить  
 
 автор: nikolai   (25.11.2009 в 14:55)   письмо автору
 
   для: Slo_Nik   (25.11.2009 в 14:47)
 

Что-то я запутался, раньше когда делал через copy все было ок.

  Ответить  
 
 автор: sim5   (25.11.2009 в 15:03)   письмо автору
 
   для: nikolai   (25.11.2009 в 14:55)
 

copy может служить причиной совсем иных проблем у вас. Не рекомендуется использовать ее при загрузке файлов, читайте мануал.

  Ответить  
 
 автор: nikolai   (25.11.2009 в 15:12)   письмо автору
 
   для: sim5   (25.11.2009 в 15:03)
 

В принципе я это понял с сайта php.net вот только не получается мне поменять на move_uploaded_file, чтото я делаю не так !

  Ответить  
 
 автор: sim5   (25.11.2009 в 16:02)   письмо автору
 
   для: nikolai   (25.11.2009 в 15:12)
 

У вас и copy, и move_uploaded_file, все в одной куче....

  Ответить  
 
 автор: Slo_Nik   (25.11.2009 в 16:06)   письмо автору
 
   для: sim5   (25.11.2009 в 16:02)
 

copy закомментировано, проблема, я думаю, начинается с $_FILES['newfile']

  Ответить  
 
 автор: sim5   (25.11.2009 в 16:17)   письмо автору
 
   для: Slo_Nik   (25.11.2009 в 16:06)
 

Проблемы начинаюся в самой структуры скрипта. Я лично не понимаю такого:
Бог его знает, был ли запрос на загрузку изображения или нет, но почему-то все начинается с проверки "есть ли каталог", и получается, если нет, а загрузку запросили, то бросаем все нафик и создаем каталог.... И что?
Ладно, бог с ним, пусть так, но опять, ни с того ни с чего начинаем "гонять" в цикле возможные ошибки при загрузке, а зачем?

Автору: Добавляйте в код РНР теги, ну хреново без подсветки!

  Ответить  
 
 автор: nikolai   (26.11.2009 в 01:23)   письмо автору
 
   для: sim5   (25.11.2009 в 16:17)
 

Постараюсь рассказать, почему именно так. Одно из первых –это то, что я полный “бум-бум” в пхп, только стараюсь делать первые шаги. Возможно по этому иду не по тому пути.

Второе это то что эта cms не моя (у ней нет ни владельца, ни названия), когда-то я ее покупал для своей фирмы. На ней висел небольшой сайт. Она очень мало функциональная и достаточно простая. В связи с увлечением пхп я ставлю для себя задачи и ее дорабатываю, т.е изучаю пхп.

Проблема в том что у ней сложная система создания разделов(для меня), не понять мне ее смысла, а я решил усовершенствовать для нее фото галерею. Раньше было просто на одной странице все изображения, а я решил сделать чтоб выло много таких разделов и под разделов, чтоб это была галерея, а не страница альбома.
Т.е этот фаил отвечает и за вывод изображений на сайте из определенной папки, и также за вывод и редактирование в админке.

Проблема была в том что когда создается объект (раздел/категория), то надо чтоб создавалась и папка на сервере с ID номером этого объекта. В связи с выше перечисленным для меня это сделать не реально и я решил сделать иначе, когда заходишь через админку в этот объект(раздел/категорию) для редактирования, то чтоб сразу была проверка на папку и создания ее. Все получилось и работает как планировал.

У того, кто писал этот скрипт, добавление изображений было сделано через copy и все прекрасно работает, но вы советуете переделать copy на move_uploaded_file.

И вот эта часть кода с переделкою под move_uploaded_file которая не работает из-за ошибки:
Warning: Invalid argument supplied for foreach() in /home/v3863/public_html/inc/obj_gallery.php on line 38

линия 38:

<?
foreach ($_FILES["newfile"]["error"] as $key => $error) {
?>



<?
      $language 
rus;   
      
$cur_id 10;  


      
$dir 'files/gallery/'.$cur_id.'/';   
      if(
file_exists($dir))  
      {  
         if(
is_dir($dir))  
         {
//Директория существует  
            
if(sizeof($_FILES)>&& !empty($_FILES['newfile']) && empty($_FILES['newfile']['error']))  
            {  
                
/* $file = get_filename($dir, $_FILES['newfile']['name']); 
                copy($_FILES['newfile']['tmp_name'], $dir.$file); 
                header('Location: ?obj=struct&id='.$cur_id.'&lng='.$language);  */ 


                
foreach ($_FILES["newfile"]["error"] as $key => $error) { 
                    if (
$error == UPLOAD_ERR_OK) { 
                        
$tmp_name $_FILES["newfile"]["tmp_name"][$key]; 
                        
$name $_FILES["newfile"]["name"][$key]; 
                        
move_uploaded_file($tmp_name"$dir$name"); 
                        
header('Location: ?obj=struct&id='.$cur_id.'&lng='.$language); 
                    } 
                } 


            }  
            
$cont .= '<form method="post" ENCTYPE="multipart/form-data"><table>';   
            
$cont .= '<tr><td><input type=file name=newfile></td><td><input type=submit name=create value=upload></td></tr>';   
            
$cont .= '</table></form>';  
            return 
$cont;  
         }  
      }  
      else  
      {
//Директория не существует  
         
$new_dir mkdir ($dir0777);  
         if(
$new_dir)  
              
// Каталог успешно создан  
              
header('Location: ?obj=struct&id='.$cur_id.'&lng='.$language);  
         else  
              
$cont .= 'Ошибка создания каталога - Error Creating directory';  
         return 
$cont;  
      }
?>

  Ответить  
 
 автор: sim5   (26.11.2009 в 04:39)   письмо автору
 
   для: nikolai   (26.11.2009 в 01:23)
 

Начну с конца:

>но вы советуете переделать copy на move_uploaded_file

Это не я советую, а разработчики, и на это есть веские причины. Эта функция появилась в версии 4.0.3, до этого использовалась copy.

move_uploaded_file проверяет, является ли файл filename правильно загруженным файлом (что он был загружен через PHP-механизм HTTP POST). Если файл является правильным, он будет переименован в файл destination.

Если filename не является правильно загруженным файлом, акции не будет, а move_uploaded_file() возвратит FALSE.

Если filename является правильно загруженным файлом, но не может быть перемещён по каким-то причинам, акции не будет, а move_uploaded_file() возвратит FALSE. Кроме того, будет выдано предупреждение.

Этот вид проверки особенно важен, если имеется вероятность того, что какие-нибудь действия с загруженными файлами могут сделать его содержимое доступным пользователю или даже другим пользователям в той же системе.

Примечание: если safe mode включён, PHP проверяет, имеют ли файл(ы)/директории, с которыми вы собираетесь работать, тот же UID, что и выполняемый скрипт.

Примечание: на move_uploaded_file() не действуют нормальные safe-mode UID-ограничения. Это не опасно, поскольку move_uploaded_file() работает только с файлами, загруженными через PHP.

Функция copy не делает вышесказанного.

>этот фаил отвечает и за вывод изображений на сайте из определенной папки, и также за вывод и редактирование в админке

О каком файле речь, о вашем скрипте?
Загрузка изображения и вывод его, это кардинально разные задачи. Загрузка производится однократно и одним пользователем, а вывод запрашивают многократно и многие пользователи, и механизм этих процессов как небо и земля.... Да и не видно у вас тут никакого вывода.
Редактирование в админке уже загруженного файла может означать только его удаление или перемещение в другую папку. Другого просто не может быть (не считая работы с файлом средствами GD). Что совмещать здесь?

Вы можете ответить на вопрос - зачем вы гоняете цикл возможных ошибок загрузки? Если файл загружен успешно, $_FILES["newfile"]["error"] что возвращает?
Вместо того, чтобы гонять попусту этот цикл, вы бы лучше обрабатывали эти ошибки, и выдавали пользователю информацию о них. Вы же этого не делаете, и не понятно, для чего вы его "крутите"....

Загрузка:
1. Есть запрос от формы с загрузкой файла.
2. Нет ошибок загрузки (ответьте на вопрос выше)?
3. Ошибок нет. Каталог существует?
4. Если каталог не существует, создаем и перемещаем в него загруженное изображение. Если существует, просто перемещаем.
5. Перенаправление при ОК.
6. Если были ошибки загрузки, возвращаем форму пользователю с ошибками.

Под каким ID, и что это за ID, и почему от этого проблемы мне не ведомо. Но всегда можно решить любую проблему, если подходить к ее решению обдуманно.

  Ответить  
 
 автор: nikolai   (26.11.2009 в 11:55)   письмо автору
 
   для: sim5   (26.11.2009 в 04:39)
 

Sim5
В чем разница между copy и move_uploaded_file я уже читал на сайте, который вы давали выше. Все равно Спасибо за повторное обьяснение.

О каком файле речь, о вашем скрипте?
О пхп файле, в котором я и редактирую этот кусочек кода.

.... Да и не видно у вас тут никакого вывода.
Я устал повторять, что это кусок кода. Зачем мне весь код выкладывать, если у меня был поставлен вопрос только о конкретной задаче. Если желаете видеть весь код, то могу его выставить.

зачем вы гоняете цикл возможных ошибок загрузки?
http://www.php.net/manual/en/function.move-uploaded-file.php
На сайте есть пример. Я скопировал и перенес к себе.

  Ответить  
 
 автор: Trianon   (26.11.2009 в 12:10)   письмо автору
 
   для: nikolai   (26.11.2009 в 11:55)
 

<?
  
if(sizeof($_FILES)>&& !empty($_FILES['newfile']) && empty($_FILES['newfile']['error']))  
            {  
                
/* $file = get_filename($dir, $_FILES['newfile']['name']); 
                copy($_FILES['newfile']['tmp_name'], $dir.$file); 
                header('Location: ?obj=struct&id='.$cur_id.'&lng='.$language);  */ 


                
foreach ($_FILES["newfile"]["error"] as $key => $error) { 
                


Здесь путаница в логике.
Если у Вас empty($_FILES['newfile']['error']) то нет смысла пытаться работать с $_FILES["newfile"]["error"]? и уж тем более - делать по нему цикл, считая его за массив.
Кроме того, массивом этот элемент будет лишь при нескольких файловых полях в форме, а у Вас поле явно лишь одно.

Ну и еще замечу, что вызов header('Location:...') вообще-то прямо не приводит к прекращению исполнения текущего файла. Это нужно сделать явным образом, иначе побочные эффектоы будете потом искать тяжело и долго.

  Ответить  
 
 автор: nikolai   (26.11.2009 в 13:16)   письмо автору
 
   для: Trianon   (26.11.2009 в 12:10)
 

[поправлено модератором]

  Ответить  
 
 автор: Slo_Nik   (25.11.2009 в 16:09)   письмо автору
 
   для: nikolai   (25.11.2009 в 15:12)
 

если в начале скрипта не выставлен уровень ошибок, то сделайте это, посмотрите, что выдаст Вам.
error_reporting(E_ALL);

  Ответить  
 
 автор: sim5   (25.11.2009 в 14:09)   письмо автору
 
   для: nikolai   (25.11.2009 в 13:54)
 

http://www.php.net/manual/en/function.move-uploaded-file.php

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования