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

Форум PHP

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

 

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

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

тема: Проблема с пробелом при скачивании файла
 
 автор: Pit0n   (22.11.2006 в 11:54)   письмо автору
 
 

Занялся движком для mp3 сайта, уже сделал навигацию по папкам, подсчет объема папок, время и т.д. Но столкнулся с пропблемой, дело в том, что если исходный файл(для скачивания) содержит пробел в названии, то путь к нему указывается только до пробела (напр. файл "track number_1.mp3", в пути к нему будет только "track".. а остальная часть теряется) Возможно ли как нибудь в принципе решить проблему или необходимо вручную переименовывать все файлы, либо писать скрипт для переименования?

   
 
 автор: cheops   (22.11.2006 в 13:16)   письмо автору
 
   для: Pit0n   (22.11.2006 в 11:54)
 

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

   
 
 автор: Pit0n   (22.11.2006 в 13:23)   письмо автору
 
   для: cheops   (22.11.2006 в 13:16)
 

Можно небольшой примерчик?

   
 
 автор: cheops   (22.11.2006 в 13:25)   письмо автору
 
   для: Pit0n   (22.11.2006 в 13:23)
 

Можно
<?php
  $name 
"имя файла.mp3";
  echo 
"<a href=".urlencode($name).">$name</a>";
?>

   
 
 автор: Pit0n   (23.11.2006 в 13:49)   письмо автору
 
   для: cheops   (22.11.2006 в 13:25)
 

В чем проблема? Ссылка и путь вроде работает и показывает верно, но при нажатии ссылки, сервер говорит, что файл не существует. Как будто функция urlencode "портит" ссылку. Хотя вроде все правильно и смысл функции понятен. Или после передачи ссылки нужно обратно преобразовывать знак "+" на пробел?

   
 
 автор: babilonian   (23.11.2006 в 14:03)   письмо автору
 
   для: Pit0n   (23.11.2006 в 13:49)
 

А ЧПУ на сайте есть? Может реврайт рубит? Или как вариант выгрузка из папки закрыта. Если есть .htacсess, то стоит его пересмотреть.

   
 
 автор: Pit0n   (23.11.2006 в 14:08)   письмо автору
 
   для: babilonian   (23.11.2006 в 14:03)
 

Проверяю на локалхосте без .htaccess, а если убираю фильтрацию urlencode, то закачка идет нормально, тех файлов, которые без пробелов.

   
 
 автор: babilonian   (23.11.2006 в 14:11)   письмо автору
 
   для: Pit0n   (23.11.2006 в 14:08)
 

А почему в процессе загрузки не менять пробел на подчеркивание?

   
 
 автор: Pit0n   (23.11.2006 в 14:23)   письмо автору
 
   для: babilonian   (23.11.2006 в 14:11)
 

Хочу сделать универсальный движок для любых mp3, чтоб не менять у всех пробелы, или проще сделать скрипт для замены пробелов на подчеркивание у файлов? Ведь "urlencode" на дает качать даже файлы без пробелов, кричит что его нет

   
 
 автор: Pit0n   (23.11.2006 в 14:26)   письмо автору
 
   для: Pit0n   (23.11.2006 в 14:23)
 

Понятно, когда ссылка передается браузеру то в строке вместо знаков - "/" передается его код - "%2F", но это не решает проблему

   
 
 автор: Trianon   (23.11.2006 в 14:58)   письмо автору
 
   для: Pit0n   (23.11.2006 в 14:26)
 

Вам предложили urlencod'ить имя файла, а вовсе даже не путь к нему. Путь, я надеюсь, у Вас без пробелов и прочей нечисти?

   
 
 автор: Pit0n   (23.11.2006 в 15:01)   письмо автору
 
   для: Trianon   (23.11.2006 в 14:58)
 

Само собой что путь нормальный, но ведь скрипт представленный в 4 сообщении у меня не работает, пишет туже ошибку

   
 
 автор: Trianon   (23.11.2006 в 15:08)   письмо автору
 
   для: Pit0n   (23.11.2006 в 15:01)
 

как он у Вас выглядит? Полное имя файла и скрипт - применительно к нему.

   
 
 автор: Pit0n   (23.11.2006 в 15:12)   письмо автору
 
   для: Trianon   (23.11.2006 в 15:08)
 

Вот скрипт:
<?php
$name = "1 2.mp3";
echo "<a href=".urlencode($name).">$name</a>";
?>
а вот файл: 1 2.mp3
Файл и скрипт лежат в корне localhost

   
 
 автор: Trianon   (24.11.2006 в 10:15)   письмо автору
 
   для: Pit0n   (23.11.2006 в 15:12)
 

попробуйте
<?php
$name 
"1 2.mp3";
echo 
"<a href=\"".rawurlencode($name).\"">$name</a>";
?>

   
 
 автор: Pit0n   (24.11.2006 в 10:48)   письмо автору
 
   для: Trianon   (24.11.2006 в 10:15)
 

