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

Форум PHP

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

 

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

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

тема: Как правильно переименовать изображение при загрузке на сервер?
 
 автор: Dez1   (22.08.2008 в 15:44)   письмо автору
 
 

Здравствуйте. Вот собственно интересует сабж. Когда я, вот, загружаю файл на сервер, мне нужно переименовать его в латинские символы... но при этом я задеваю разширение!
как это организовать, чтото непойму.

спасибо =)

  Ответить  
 
 автор: zavragnov   (22.08.2008 в 16:14)   письмо автору
 
   для: Dez1   (22.08.2008 в 15:44)
 

Всем известная функция :)


<?php 

function translit_filename($st)// функция превода текста с кириллицы в транслит
  
{
  
    
// Сначала заменяем "односимвольные" фонемы.
    
$st=strtr($st,"абвгдеёзийклмнопрстуфхъыэ_",
    
"abvgdeeziyklmnoprstufhiei");
    
$st=strtr($st,"АБВГДЕЁЗИЙКЛМНОПРСТУФХЪЫЭ_",
    
"ABVGDEEZIYKLMNOPRSTUFHIEI");
    
// Затем - "многосимвольные".
    
$st=strtr($st
                    array(
                        
"ж"=>"zh""ц"=>"ts""ч"=>"ch""ш"=>"sh"
                        
"щ"=>"shch","ь"=>"""ъ"=>"""ю"=>"yu""я"=>"ya",
                        
"Ж"=>"ZH""Ц"=>"TS""Ч"=>"CH""Ш"=>"SH"
                        
"Щ"=>"SHCH","Ь"=>"""Ю"=>"YU""Я"=>"YA",
                        
"ї"=>"i""Ї"=>"Yi""є"=>"ie""Є"=>"Ye"
                        
                        
" "=>"_" "`"=>"""!"=>"""~"=>"""!"=>""
                        
"#"=>"""$"=>"",  "%"=>"",  "^"=>"",  "&"=>"",
                        
"*"=>"",  "("=>"",  ")"=>"",  "-"=>"",  "—"=>"""+"=>"",
                        
"/"=>"",  "|"=>"",  "\""=>"",  "@"=>"",   
                        
","=>"",  "№"=>"",  ";"=>"",  ":"=>"",  "?"=>"",  "'"=>"",
                        
"«"=>"""»"=>"",
                        
                        
                        
                        )
             );
    
// Возвращаем результат.
    
return $st;
  }

$_FILES['filename']["name"] = translit_filename($_FILES['filename']["name"]);


?>

  Ответить  
 
 автор: sim5   (22.08.2008 в 16:24)   письмо автору
 
   для: zavragnov   (22.08.2008 в 16:14)
 

Ну а зачем такое городить? С помощью getimagesize($_FILES['filename']["tmp_name"]) можно получить тип изображения, и тем более не дать закачать на сервер не изображение. А уж $_FILES['filename']["tmp_name"] перносите из tmp каталога под каким угодно именем, добавляя полученное ранее раширение (по типу).

  Ответить  
 
 автор: mehelson   (22.08.2008 в 16:51)   письмо автору
 
   для: Dez1   (22.08.2008 в 15:44)
 

Что-то в этом духе :

<?php
//если во временном кaталоге есть файл
if(!empty($_FILES['file']['tmp_name']))
{
   
//определяем расширение файла
   
$ext strrchr($_FILES['file']['name'], ".");
   
//формируем путь к файлу
   
$file "files/".date("Y-m-d")."_".time()."$ext";  //здесь <date("Y-m-d")."_".time()> можно уkазать любое имя не затрагивая расширения
   //перемещаем файл из временной директории сервера
   //в директорию /files Web-приложения
   
if(copy($_FILES['file']['tmp_name'], $file))
   {
      
//уничтожаем файл во временной директории
      
@unlink($_FILES['file']['tmp_name']);
   }
?>

  Ответить  
 
 автор: Николай2357   (22.08.2008 в 17:10)   письмо автору
 
   для: mehelson   (22.08.2008 в 16:51)
 

А если название с точкой?
Проще просто разрешение прочитать:
<?
$type
$HTTP_POST_FILES["file_name"] ["type"];

  Ответить  
 
 автор: mehelson   (22.08.2008 в 17:17)   письмо автору
 
   для: Николай2357   (22.08.2008 в 17:10)
 

strrchr() -- Находит последнее вхождение подстроки

  Ответить  
 
 автор: Dez1   (22.08.2008 в 17:15)   письмо автору
 
   для: mehelson   (22.08.2008 в 16:51)
 

ооо , все так элементарно, спасиба, что б без вас делал =)

  Ответить  
 
 автор: Trianon   (22.08.2008 в 17:18)   письмо автору
 
   для: Dez1   (22.08.2008 в 17:15)
 

Совсем не так всё элементарно.
Ошибку, вместо того чтоб вскрыть и исправить, просто загнали в угол.
И файлы, отправленные на сервер одновременно, теперь будут разрушаться друг другом.

Вот только искать и исправлять эту ошибку теперь уже никто заинтересован не будет.
Она ж редко проявляется.

  Ответить  
 
 автор: mehelson   (22.08.2008 в 17:25)   письмо автору
 
   для: Trianon   (22.08.2008 в 17:18)
 

Поясните, будте любезны, уважаемый !
Она ж (ошибка) плодится...

  Ответить  
 
 автор: Trianon   (22.08.2008 в 17:28)   письмо автору
 
   для: mehelson   (22.08.2008 в 17:25)
 

Что именно непонятно?

  Ответить  
 
 автор: mehelson   (22.08.2008 в 17:35)   письмо автору
 
   для: Trianon   (22.08.2008 в 17:28)
 

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


разве time() не дает гарантии? разве можно в доли секунды одновременно ?

  Ответить  
 
 автор: Trianon   (22.08.2008 в 17:43)   письмо автору
 
   для: mehelson   (22.08.2008 в 17:35)
 

Во-первых time не дает долей секунды - дает только целые.
Во-вторых, даже если бы и давала - вероятность сбоя остается.
А писать код надо так, чтоб её не было . Вообще.

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

Пример 1. файл является аватаром на форуме, подобном этому.
логика - аватар определяется пользователем. Имя файла можно построить по уникальному идентификатору пользователя. У Вас это будет 5083.jpg . У меня 2738.jpg и т.д.

Пример 2. Файл является аттачем к комменту на форуме, подобном этому. Имя можно построить по идентификатору коммента.

Пример 3. Файл является юзерпиком в блоге. Имя можно построить составным по идентификатору пользователя и номеру картинки в его списке: 1245-7.jpg

Продолжать надо?

  Ответить  
 
 автор: mehelson   (22.08.2008 в 18:04)   письмо автору
 
   для: Trianon   (22.08.2008 в 17:43)
 

:) ясно, более чем!
Мда, работка предстоит...

  Ответить  
 
 автор: Николай2357   (22.08.2008 в 17:26)   письмо автору
 
   для: Trianon   (22.08.2008 в 17:18)
 

Я вот так делал:
<?
$typ 
$HTTP_POST_FILES["file_name"] ["type"];

if( 
copy($HTTP_POST_FILES["file_name"] ["tmp_name"],$_SERVER['DOCUMENT_ROOT']."/$newname.$typ")  )
                             {
                        echo 
"Гут!";
                             }
                           else
                             {
                        echo 
"Фиг.";
                             }  

Это тоже плохо?

  Ответить  
 
 автор: Trianon   (22.08.2008 в 17:34)   письмо автору
 
   для: Николай2357   (22.08.2008 в 17:26)
 

Все зависит от того, как именно формируется $newname .

Впрочем, даже если оно формируется согласно логики загрузки файлов, то оставшееся всё равно плохо:

1. Нельзя писать copy() Для этой операции есть специально спроектированная стандартная функция.
2. Писать HTTP_POST_FILES. нехорошо,... и уж всяко недопустимо, если Вы пишете _SERVER

  Ответить  
 
 автор: Николай2357   (22.08.2008 в 17:38)   письмо автору
 
   для: Trianon   (22.08.2008 в 17:34)
 

Да что ж такое, я совсем перестану читать учебники. Расскажите, как правильно, не томите. Про проверку вроде бы понятно, а вот copy()...

  Ответить  
 
 автор: Trianon   (22.08.2008 в 17:44)   письмо автору
 
   для: Николай2357   (22.08.2008 в 17:38)
 

Вы не знаете, где искать руководство по программному продукту?

  Ответить  
 
 автор: Николай2357   (22.08.2008 в 17:46)   письмо автору
 
   для: Trianon   (22.08.2008 в 17:44)
 

К стыду своему - нет. У меня куча учебников, но которому верить?

  Ответить  
 
 автор: Trianon   (22.08.2008 в 17:49)   письмо автору
 
   для: Николай2357   (22.08.2008 в 17:46)
 

При чем тут учебники? учебники пишут разные люди, в том числе и недостаточно компетентные (на момент написания - так очень часто)
Я говорю про руководство. Руководство пишут разработчики (либо члены их команды) и выкладывают на сайт разработчика.
Они тоже ляпы делают, конечно... Но они их хотя бы исправляют. Изданный учебник как исправить?

  Ответить  
 
 автор: Николай2357   (22.08.2008 в 17:58)   письмо автору
 
   для: Trianon   (22.08.2008 в 17:49)
 

А Вы попробуйте в Гугле набрать "руководство PHP" или что нибудь в этом духе, сами поймете, каково новичку. Поделитесь ссылками, только не на буржуйском, рановато пока.

  Ответить  
 
 автор: Trianon   (22.08.2008 в 18:03)   письмо автору
 
   для: Николай2357   (22.08.2008 в 17:58)
 

попробуйте .. не , не в гугле... просто в браузере набрать
php.net/copy
нажать Enter и внимательно прочитать написанное.

  Ответить  
 
 автор: Николай2357   (22.08.2008 в 18:09)   письмо автору
 
   для: Trianon   (22.08.2008 в 18:03)
 

Спасибо. Это есть у меня в закладках, правда из-за нерусских букв пользовался редко. Теперь сотру все остальное.

  Ответить  
 
 автор: Trianon   (22.08.2008 в 18:15)   письмо автору
 
   для: Николай2357   (22.08.2008 в 18:09)
 

Вообще-то достаточно многие статьи там имеются и на русском

  Ответить  
 
 автор: sim5   (22.08.2008 в 17:52)   письмо автору
 
   для: Николай2357   (22.08.2008 в 17:26)
 

Нет, ничего плохого в применении $_FILES["file_name"]["type"] нет. Речь о том, что не стоит проверять тип по последним символам после точки в имени файла.

  Ответить  
 
 автор: mehelson   (22.08.2008 в 17:21)   письмо автору
 
   для: Dez1   (22.08.2008 в 17:15)
 

-

  Ответить  
 
 автор: sim5   (22.08.2008 в 17:25)   письмо автору
 
   для: Dez1   (22.08.2008 в 17:15)
 

Я вам, учитывая такую элементарность, столько "мусора" под видом картинок на сервер закачаю... Все что вам предложили (относительно расширений), еще может иметь место не для картинок, но для изображений вроде есть способ узнать, почему его не использовать? Да и не надо при закачивании файла пользоваться функцией copy, от греха по дальше.

  Ответить  
 
 автор: mehelson   (22.08.2008 в 17:33)   письмо автору
 
   для: sim5   (22.08.2008 в 17:25)
 

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

  Ответить  
 
 автор: Trianon   (22.08.2008 в 17:36)   письмо автору
 
   для: mehelson   (22.08.2008 в 17:33)
 

Страшная тайна открыта в руководстве по php. Есть, знаете ли, такой уникальный документ.
В нем даже есть отдельная глава "Загрузка файлов на сервер".

  Ответить  
 
 автор: mehelson   (22.08.2008 в 17:47)   письмо автору
 
   для: Trianon   (22.08.2008 в 17:36)
 

:) спасибо
а как тогда быть с многочисленными учебниками?
Кстати или нет, не пора ли вам издать что-то вроде рекомендаций?
Я серьезно!

  Ответить  
 
 автор: sim5   (22.08.2008 в 17:50)   письмо автору
 
   для: mehelson   (22.08.2008 в 17:33)
 

Нежелательно использовать copy() при закачке файлов, т.к. возможны многие глюки. copy() вообще не будет работать при включенном open_basedir. При safe_mode=On, чтобы использовать copy(), нужно установить на временную папку того же владельца, что и выполняет скрипт, то есть аплоад будет невозможно делать, если у вас несколько пользователей (как и должно быть в случае виртуальных доменов). Кроме того copy() не выполняет проверку файла на существование. copy() использовалась в версии 3, в которой не было функции move_uploaded_file(), начиная с версии 4 нужно использовать именно ее.

  Ответить  
 
 автор: mehelson   (22.08.2008 в 17:55)   письмо автору
 
   для: sim5   (22.08.2008 в 17:50)
 

Спасибо! Пересмотрю!

  Ответить  
 
 автор: mehelson   (22.08.2008 в 17:56)   письмо автору
 
   для: sim5   (22.08.2008 в 17:50)
 

Спасибо! Пересмотрю!
Прошу прощения за дубль... Проклятый gprs

  Ответить  
 
 автор: Николай2357   (22.08.2008 в 18:05)   письмо автору
 
   для: sim5   (22.08.2008 в 17:50)
 

От меня отдельно спасибо, пересмотреть, как видно, придется не только это...

  Ответить  
Rambler's Top100
вверх

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