Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Поиск файла по папкам с многократным вложением.

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
Scan
Отправлено: 10 Октября, 2016 - 16:08:22
Post Id



Новичок


Покинул форум
Сообщений всего: 5
Дата рег-ции: Окт. 2016  


Помог: 0 раз(а)




Здравствуйте, есть один скрипт, нашел его через гугл, не могу понять почему он ищет файл только в том случаи, если он находится в текущем каталоге($folderName)

PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. /* Поиск файла по имени во всех папках и подпапках
  4. *
  5. * @param string $folderName - пусть до папки
  6. * @param string $fileName - искомый файл
  7. */
  8. function search_file($folderName, $fileName){
  9.     // открываем текущую папку
  10.     $dir = opendir($folderName);
  11.     // перебираем папку
  12.     while (($file = readdir($dir)) !== false){ // перебираем пока есть файлы
  13.         if($file != "." && $file != ".."){ // если это не папка
  14.             if(is_file($folderName."/".$file)){ // если файл проверяем имя
  15.                 // если имя файла нужное, то вернем путь до него
  16.                 if($file == $fileName) return $folderName."/".$file;
  17.             }
  18.             // если папка, то рекурсивно вызываем search_file
  19.             if(is_dir($folderName."/".$file)) return search_file($folderName."/".$file, $fileName);
  20.         }
  21.     }
  22.     // закрываем папку
  23.     closedir($dir);
  24. }
  25.  
  26.  
  27. // пример использования
  28. $folderName = "docs"; // в какой папке ищем
  29. $fileName = "file.pdf"; // что ищем
  30. $result = search_file($folderName, $fileName);
  31. if($result){
  32.     echo $result;
  33. }else{
  34.     echo "Нет такого файла";
  35. }
  36.  
  37. ?>
  38.  


Вообще у меня задача простая, есть папка docs в корне веб сервера, нужно чтобы download.php?file=file.pdf искал по всем подкаталогам docs и отдавал файл на скачку, если он существует. Буду благодарен за помощь.
 
 Top
Fart
Отправлено: 11 Октября, 2016 - 23:52:35
Post Id



Посетитель


Покинул форум
Сообщений всего: 324
Дата рег-ции: Июль 2016  


Помог: 10 раз(а)




$folderName = "docs"; // в какой папке ищем

разве не это ответ?
 
 Top
Scan
Отправлено: 12 Октября, 2016 - 15:00:19
Post Id



Новичок


Покинул форум
Сообщений всего: 5
Дата рег-ции: Окт. 2016  


Помог: 0 раз(а)




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

PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. $f='1.txt';
  4. $dirname='docs';
  5. $count=0;
  6. $dir = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dirname), TRUE);
  7.  foreach ($dir as $file)
  8. {
  9.         if (is_file($file)){
  10.                 if(basename($file)==$f){
  11.     header('Content-Description: File Transfer');
  12.     header('Content-Type: application/octet-stream');
  13.     header('Content-Disposition: attachment; filename=' . basename($file));
  14.     header('Content-Transfer-Encoding: binary');
  15.     header('Expires: 0');
  16.     header('Cache-Control: must-revalidate');
  17.     header('Pragma: public');
  18.     header('Content-Length: ' . filesize($file));
  19.     // читаем файл и отправляем его пользователю
  20.     readfile($file);
  21.        
  22.         $count++;
  23.         break;
  24.                 }
  25.        
  26.         }
  27.                
  28. }
  29. if ($count==0){
  30.                 echo 'Такого файла нету';
  31.         }
  32.  
  33.  
  34. ?>
  35.  
  36.  

(Отредактировано автором: 12 Октября, 2016 - 15:28:29)

 
 Top
Scan
Отправлено: 19 Октября, 2016 - 16:09:27
Post Id



Новичок


Покинул форум
Сообщений всего: 5
Дата рег-ции: Окт. 2016  


Помог: 0 раз(а)




