Одесса: 8°С (вода 9°С)
Киев: 3°С
Львов: 4°С

Тема: отобразить фалы с каталога на странице.

Ответить в теме
Страница 1 из 2 1 2 ПоследняяПоследняя
Показано с 1 по 20 из 21
  1. Вверх #1

    По умолчанию отобразить фалы с каталога на странице.

    Все доброго времени суток. Есть денвер, html-страница. В папке со страницей есть каталог (скажем test), в этом каталоге есть еще пара папок в которых pdf-файлы. Цель - при добавлении файла в каталог нужно, чтоб он отобразился на странице. Как реализовать сию идею? Знаю только html и css. Если можно, помогите со сценарием на php или js, и как его вписать в код. Весь день шерстю просторы нэта, но решение вопроса не нашел.


  2. Вверх #2
    Посетитель Аватар для phoenix78
    Пол
    Мужской
    Возраст
    39
    Сообщений
    103
    Репутация
    33
    Здесь и здесь все есть.
    На случай если у нас разные гуглы готовый результат 1, 2, 3.

  3. Вверх #3
    спс. разобрался. возник вопрос.
    $dir="$dir2012/$file";

    if (is_dir($dir))
    {
    if ($dh1 = opendir($dir))
    {
    while (($file1 = readdir($dh1)) !== false)
    {
    if(($file1 !=".") && ($file1 !=".."))
    echo '<a href="'.$dir.'/'.$file1.'">'.$file1.'</a>';
    }
    closedir($dh1);
    }
    }

    }
    Это кусок кода, отображающего файлы. в одной из папок директории есть pdf файлы. когда строку if(($file1 !=".") && ($file1 !="..")) изменяю на if(($file1 !=".") && ($file1 !="..") && ($file1 =="*.pdf")) - файлы не отображаются. В чем причина???

  4. Вверх #4
    Не покидает форум Аватар для Fallout
    Пол
    Мужской
    Сообщений
    6,915
    Репутация
    795
    Цитата Сообщение от covenanter Посмотреть сообщение
    когда строку if(($file1 !=".") && ($file1 !="..")) изменяю на if(($file1 !=".") && ($file1 !="..") && ($file1 =="*.pdf")) - файлы не отображаются. В чем причина???
    А разве в этом случае сработает маска так просто? В $file1 как я понимаю имя файла лежит и сравнивается просто с той маской, а не фильтруется по ней. Там по идее какую то регулярку или аналог endwith если в ПХП есть такой вставить

  5. Вверх #5
    Посетитель Аватар для phoenix78
    Пол
    Мужской
    Возраст
    39
    Сообщений
    103
    Репутация
    33
    не буду давать сразу код, т.к. это помешает Вашему развитию
    вот несколько подсказок:
    1. если бы вы сделали файл с именем "*.pdf" (такое имя допустимо под Linux), то Ваш код бы отобразил этот файл. Чтобы понять разницу советую почитать про операторы в целом и конкретно про операторы сравнения.
    2. решений возможно по крайней мере два, см. ответ Fallout. Для использования регулярных выражений подойдет php функция preg_match. Насчет второго варианта...в php нет аналога джавовского метода endsWith(), но того же результата можно добиться сравнивая подстроки. Вам понадобятся php функции substr и strlen.

    Удачи

  6. Вверх #6
    спс. сам не разобрался. нашел готовое условие и сделал под себя) && (strtolower(substr($file1, strlen($file1)-4, 4))=='.pdf')

  7. Вверх #7
    В данном случае не выводятся каталоги.
    (($file1 !=".") && ($file1 !="..") && (is_dir($file1))) не работает. Как можно решить отображение каталогов?

  8. Вверх #8
    нууууу, товарищи!!!!! мастера!!! хелп.

  9. Вверх #9
    Посетитель Аватар для phoenix78
    Пол
    Мужской
    Возраст
    39
    Сообщений
    103
    Репутация
    33
    Я не вижу у этого кода причин, чтобы не работать. Скорее он не работает так, как Вы ожидаете ))... но мы же не экстрасенсы. Дайте больше кода и описание, что вы ожидаете отфильтровывать этим условием, только папки или папки и файлы.

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

  11. Вверх #11
    Посетитель Аватар для phoenix78
    Пол
    Мужской
    Возраст
    39
    Сообщений
    103
    Репутация
    33
    Цитата Сообщение от covenanter Посмотреть сообщение
    сейчас код не скину (нет доступа к компу)
    без полного кода это пустые разговоры. Код в Вашей цитате выводит все папки и файлы без фильтра по типу файла
    Цитата Сообщение от covenanter Посмотреть сообщение
    (($file1 !=".") && ($file1 !="..") && (is_dir($file1)))
    Что Вы дописали, но не показали, я могу только догадываться.
    Учитывая другие комментарии скорее всего что то вроде (($file1 !=".") && ($file1 !="..") && (strtolower(substr($file1, strlen($file1)-4, 4))=='.pdf') && (is_dir($file1)))
    В этом случае ошибка в операторе && для is_dir, следовало использовать ||.
    Вот Вам готовый код, чтобы уже не возвращаться к этому вопросу. Я упорядочил условия по смыслу
    PHP код:
    if ((is_dir($file1) && $file1 != "." && $file1 != "..") || strtolower(substr($file1strlen($file1)-44))=='.pdf') {


    А вообще у меня два совета.
    1. прочитайте хотя бы один самый тоненький учебник по языку, который собираетесь использовать. Это даст вам понимание основных принципов и избавит остальных от примитивных вопросов.
    2. задавайте вопросы с предоставлением максимального количества информации. Цените время тех, кто Вам помогает.
    Можете не следовать, но в этом случае не обижайтесь, что никто не помогает ))

    Удачи

  12. Вверх #12
    <?php
    $dir2012="orders/2012";
    $dir2=1;


    if (is_dir($dir2012))
    {
    if ($dh = opendir($dir2012))
    {
    while (($file = readdir($dh)) !== false)
    {
    if(($file !=".") && ($file !=".."))
    {
    echo '<div onClick="shiftSubDiv('.$dir2.')"><span><img width=20px src="../images/pictures/orders1.jpg" />'.$file.'</span></div>
    <div id="subDiv'.$dir2.'" style="display:none"><ul>';

    $dir="$dir2012/$file";

    if (is_dir($dir))
    {
    if ($dh1 = opendir($dir))
    {
    while (($file1 = readdir($dh1)) !== false)
    {

    if(($file1 !=".") && ($file1 !="..") && (strtolower(substr($file1, strlen($file1)-4, 4))=='.pdf'))
    echo '<li><img width=20px src="../images/pictures/orders_pdf.jpg" /><a href="'.$dir.'/'.$file1.'">'.$file1.'</a></li>';

    if(($file1 !=".") && ($file1 !="..") && (strtolower(substr($file1, strlen($file1)-4, 4))=='.txt'))
    echo '<li><img width=20px src="../images/pictures/orders_txt.jpg" /><a href="'.$dir.'/'.$file1.'">'.$file1.'</a></li>';

    if(($file1 !=".") && ($file1 !="..") && (strtolower(substr($file1, strlen($file1)-4, 4))=='.jpg'))
    echo '<li><img width=20px src="../images/pictures/orders_jpg.jpg" /><a href="'.$dir.'/'.$file1.'">'.$file1.'</a></li>';

    if(($file1 !=".") && ($file1 !="..") && (is_dir($file1)))
    echo '<li><img width=20px src="../images/pictures/orders1.jpg" /><a href="'.$dir.'/'.$file1.'">'.$file1.'</a></li>';

    }
    closedir($dh1);
    }
    }
    echo '</ul></div>';

    $dir2++;
    }
    }
    closedir($dh);
    }
    }

    ?>

    Вставлен еще js для закрытия/открытия списка файлов (делаю как умею). Работает все, как нужно. но если в папке $file есть еще папки, то они не отображаются... Из полномасштабных руководств прочел пока только "Котеров,Костарев - PHP 5.2". Прошу меня простить, но опыт приходит со временем.

  13. Вверх #13
    Не покидает форум Аватар для Fallout
    Пол
    Мужской
    Сообщений
    6,915
    Репутация
    795
    Стоит попробовать скормить is_dir более точный путь. dir + file1

  14. Вверх #14
    не помогло...

  15. Вверх #15
    Посетитель Аватар для phoenix78
    Пол
    Мужской
    Возраст
    39
    Сообщений
    103
    Репутация
    33
    О мои глаза... Немного конструктивной критики:
    • Зачем одни и те же условия проверять столько раз? Выносите результаты в переменные
    • Зачем выполнять несколько if подряд? Разве файл может быть одновременно и ".txt" и ".pdf"? Используйте например конструкции типа if () {} else if (){} else if() {}... или даже switch. Это выкинет ненужные операции, уменьшит нагрузку на ЦПУ да и просто сделает код более понятным.
    • Зачем "display:none"? вы же не увидите результат... впрочем возможно это свойство меняется вашим джава скриптом, который мы не видим
    • Для php кода есть специальный BB код на форуме. Используйте его хотя бы когда вставляете большие куски кода. В расширенном редактировании сообщения это эмблемка с надписью php
    • выносите функционал в отдельные функции для повторного использования и просто по смыслу. Не делайте одну простыню с десятью уровнями if.
    • Для if привыкайте всегда использовать необязательные фигурные скобки. Это хороший стиль и вообще делает код более читаемым.
    • Отмечайте вложенность блоков с помощью отступов.
    • И да... is_dir должно содержать полный путь is_dir($dir."/".$file1).

    Сильно не расстраиваетесь. Все через это проходят, но учебник все таки почитайте внимательнее ))

    Отловить здесь все логические ошибки выше моих сил... я немного перепишу Ваш пример так, как я понимаю задачу... Если не полностью угадаю, поправите под себя. Выложу где то через час...

  16. Вверх #16
    Посетитель Аватар для phoenix78
    Пол
    Мужской
    Возраст
    39
    Сообщений
    103
    Репутация
    33
    я заменил два while рекурсией с указанием уровня вложенности. В Вашем примере было два уровня. "display:none" убрал. Остальное переписано с Вашего примера. Оно?
    PHP код:
    <?php 
    $start_dir
    ="orders/2012";
    $max_level 2// максимальная глубина вложенности

    printDir($start_dir$max_level);

    function 
    printDir($dir$max_level$level 1) { 
        if (
    is_dir($dir)) {     
            if (
    $dh opendir($dir)) { 
                echo 
    '<div onClick="shiftSubDiv('.$level.')"><span><img width=20px src="../images/pictures/orders1.jpg" />'.basename($dir).'</span></div>';
                echo 
    '<div id="subDiv'.$level.'"><ul>';            
                while ((
    $file readdir($dh)) !== false)  {    
                    if(
    is_dir($dir."/".$file)) {
                        if (
    $file != "." && $file != "..") {
                            if (
    $level <= $max_level) {
                                
    // печатаем вложенные файлы
                                
    printDir($dir."/".$file$max_level, ++$level);
                            }else {
                                
    // печатаем только имя папки
                                
    $img_file "orders1.jpg";                
                            }    
                        } else {
                            
    // игнорируем текущую папку и ссылку на верхний уровень
                            
    $img_file "";    
                        }
                    } else {
                        
    $img_file selectFileIcon($file);
                    }
                    if (
    strlen($img_file) > 0) {
                        echo 
    '<li><img width=20px src="../images/pictures/'.$img_file.'" /><a href="'.$dir.'/'.$file.'">'.$file.'</a></li>';
                    }
                } 
                
    closedir($dh); 
                echo 
    '</ul></div>'
            } 
        } 


    function 
    selectFileIcon($file_name) { 
        
    $icon "";
        
    $ext strtolower(substr($file_name, -4));
        switch (
    $ext) {
            case 
    ".pdf":
            case 
    ".txt":
            case 
    ".jpg":
                
    $icon "orders_".substr($ext,-3).".jpg"
                break;
            default:
                
    $icon ""
        }
        return 
    $icon;
    }
    ?>

  17. Вверх #17
    Новичок
    Пол
    Мужской
    Возраст
    37
    Сообщений
    20
    Репутация
    11
    <в качестве бреда>
    а если будет симлинк на один из родительских каталогов? =)
    </в качестве бреда>

    Цитата Сообщение от phoenix78 Посмотреть сообщение
    я заменил два while рекурсией с указанием уровня вложенности. В Вашем примере было два уровня. "display:none" убрал. Остальное переписано с Вашего примера. Оно?

  18. Вверх #18
    Посетитель Аватар для phoenix78
    Пол
    Мужской
    Возраст
    39
    Сообщений
    103
    Репутация
    33
    1. Глубина рекурсии не бесконечная. В примере это "$max_level=2;". Так что ничего страшного не призойдет.
    2. Если админ сервера сам себе злобный буратино, то он всегда найдет способ поиметь проблем

  19. Вверх #19
    "display:none" чтоб не отображался маркер списка. phoenix78, Ваш код все отображает, но мой при помощи js все прячет и отображает только при клике на директорию. С Вашим тоже можно так сделать, но сил уже нет на это). Это мой первый код, переделывать не буду. В дальнейшем обязательно учту Ваши советы. Вложенность я в своем коде соблюдал, но при вставке в сообщение она кудато пропала). Котерова еще не раз прочту)

  20. Вверх #20
    Новичок
    Пол
    Мужской
    Возраст
    37
    Сообщений
    20
    Репутация
    11
    Цитата Сообщение от phoenix78 Посмотреть сообщение
    1. Глубина рекурсии не бесконечная. В примере это "$max_level=2;". Так что ничего страшного не призойдет.
    2. Если админ сервера сам себе злобный буратино, то он всегда найдет способ поиметь проблем
    такие линки это вполне нормальная ситуация
    я бы просто на is_link проверил
    тем более что max_level это не константа и кто то может не вникая в сам метод спокойно поставить туда INT_MAX какой-нибудь...


Ответить в теме
Страница 1 из 2 1 2 ПоследняяПоследняя

Метки этой темы

Социальные закладки

Социальные закладки

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения