Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.10.2009, 22:30   #1
MaGWaY_minsk
Пользователь
 
Регистрация: 17.10.2008
Сообщений: 35
По умолчанию PHP и проверка расширения файла...

Здравствуйте!
Недавно столкнулся с такой проблемой: есть скрипт, который грузит файлы на сервер, при этом он проверяет соответствует ли данный файл одному из типов, разрешённых для загрузки. Всё работает хорошо до поры до времени.....
Предположим, разрешено закачивать через скрипт файлы с расширением mp3. Мы пытаемся загрузить файл с именем "мего песня.mp3" и файл успешно добавляется.
После мы пробуем загрузить файл "Ll Cool J feat. Lloyd Banks Hot Rod & 50 Cent Freeze (Remix).mp3" и он даёт ошибку. после переименования его в "qweqweqwe.mp3" всё нормально.

Собственно теперь код и дальше последует подробнее описание бага.

PHP код:
/*то что нас интересует ниже*/
$allowed_files explode','strtolower$mscfg['filetypes'] ) );
$tfile endexplode"."totranslit$_FILES['file']['name'] ) ) );
$file_allow TRUE;
for ( 
$f 0$f count$allowed_files ); $f ++ ) {
  if ( 
$tfile == $allowed_files[$f] ) $file_allow TRUE;
}

if ( 
$file_allow == FALSE $stop[] = 'Вы не можете загружать файлы такого типа';
/*то что нас интересует Выше*/

if ( $_FILES['file']['size'] > $mscfg['maxfilesize'] * 1024 $stop[] = 'Выбранный Вами файл слишком большой';
if ( 
count$stop ) == ) {

/*Это нам не надо... Это генерация имени файла (извращённо, но работает)))*/

$time time( );
$filename md5$time rand01000 ) ) . '.' $tfile;
@
move_uploaded_file$_FILES['file']['tmp_name'], ROOT_DIR '/uploads/files/' $filename );
....... 
Так вот....
Первая строчка кода из списка разрешённых расширений к загрузке составляет массив - она работает безотказно, но вот вторая строчка
PHP код:
$tfile endexplode"."totranslit$_FILES['file']['name'] ) ) ); 
чего-то даёт сбой. В первом случае с файлом "Мега песня.mp3" переменная $tfile = mp3. Во втором же случае, данная переменная каким-то боком получает значение $tfile= -lloyd-banks-hot-rod-50-cent. Ну и в результате мы получаем ошибку с сообщением о том что данный тип файла не поддерживается....
Можно предположить что это из-за длинны имени файла, но нет.... переименовываем файл в любое имя с той же длинной и скрипт заглатывает его....
Если кто знает как можно это исправить - отпишитесь пожалуйста.

Последний раз редактировалось MaGWaY_minsk; 25.10.2009 в 22:52.
MaGWaY_minsk вне форума Ответить с цитированием
Старый 25.10.2009, 23:26   #2
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 16,219
По умолчанию

Во-первых, я не понял, в каком случае будет выдано сообщение? Судя по коду, оно вообще ни когда не появится.
PHP код:
$file_allow TRUE// может тут false?
for ( $f 0$f count$allowed_files ); $f ++ ) {
  if ( 
$tfile == $allowed_files[$f] ) $file_allow TRUE;
}

if ( 
$file_allow == FALSE $stop[] = 'Вы не можете загружать файлы такого типа'
Во-вторых, как устроена функция totranslit()?
Arigato вне форума Ответить с цитированием
Старый 26.10.2009, 09:48   #3
wall66
Участник клуба
 
Аватар для wall66
 
Регистрация: 04.10.2008
Сообщений: 1,485
По умолчанию

пропишите перед
PHP код:
$tfile endexplode"."totranslit$_FILES['file']['name'] ) ) ); 
функции
PHP код:
echo $_FILES['file']['name']."<br />\r\n";
echo 
totranslit($_FILES['file']['name'])."<br />\r\n";
echo 
"<pre>";print_r(explode(".",totranslit($_FILES['file']['name'])));echo "</pre><br />\r\n";
echo 
end(explode(".",totranslit($_FILES['file']['name'])))."<br />\r\n"
и напишите сюда что они вывели
свободен...
wall66 вне форума Ответить с цитированием
Старый 26.10.2009, 10:23   #4
Metandrostenalon
Форумчанин
 
Регистрация: 03.04.2009
Сообщений: 108
По умолчанию

названия ваших переменных запутывают код
PHP код:
$allowed_files explode','strtolower$mscfg['filetypes'] ) ); 
получаем массив с разрешенными значениями

PHP код:
$tfile endexplode"."totranslit$_FILES['file']['name'] ) ) ); 
тут кажется что это file title, присутсвует транслитеризация, но по коду ниже видно что это расширение файла, ниже к пояснению кода это подтверждается. Видимо ваша функция возвращает не последний элемент массива, а второй return $array[1]

предлогаю такой код
PHP код:
$tfile array_pop(explode('.'$_FILES['file']['name'])); 
Ниже вашу конструкцию с пореатором for, я бы рекомендовал остановить оператором break при нахождении нужного элемента и предложу свой код
PHP код:
if (in_array(strtolower($tfile), $allowed_files)) {
  
$file_allow TRUE;

php,javascript
Metandrostenalon вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проверка расширения файла Михаил Юрьевич Общие вопросы Delphi 6 20.09.2009 22:22
Получение расширения файла AndreyFreemant Общие вопросы Delphi 2 16.04.2009 09:29
Сообщение при открытии из почты:Действительный формат файла отличается от расширения... bregante Microsoft Office Excel 1 31.08.2008 21:11
Изменение расширения файла при каждой итерации Jack Torrance Помощь студентам 3 18.12.2007 23:24
Проверка расширения файла Mickle Общие вопросы Delphi 2 04.05.2007 16:41