Еще вопрос. Если в названии файла оказывается несколько слов, ну напр. "Файл файл.txt", тогда в окне сохранения он не предлагает расширение по умолчанию и сохраняет только первое слово из названия, т.е. после сохранения мой файл будет выглядеть как "Файл" - без расширения. Как это исправить?
 
 Top
Мелкий Супермодератор
Отправлено: 19 Октября, 2016 - 16:37:38
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Ошибка формирования заголовка, RFC нарушаете.

PHP:
скопировать код в буфер обмена
  1. header('Content-Disposition: attachment; filename=' . urlencode(basename($file)));


-----
PostgreSQL DBA
 
 Top
Scan
Отправлено: 21 Октября, 2016 - 13:08:42
Post Id



Новичок


Покинул форум
Сообщений всего: 5
Дата рег-ции: Окт. 2016  


Помог: 0 раз(а)




Мелкий пишет:
Ошибка формирования заголовка, RFC нарушаете.

PHP:
скопировать код в буфер обмена
  1. header('Content-Disposition: attachment; filename=' . urlencode(basename($file)));

Спасибо Мелкий, еще была проблема с кириллицей и пробелами, допилил все вроде бы в норме теперь.

PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. $f=mb_convert_encoding($_GET['fname'],"Windows-1251","UTF-8");
  4. $dirname='test';
  5. $count=0;
  6.  
  7. // Транслитерация строк.
  8. function transliterate($st) {
  9.   $st = strtr($st,
  10.     "абвгдежзийклмнопрстуфыэАБВГДЕЖЗИЙКЛМНОПРСТУФЫЭ",
  11.     "abvgdegziyklmnoprstufieABVGDEGZIYKLMNOPRSTUFIE"
  12.   );
  13.   $st = strtr($st, array(
  14.     'ё'=>"yo",    'х'=>"h",  'ц'=>"ts",  'ч'=>"ch", 'ш'=>"sh",  
  15.     'щ'=>"shch",  'ъ'=>'',   'ь'=>'',    'ю'=>"yu", 'я'=>"ya",
  16.     'Ё'=>"Yo",    'Х'=>"H",  'Ц'=>"Ts",  'Ч'=>"Ch", 'Ш'=>"Sh",
  17.     'Щ'=>"Shch",  'Ъ'=>'',   'Ь'=>'',    'Ю'=>"Yu", 'Я'=>"Ya",
  18.         ' '=>"_",
  19.   ));
  20.   return $st;
  21. }
  22.  
  23.  
  24.  
  25. $dir = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dirname), TRUE);
  26.  foreach ($dir as $file)
  27. {
  28.         if (is_file($file)){
  29.                 if(basename($file)==$f){
  30.     header('Content-Description: File Transfer');
  31.     header('Content-Type: application/octet-stream');
  32.     header('Content-Disposition: attachment; filename='. urlencode(transliterate(basename($file))));
  33.     header('Content-Transfer-Encoding: binary');
  34.     header('Expires: 0');
  35.     header('Cache-Control: must-revalidate');
  36.     header('Pragma: public');
  37.     header('Content-Length: ' . filesize($file));
  38.    
  39.     readfile($file);
  40.        
  41.         $count++;
  42.         exit;
  43.                 }
  44.        
  45.         }
  46.                
  47. }
  48. if ($count==0){
  49.                 echo 'Такого файла нету';
  50.         }
  51.  
  52.  
  53. ?>
  54.  

(Отредактировано автором: 30 Января, 2017 - 14:02:25)

 
 Top
Scan
Отправлено: 30 Января, 2017 - 14:05:41
Post Id



Новичок


Покинул форум
Сообщений всего: 5
Дата рег-ции: Окт. 2016  


Помог: 0 раз(а)




Подскажите что может быть не так со скриптом выше, файлы отдает, но при попытке открыть пишет - неожиданный конец архива или файл повреждён?
(Добавление)
Все, разобрался, там ставил строку echo "идет поиск файла...", хотел чтобы он ее в браузере показывал, а он, оказывается, ее в начало скачиваемого файла тулил, хе-хе.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB