|
|
|
| Здравствуйте. Вот собственно интересует сабж. Когда я, вот, загружаю файл на сервер, мне нужно переименовать его в латинские символы... но при этом я задеваю разширение!
как это организовать, чтото непойму.
спасибо =) | |
|
|
|
|
|
|
|
для: 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"]);
?>
|
| |
|
|
|
|
|
|
|
для: zavragnov
(22.08.2008 в 16:14)
| | Ну а зачем такое городить? С помощью getimagesize($_FILES['filename']["tmp_name"]) можно получить тип изображения, и тем более не дать закачать на сервер не изображение. А уж $_FILES['filename']["tmp_name"] перносите из tmp каталога под каким угодно именем, добавляя полученное ранее раширение (по типу). | |
|
|
|
|
|
|
|
для: 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']);
}
?>
|
| |
|
|
|
|
|
|
|
для: mehelson
(22.08.2008 в 16:51)
| | А если название с точкой?
Проще просто разрешение прочитать:
<?
$type= $HTTP_POST_FILES["file_name"] ["type"];
|
| |
|
|
|
|
|
|
|
для: Николай2357
(22.08.2008 в 17:10)
| | strrchr() -- Находит последнее вхождение подстроки | |
|
|
|
|
|
|
|
для: mehelson
(22.08.2008 в 16:51)
| | ооо , все так элементарно, спасиба, что б без вас делал =) | |
|
|
|
|
|
|
|
для: Dez1
(22.08.2008 в 17:15)
| | Совсем не так всё элементарно.
Ошибку, вместо того чтоб вскрыть и исправить, просто загнали в угол.
И файлы, отправленные на сервер одновременно, теперь будут разрушаться друг другом.
Вот только искать и исправлять эту ошибку теперь уже никто заинтересован не будет.
Она ж редко проявляется. | |
|
|
|
|
|
|
|
для: Trianon
(22.08.2008 в 17:18)
| | Поясните, будте любезны, уважаемый !
Она ж (ошибка) плодится... | |
|
|
|
|
|
|
|
для: mehelson
(22.08.2008 в 17:25)
| | Что именно непонятно? | |
|
|
|
|
|
|
|
для: Trianon
(22.08.2008 в 17:28)
| | вот отсюда, пожалуйста...
Ошибку, вместо того чтоб вскрыть и исправить, просто загнали в угол.
И файлы, отправленные на сервер одновременно, теперь будут разрушаться друг другом.
разве time() не дает гарантии? разве можно в доли секунды одновременно ? | |
|
|
|
|
|
|
|
для: mehelson
(22.08.2008 в 17:35)
| | Во-первых time не дает долей секунды - дает только целые.
Во-вторых, даже если бы и давала - вероятность сбоя остается.
А писать код надо так, чтоб её не было . Вообще.
Выбор имени при этом проще всего затачивать под логику работы с этим файлом.
Пример 1. файл является аватаром на форуме, подобном этому.
логика - аватар определяется пользователем. Имя файла можно построить по уникальному идентификатору пользователя. У Вас это будет 5083.jpg . У меня 2738.jpg и т.д.
Пример 2. Файл является аттачем к комменту на форуме, подобном этому. Имя можно построить по идентификатору коммента.
Пример 3. Файл является юзерпиком в блоге. Имя можно построить составным по идентификатору пользователя и номеру картинки в его списке: 1245-7.jpg
Продолжать надо? | |
|
|
|
|
|
|
|
для: Trianon
(22.08.2008 в 17:43)
| | :) ясно, более чем!
Мда, работка предстоит... | |
|
|
|
|
|
|
|
для: 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 "Фиг.";
}
|
Это тоже плохо? | |
|
|
|
|
|
|
|
для: Николай2357
(22.08.2008 в 17:26)
| | Все зависит от того, как именно формируется $newname .
Впрочем, даже если оно формируется согласно логики загрузки файлов, то оставшееся всё равно плохо:
1. Нельзя писать copy() Для этой операции есть специально спроектированная стандартная функция.
2. Писать HTTP_POST_FILES. нехорошо,... и уж всяко недопустимо, если Вы пишете _SERVER | |
|
|
|
|
|
|
|
для: Trianon
(22.08.2008 в 17:34)
| | Да что ж такое, я совсем перестану читать учебники. Расскажите, как правильно, не томите. Про проверку вроде бы понятно, а вот copy()... | |
|
|
|
|
|
|
|
для: Николай2357
(22.08.2008 в 17:38)
| | Вы не знаете, где искать руководство по программному продукту? | |
|
|
|
|
|
|
|
для: Trianon
(22.08.2008 в 17:44)
| | К стыду своему - нет. У меня куча учебников, но которому верить? | |
|
|
|
|
|
|
|
для: Николай2357
(22.08.2008 в 17:46)
| | При чем тут учебники? учебники пишут разные люди, в том числе и недостаточно компетентные (на момент написания - так очень часто)
Я говорю про руководство. Руководство пишут разработчики (либо члены их команды) и выкладывают на сайт разработчика.
Они тоже ляпы делают, конечно... Но они их хотя бы исправляют. Изданный учебник как исправить? | |
|
|
|
|
|
|
|
для: Trianon
(22.08.2008 в 17:49)
| | А Вы попробуйте в Гугле набрать "руководство PHP" или что нибудь в этом духе, сами поймете, каково новичку. Поделитесь ссылками, только не на буржуйском, рановато пока. | |
|
|
|
|
|
|
|
для: Николай2357
(22.08.2008 в 17:58)
| | попробуйте .. не , не в гугле... просто в браузере набрать
php.net/copy
нажать Enter и внимательно прочитать написанное. | |
|
|
|
|
|
|
|
для: Trianon
(22.08.2008 в 18:03)
| | Спасибо. Это есть у меня в закладках, правда из-за нерусских букв пользовался редко. Теперь сотру все остальное. | |
|
|
|
|
|
|
|
для: Николай2357
(22.08.2008 в 18:09)
| | Вообще-то достаточно многие статьи там имеются и на русском | |
|
|
|
|
|
|
|
для: Николай2357
(22.08.2008 в 17:26)
| | Нет, ничего плохого в применении $_FILES["file_name"]["type"] нет. Речь о том, что не стоит проверять тип по последним символам после точки в имени файла. | |
|
|
|
|
|
|
|
для: Dez1
(22.08.2008 в 17:15)
| | - | |
|
|
|
|
|
|
|
для: Dez1
(22.08.2008 в 17:15)
| | Я вам, учитывая такую элементарность, столько "мусора" под видом картинок на сервер закачаю... Все что вам предложили (относительно расширений), еще может иметь место не для картинок, но для изображений вроде есть способ узнать, почему его не использовать? Да и не надо при закачивании файла пользоваться функцией copy, от греха по дальше. | |
|
|
|
|
|
|
|
для: sim5
(22.08.2008 в 17:25)
| | по поводу мусора: я ж дал урезанный вариант кода... само сабой проверки быть должны... и на тип и прочии...
по поводу copy уже не первый раз от Вас, уважаемый слышу... но примеры в основном на форуме и в книгах только по этой функции...
если уж вы узнали страшную тайну, поделитесь... | |
|
|
|
|
|
|
|
для: mehelson
(22.08.2008 в 17:33)
| | Страшная тайна открыта в руководстве по php. Есть, знаете ли, такой уникальный документ.
В нем даже есть отдельная глава "Загрузка файлов на сервер". | |
|
|
|
|
|
|
|
для: Trianon
(22.08.2008 в 17:36)
| | :) спасибо
а как тогда быть с многочисленными учебниками?
Кстати или нет, не пора ли вам издать что-то вроде рекомендаций?
Я серьезно! | |
|
|
|
|
|
|
|
для: mehelson
(22.08.2008 в 17:33)
| | Нежелательно использовать copy() при закачке файлов, т.к. возможны многие глюки. copy() вообще не будет работать при включенном open_basedir. При safe_mode=On, чтобы использовать copy(), нужно установить на временную папку того же владельца, что и выполняет скрипт, то есть аплоад будет невозможно делать, если у вас несколько пользователей (как и должно быть в случае виртуальных доменов). Кроме того copy() не выполняет проверку файла на существование. copy() использовалась в версии 3, в которой не было функции move_uploaded_file(), начиная с версии 4 нужно использовать именно ее. | |
|
|
|
|
|
|
|
для: sim5
(22.08.2008 в 17:50)
| | Спасибо! Пересмотрю! | |
|
|
|
|
|
|
|
для: sim5
(22.08.2008 в 17:50)
| | Спасибо! Пересмотрю!
Прошу прощения за дубль... Проклятый gprs | |
|
|
|
|
|
|
|
для: sim5
(22.08.2008 в 17:50)
| | От меня отдельно спасибо, пересмотреть, как видно, придется не только это... | |
|
|
|