Ага получилось вот таким образом:

<?php
$name = "1 2.mp3";
echo "<a href=".rawurlencode($name).">$name</a>";
?>

А как быть с кодировкой?

   
 
 автор: Trianon   (24.11.2006 в 10:50)   письмо автору
 
   для: Pit0n   (24.11.2006 в 10:48)
 

как Вы получаете такое имя? Откуда вообще берется имя файла?

   
 
 автор: Pit0n   (24.11.2006 в 11:11)   письмо автору
 
   для: Trianon   (24.11.2006 в 10:50)
 

Сканирую директорию, названия скидиваю в массив, а затем оттуда достаю и делаю из них ссылки. Та же проблема и с директориями на русском, даже если файл на английском

   
 
 автор: Trianon   (24.11.2006 в 11:24)   письмо автору
 
   для: Pit0n   (24.11.2006 в 11:11)
 

Это всё слова. Скрипт показывайте.

   
 
 автор: Pit0n   (24.11.2006 в 11:36)   письмо автору
 
   для: Trianon   (24.11.2006 в 11:24)
 

Вот он..


<?php
            $lang 
$_GET['lang']; //русские или ангийские
            
$lang_start $lang;
            
$letter $_GET['letter']; //какая буква
            
$letter_start $letter;
            
$element_name $_GET['element_name'];
            if(!empty(
$element_name)) $letter $letter."/".$element_name;
            if(empty(
$lang)){echo "неверные параметры"; exit;} //проверка на верность
            
if(empty($letter)){echo "неверные параметры"; exit;} //проверка на верность
            
$path "music/$lang/$letter"//открываем нужную директорию
            
$path_1 "music\\$lang\\$letter";
            
$dir_music opendir("$path");
            
            
// записываем все элементы директории в массив
                 // Функция Определения размера конкретной директории с путем $path 
            
