Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Загрузка файла не сервер


Автор: tilekus 31.5.2009, 11:38
Нужно загрузить файл на сервер. Но переименовать его, например текущей датой, чтобы названия всех файлов были уникальными. Я заранее не знаю какой тип фалов будет загружаться, т.е. я не могу сказать что пользователи будут закачивать только вордовские файлы или рисунки.
Сам принцип организации закачки файла я знаю. Но вот как пееименовть  :( 
Вот сама форма для закачки
Код
<form action="uploader.php" method="post" enctype="multipart/form-data">
      <input type="file" name="filename"><br>
      <input type="text" name="nazvanie"><br> 
      <input type="submit" value="Загрузить"><br>
      </form>


А это обрабатывающий скрипт
Код
<?php
   if(copy($_FILES["filename"]["tmp_name"], "../uploads/".$_FILES["filename"]["name"]))
   {
     echo("Файл успешно загружен <br>");
   } else {
     echo("Ошибка загрузки файла");
   }
?>


Подскажите что мне нужно переделать.

Автор: Shark 31.5.2009, 12:06
вот как у меня сделано:
Код

            $image = time().$type;

            if(!move_uploaded_file($_FILES['av']['tmp_name'] ,getcwd().'/avater/'.$image))


в переменной $image храниится название файла, time() - время в UNIX формате, переменная $type хранит расширение файла

Автор: pizzz 31.5.2009, 13:51
Как минимум надо проверять тип файла. Иначе не избежать проблем

Автор: Serkys 31.5.2009, 13:56
На http://habrahabr.ru/blogs/php/44610/ хорошо рассказано про безопасность, рекомендую почитать.
А файл переименовывается функцией http://ru.php.net/manual/en/function.rename.php.

Автор: pizzz 31.5.2009, 14:00
rename лишнее. При сохранении указываем название

Автор: tilekus 31.5.2009, 14:26
Тогда такой вопрос, как узнать расширение передаваемого файла?

Автор: bars80080 31.5.2009, 14:44
Цитата(tilekus @  31.5.2009,  14:26 Найти цитируемый пост)
Тогда такой вопрос, как узнать расширение передаваемого файла? 

$_FILES[av]['type']

Автор: NetJunky 31.5.2009, 15:04
Или с помощью какого-нибудь регулярного выражения(если таковое есть) указать каких типов файлов не должно быть загружено.

Автор: tilekus 31.5.2009, 15:07
Как вы думаете правильно ли будет если яделаю таким образом:
1. загружу как есть на сервер
2. с помощью basename вытащу название файла с раширением
3. отсеку от строки все кроме четырех последних символов
4. дам файлу новое название и старое расширение которое получил п.3
4. закинуть в бд

Да и кто знает есть ли список может быть всех MIME типов может самых популярных

Автор: bars80080 31.5.2009, 15:42
Цитата(tilekus @  31.5.2009,  15:07 Найти цитируемый пост)
отсеку от строки все кроме четырех последних символов

почему четыре? а .jpeg, .torrent, .js, .mpg4, .gz ?

зачем, если тип уже выделен?


Цитата(tilekus @  31.5.2009,  15:07 Найти цитируемый пост)
Да и кто знает есть ли список может быть всех MIME типов может самых популярных

гиблое дело, настолько не стандартизированное, что даже смысла нет пользоваться:
http://filext.com/
http://filext.com/file-extension/jpg
там 9 мим-типов на один только .jpg

Автор: tilekus 31.5.2009, 15:59
Цитата

$_FILES[av]['type'] 

ничего не выводит
Как быть?

Автор: ksnk 31.5.2009, 16:01
bars80080, Дело не такое гиблое, если доверить его встроенным функциям http://php.net/mime_content_type или http://ru2.php.net/manual/ru/ref.fileinfo.php. Правда нужно проверить, что соответствующие расширения на сервере есть. Впрочем, они почти стандартны.

Автор: supervladislav 31.5.2009, 16:40
тебе какого типа файлы загружать надо ))

Автор: bars80080 31.5.2009, 17:00
Цитата(ksnk @  31.5.2009,  16:01 Найти цитируемый пост)
Правда нужно проверить, что соответствующие расширения на сервере есть. Впрочем, они почти стандартны. 

