За последние 24 часа нас посетили 18902 программиста и 1708 роботов. Сейчас ищут 892 программиста ...

Копирование файлов в папку с пробелом

Тема в разделе "Прочие вопросы по PHP", создана пользователем nikitOScher, 6 фев 2012.

  1. nikitOScher

    nikitOScher Активный пользователь

    С нами с:
    19 дек 2011
    Сообщения:
    38
    Симпатии:
    0
    Здравствуйте, знатоки.
    У меня возникла проблема с копированием файлов, все работает нормально, но только до того момента, пока я не пробую копировать в папку с пробелом в названии.
    Код (PHP):
    1. if ($_POST['album']) {  //$_POST['album'] - имя папки, куда копировать
    2.  
    3.     preg_match('/\.([a-zA-Z]+?)$/', $_POST['photo'], $matches);
    4.  
    5.         if(in_array(strtolower($matches[1]), $accepted)) {
    6.  
    7.             $movedfilename = md5_file($_POST['photo']);  // $_POST['photo'] - полный путь до исходного файла
    8.             $source = "$_POST[photo]";  // исходный путь картинки
    9.             $sourcet = "$_POST[thumb]";  // исходный путь миниатюры
    10.             $dest = "$userdata[user_id]/".$_POST[album]."/$movedfilename.$matches[1]";  // конечный путь картинки (здесь путь: ID_юзера/название_альбома/название_файла.расширение)
    11.             $destt = "$userdata[user_id]/".$_POST[album]."/thumbnails/$movedfilename"."Thumb".".$matches[1]";  // конечный путь миниатюры (здесь путь: ID_юзера/название_альбома/название_файлаThumb.расширение)
    12.             if ("$source" == "$dest") { echo 'Вы перемещаете файл в то же место, откуда взяли'; die();}
    13.             if ("$sourcet" == "$destt") { echo 'Вы перемещаете файл миниатюры в то же место, откуда взяли'; die();}
    14.             if(!copy($source, $dest)) echo 'Не удалось переместить изображение';
    15.             if(!copy($sourcet, $destt)) echo 'Не удалось переместить миниатюру';
    16.             $status = @unlink($_POST['photo']) or exit("Невозможно удалить картинку, скорее всего ее не существует");
    17.             $statust = @unlink($_POST['thumb']) or exit("Невозможно удалить миниатюру, скорее всего ее не существует");
    18.             header("Location: myimages.php");
    19.         }
    20.  
    21. } 
    Если мой альбом называется "ТЕСТ", то все окей, если же я назову альбом "ТЕСТ ТЕСТ", то в эту папку копирование не происходит, причем нет никаких ошибок, скрипт выполняется полностью вплоть до последней строки с редиректом.

    upd. p.s.
    мда, конечно, огорчает код без подсветки синтаксиса
    upd2. спасибо, нашлась подсветка
     
  2. siiXth

    siiXth Активный пользователь

    С нами с:
    14 мар 2010
    Сообщения:
    1.447
    Симпатии:
    1
     
  3. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    на винде путь с пробелами в кавычки берут и все ок вроде
     
  4. asokol

    asokol Активный пользователь

    С нами с:
    17 янв 2012
    Сообщения:
    162
    Симпатии:
    0
    Попробуйте %20 вместо пробелов или экранировать слешем "\ ".
     
  5. nikitOScher

    nikitOScher Активный пользователь

    С нами с:
    19 дек 2011
    Сообщения:
    38
    Симпатии:
    0
    я думал, что из кода, где пути написаны с использованием "/", будет понятно, что виндой тут не пахнет
    то есть? во время создания папки на сервере? или в скрипте копирования? я не совсем понял реализации
     
  6. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    я с виндой не работал на пхп. но мне что-то кажется, что виндовые слеши на линухе не пашут, а линуховые на винде пашут, вот...

    все равно попробуй кавычки =)
     
  7. nikitOScher

    nikitOScher Активный пользователь

    С нами с:
    19 дек 2011
    Сообщения:
    38
    Симпатии:
    0
    если вы имели в виду сделать так:
    Код (PHP):
    1. if(!copy("$source", "$dest")) ...многобукав... 
    результат тот же. Мне что-то подсказывает, что я вас не понимаю.
     
  8. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    copy("\"$source\"", "\"$dest\"")
     
  9. nikitOScher

    nikitOScher Активный пользователь

    С нами с:
    19 дек 2011
    Сообщения:
    38
    Симпатии:
    0
    к сожалению, не помогло. результат идентичен
     
  10. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    :D
     
  11. asokol

    asokol Активный пользователь

    С нами с:
    17 янв 2012
    Сообщения:
    162
    Симпатии:
    0
    Код (PHP):
    1. $dest = str_replace(' ', '%20', $dest);
    2. // или
    3. $dest = str_replace(' ', '\ ', $dest); 
     
  12. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    или
    $dest = str_replace(' ', '\\ ', $dest);
     
  13. nikitOScher

    nikitOScher Активный пользователь

    С нами с:
    19 дек 2011
    Сообщения:
    38
    Симпатии:
    0
    Ни один из предложенных вариантов не помогает, результат все тот же...
    Особенная надежда появилась, когда увидел
    Код (PHP):
    1. $dest = str_replace(' ', '%20', $dest); 
    но увы...

    Добавлено спустя 27 минут 23 секунды:
    Сразу прошу прощения за отдельный пост, а не совмещение.
    Вообщем, проблема решена. Кому-то ошибка может показаться глупой, но все-таки она имела место и, думаю, найдутся люди, кому будет интересно что делать в подобной ситуации.
    Косяк был не в самом скрипте копирования, там я все оставил без изменений, как в первом посте.
    Проблема была тут:
    Код (PHP):
    1. 1. $alb = mysql_query("SELECT name FROM albums WHERE userid = $userdata[user_id]");
    2. 2.    while ($row = mysql_fetch_assoc($alb)) {
    3. 3.        $album = $row['name'];
    4. 4.        print ("<option value=$album>$album</option>");
    5. 5.    } 
    А именно в 4 строке. Я случайно обратил внимание на то, что в результате value=test вместо value=test test. Чтобы было правильно, нужно писать
    Код (PHP):
    1. 4.        print ("<option value='".$album."'>$album</option>"); 
     
  14. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    лучше б ты номерки использовал а не строки.
     
  15. nikitOScher

    nikitOScher Активный пользователь

    С нами с:
    19 дек 2011
    Сообщения:
    38
    Симпатии:
    0
    ну да, я уже потом подумал, что в базе надо было создавать еще поле alb_id, но раз уж все решилось так, то лучше пусть будет как есть, меньше полей, наверное, к лучшему
     
  16. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    тут не оч понятно, что будет, если кто-то пропишет ручками иное значение...
     
  17. nikitOScher

    nikitOScher Активный пользователь

    С нами с:
    19 дек 2011
    Сообщения:
    38
    Симпатии:
    0
    ничего не произойдет, есть проверка со сравнением id владельца альбома и id юзера.