function dir_size($path)
                {
                    
//$size = 0;
                    
$dir opendir($path); // открываем директорию
                    
while(($dir_num readdir($dir)) !== FALSE// Считываем файлы пока не FALSE
                        
{
                            
$path_end $path."/".$dir_num// Путь до нужного файла
                            
                            
if($dir_num == "." || $dir_num == "..")continue; // Исключаем субдиректории 
                            
if(is_dir("$path_end"))    // Если файл это папка, то рекурсивный спуск по директории
                                
{
                                    
$size += dir_size("$path_end");
                                }
                            elseif(
is_file("$path_end"))  // Если файл, то считываем размер и прибавляем к общей сумме размера папки
                                
{
                                    
$size += filesize("$path_end");
                                }
                        }
                    
closedir($dir);
                    return 
$size;   // Возращаем общий размер папки
                
}
        
//------------------------- Конец ----------------------------------------------
            
$start_path getcwd(); //Путь к директории
            
$num_arr_1 0;
            while((
$res readdir($dir_music)) !== FALSE)
                {
                    
$real_path ="$path/$res";
                    if(
is_dir($real_path))           
                        {
                            
$size_path dir_size("$real_path"); 
                            
$is_files 0;
                        }
                    if(
is_file($real_path))
                        {
                            
$size_path filesize($real_path);
                            
$is_files "$path";
                        }
                    
$size_path bcDIV($size_path1024*10242);
                    
$houre date(H);
                    
$houre $houre 8;
                    
$res_data date("d-m-Y г. $houre:i м."filectime($real_path));
                    
$arr_music[$num_arr_1][0] = $res;
                    
$arr_music[$num_arr_1][1] = $size_path;
                    
$arr_music[$num_arr_1][2] = $res_data;
                    
$arr_music[$num_arr_1][3] = $is_files;
                    
$num_arr_1++;
                    continue;
                }
            
ksort($arr_music);
            
$real_num = (int)count($arr_music)-1//вычисление действительного количества папок в директории
        
?>
        <body  link="#11116F" vlink="#11116F"> 
        <table border="1" valign="bottom" link="#11116F" vlink="#11116F">
        <tr>
                <td width="15" align="center"><font size="-1"  face='Tahoma' color="#7979B8">№ </td>
                <td width="312" align="center"><font size="-1" face='Tahoma' color="#7979B8">Группа,песня</td>
                <td width="203" align="center"><font size="-1" face='Tahoma' color="#7979B8">Дата</td>
                <td width="110" align="center"><font size="-1" face='Tahoma' color="#7979B8">Размер</td>
                <td height="20" width="109" align="center"><font size="-1" face='Tahoma' color="#7979B8">Скачано раз..</td>
        </tr>
    
        <?php
            $num_start 
1;
            if(
$real_num == 1)echo "<tr><td>&nbsp;</td><td>Пусто..</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>";
            for(
$i 2$i <= $real_num$i++) //вывод списка папок
                
{
                    
$element_name $arr_music[$i][0];   // Элемент - название папки или файла
                    
$element_size $arr_music[$i][1];      // Его размер
                    
$element_data $arr_music[$i][2];     // Дата создания
                    
$element_file $arr_music[$i][3];    // Если директория, то пустой, ести файл то = 1
                    
if(empty($element_file))      
                        {
                            
$color_dir "#11116F";
                            echo 
"<tr><td align='center'><font size='-2' color='#4B4A44' face='Tahoma'>$num_start</td><td><b><font size='-1' color='$color_dir' face='Tahoma'>&nbsp;&nbsp;<a href='index.php?lang=$lang&letter=$letter&element_name=$element_name'>$element_name</b></td><td><small>&nbsp;&nbsp;Добавленo: $element_data &nbsp;&nbsp;</td><td><small>&nbsp;&nbsp;Размер - $element_size Mb&nbsp;&nbsp;</td><td>&nbsp;</td></small>";
                        }
                    elseif(!empty(
$element_file))  //   !!!!!!!!!    тут выводится файл и путь к нему и отображается коряво
                        
{
                            
$color_dir "#C23D82";
                            
$element_name_1 rawurlencode($element_name);
                            echo 
"<tr><td align='center'><font size='-2' color='#4B4A44' face='Tahoma'>$num_start</td><td><b><font size='-1' color='$color_dir' face='Tahoma'>&nbsp;&nbsp;<a href='$element_file/$element_name_1'>$element_name</b></td><td><small>&nbsp;&nbsp;Добавленo: $element_data &nbsp;&nbsp;</td><td><small>&nbsp;&nbsp;Размер - $element_size Mb&nbsp;&nbsp;</td><td>&nbsp;</td></small>";
                        }
                    
$num_start++;
                }    
            
        
?>

   
 
 автор: Pit0n   (24.11.2006 в 12:13)   письмо автору
 
   для: Pit0n   (24.11.2006 в 11:36)
 

Сейчас загрузил на сервер, там все нормально отображается, получается, что мой локальный apache не правильно настроен?

   
 
 автор: Trianon   (24.11.2006 в 12:35)   письмо автору
 
   для: Trianon   (24.11.2006 в 11:24)
 

Хотелось бы видеть скрипт, которым Вы укладываете файлы на сервер.
Похоже, ноги растут оттуда.

   
 
 автор: Pit0n   (25.11.2006 в 09:54)   письмо автору
 
   для: Trianon   (24.11.2006 в 12:35)
 

В том то все и дело, что как таковой скрипт администрирования, для закачмвания файлов на сервер еще не делал, а пользовался FTP, а точнее FlashFXP. Ну так ведь проблема то существует лишь на локальном apache, а на хостинге ее нет. Браузер тут не причем. Тогда дело в apache?

   
 
 автор: Trianon   (23.11.2006 в 15:12)   письмо автору
 
   для: Trianon   (23.11.2006 в 15:08)
 

и еще. Кодировка имен совпадает с кодировкой скрипта и с умалчиваемой кодировкой apache?

   
 
 автор: Pit0n   (23.11.2006 в 15:17)   письмо автору
 
   для: Trianon   (23.11.2006 в 15:12)
 

По умолчанию в apache стоит стандартная кодировка windows-1251, больше кодировка нигде не меняется.

   
 
 автор: Trianon   (23.11.2006 в 15:19)   письмо автору
 
   для: Pit0n   (23.11.2006 в 15:17)
 

И заливались эти файлы тоже через apache? Не через FTP?

   
 
 автор: Pit0n   (23.11.2006 в 15:27)   письмо автору
 
   для: Trianon   (23.11.2006 в 15:19)
 

Пока что я пробую это на локальном компьютере. Должен ли браузер сам переводить знак "плюс" в строке "путь" на "пробел".

   
 
 автор: Pit0n   (24.11.2006 в 09:58)   письмо автору
 
   для: Pit0n   (23.11.2006 в 15:27)
 

Допустим проблему с пробелом я решу, но что делать в корявенькой кодировкой при попытке браузером скачать файл без пробелов и прочих символов?
Вот пример ошибки, которая выводится в браузер:

Forbidden
You don't have permission to access /music/eng/a/&#202;&#238;&#240;&#238;&#235;&#252;+&#232;+&#216;&#243;&#242;+-+21+-+&#204;&#224;&#240;&#232;&#255;.mp3 on this server. - (это файл с русскими символами и пробелами), та же ошибка если файл и без пробелов. Т.е. название файла отображается не кодом каждого символа, как на этом сайте, а корявой кирилицей

Not Found
The requested URL /baikal/music/eng/a/arriva/3.GERALD+ALBRIGHT+-+CREEPIN.mp3 was not found on this server. - (файл просто с пробелами)

Кодировка по умолчанию в apache стоит windows - 1251

   
Rambler's Top100
вверх

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