как ни странно, в единственном варианте, когда они мне понадобились, на сервере их не оказалось

Автор: Photon 31.5.2009, 17:10
Ну нахрена так себя мучать?

Код

  $arr = explode('.', $_FILES['filename']['name'];
  $ext = $arr[count($arr) - 1];
  $new_name = time().$ext;
   move_uploaded_file($_FILES['filename']['tmp_name'], 'путь_для_сохранения/'.$new_name);


Автор: enof 31.5.2009, 17:13
Photon, tar.gz, tar.bz2 ?

Автор: supervladislav 31.5.2009, 17:28
а если человеку нужно  загрузить определённый mime тип

если не ошибаюсь эксплорер возвращает pjpeg
Код

$type_3="image/pjpeg";
$type_1 = "image/jpeg"; 
$type_2 = "image/gif"; 
$foto_type=$_FILES['filename']['tmp_name'];
$foto=$_FILES['filename']['tmp_name'];
$file=путь к файлу
$id=путь к файлу

         if(($foto_type!= $type_1) and ($foto_type!= $type_2) and ($foto_type!=$type_3)){ $foto="";}
          else
          {
           if ($foto_type == $type_1 or $foto_type==$type_3) $fo=$id.".jpg";
           elseif ($foto_type == $type_2) $fo=$id.".gif";
           move_uploaded_file ("$foto", "".$file."/".$fo);
           $foto=$file."/".$fo;
          }

       


Автор: enof 31.5.2009, 17:42
supervladislav, весь твой код можно смело постить http://forum.vingrad.ru/forum/topic-108931.html.

Автор: supervladislav 31.5.2009, 17:47
ничего другого от тебя не  ожидал   ))спасибо 

Автор: enof 31.5.2009, 17:52
 smile 
значит ты знаешь, что пишешь ###код и советуешь так же делать другим?

Автор: supervladislav 31.5.2009, 17:54
нет я так не считаю 

Автор: enof 31.5.2009, 18:01
Цитата(supervladislav @  31.5.2009,  18:28 Найти цитируемый пост)
Код

$type_3="image/pjpeg";
$type_1 = "image/jpeg"; 
$type_2 = "image/gif"; 
$foto_type=$_FILES['filename']['tmp_name'];
$foto=$_FILES['filename']['tmp_name'];
$file=путь к файлу
         if(($foto_type!= $type_1) and ($foto_type!= $type_2) and ($foto_type!=$type_3)){ $foto="";}
          else
          {
           if ($foto_type == $type_1 or $foto_type==$type_3) $fo=$id.".jpg";
           elseif ($foto_type == $type_2) $fo=$id.".gif";
           move_uploaded_file ("$foto", "".$file."/".$fo);
           $foto=$file."/".$fo;
          }

о да, это божественно user posted image

Автор: tilekus 31.5.2009, 20:55
Спасибо всем большое. Вроде все стало понятно. Теперь буду тестить. Потом напишу что получилось.
 smile 
 smile 

Автор: SkyCoder 31.5.2009, 23:51
Я сейчас плохо представляю какими средствами ты обладаешь(php и методы загрузки файла я успешно забыл), но ..

Я вижу две ситуации.
1. Файл для нас - поток байтов, как получили так и вернули.
2. Файл - определённая структура и мы с ней работаем.

если первый случай почему не именовать файлы в формате UIN.Вася_пупкин.tar.gzip.jpeg, где UIN - уникальный номер или дата...
Код

time() . '.' . $name

выглядит ужасно, но кажется писалось это так.

второй вариант по моему не наш случай.

Автор: Photon 2.6.2009, 17:16
enof,  и что, от того, что пропадет "tar", файл перестанет открываться архиватором? smile

Автор: SkyCoder 4.6.2009, 21:55
Цитата(Photon @ 2.6.2009,  17:16)
enof,  и что, от того, что пропадет "tar", файл перестанет открываться архиватором? smile

Право же.. не о том тема. У меня под KDE в debian'e 40% файлов без расширения и ассоциируются корректно(не интересовался правда какими средствами оно это делает).

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)