Как сменить имя файла во время upload?

natasha

Guest
Как сменить имя файла во время upload?

Я внимательно изучила FAQ. Честное слово. Не нашла ответ на свой вопрос.

Вопрос такой:

Имеется скрипт, который отправляет картинки пользователей в мою папку на сервере:

PHP:
<?
$max_image_width = 700;
$max_image_height = 800;
$max_image_size = 150000;
$valid_types = array("gif","jpg","png","jpeg");
$uploaddir = '/home/***/public_html/uploads/images/';
$uploadfile = $uploaddir.$_FILES['userfile']['name'];
$thankspage="http://www.***.ru/uploads/confirmation.shtml";
$sizeerror="http://www.***.ru/uploads/sizeerror.shtml";
$typeerror="http://www.***.ru/uploads/typeerror.shtml";
$weighterror="http://www.***.ru/uploads/weighterror.shtml";
$error="http://www.***.ru/uploads/error.shtml";

if (isset($_FILES["userfile"])) {
        if (is_uploaded_file($_FILES['userfile']['tmp_name'])) {
                $filename = $_FILES['userfile']['tmp_name'];
                $ext = substr($_FILES['userfile']['name'],
                        1 + strrpos($_FILES['userfile']['name'], "."));
                if (filesize($filename) > $max_image_size) {
                        echo 'Error: File size > 150K.';
                } elseif (!in_array($ext, $valid_types)) {Header("Location: $typeerror");} else {
                         $size = GetImageSize($filename);
                         if (($size) && ($size[0] < $max_image_width)
                                && ($size[1] < $max_image_height)) {
                                if (@move_uploaded_file($filename, $uploadfile)) {Header("Location: $thankspage");} else {Header("Location: $error");}
                        } else {Header("Location: $sizeerror");}
                }
        } else {Header("Location: $weighterror");}
}
?>
Скрипт работает. Взято здесь: http://detail.phpclub.net/article/upload

Но!

Я хотела, чтобы мои файлы с кириллицей, пробелами конвертировались в латинские. (Лучше если бы со случайным названием).

Т.е. загружаем - "фотография в лесу.jpg", а в папке на сервере имеем "fotographiyavlesu.jpg" или (еще лучше) - gfylfyuf33yvfyv5yufy.jpg

Мне известно, что оригинальное имя файла - $_FILES['userfile']['name'], но как произвести замену?

Если не сложно дайте ссылку на решение подобной проблемы. Я буду благодарна.
 

rotoZOOM

ACM maniac
Расширение файлов ты знаешь, осталось сгенерировать случайным образом название файла.
PHP:
function generateName ($len){
        $fn="";
        
        for ($i=0;$i<$len;$i++){
            $num=rand(48,122);

            if(($num > 97 && $num < 122) ||
               ($num > 65 && $num < 90) ||
               ($num >48 && $num < 57) ||
               $num==95){
               $fn.=chr($num);
            }else $i--;
        }
        return $fn;
    }
ну перед этим можно проинициализировать генератор случайных чисел, например srand((float) microtime() * 10000000);
 

natasha

Guest
svetasmirnova

Работает. Пока добилась того, чтобы все символы (включая пробелы) преобразовывались в _

Т. е. было:

вот я какая.jpg

Стало:

_________.jpg

Уже хорошо!

Спасибо! Едем дальше.
 

zap

Guest
я смотрю у нас и девушки программистки есть и даже неплохие ;)
 

svetasmirnova

маленький монстрик
natasha
rotoZOOM привёл алгоритм генерации случайной строки, который, IMHO, странен, но смысл показывает. Вот результат работы чего-то аналогичного и надо подставлять вместо __________

zap
>я смотрю у нас и девушки программистки есть и даже неплохие;)
Откуда вывод что неплохие? ;)
 

natasha

Guest
svetasmirnova

Сделала так:

PHP:
<?
$max_image_width = 701;
$max_image_height = 801;
$max_image_size = 153600;
$valid_types = array("jpg","jpeg");

$uploaddir = '/home/***/public_html/uploads/images/'; 
$uploadfile = $uploaddir.$_FILES['userfile']['name'];
$thankspage="http://www.***ru/uploads/confirmation/confirmation.shtml";
$sizeerror="http://www.***ru/uploads/error/sizeerror.shtml";
$typeerror="http://www.***.ru/uploads/error/typeerror.shtml";
$error="http://www.***.ru/uploads/error/error.shtml";
$mailerror="http://www.***.ru/uploads/error/mailerror.shtml";
$fileerror="http://www.***.ru/uploads/error/fileerror.shtml";
$sms="***@***.ru";
$master="***@***.ru";
$smsmessage="File was uploaded";
$mastermessage="***.";
$usermessage="***.";

if ($handle = opendir($uploaddir))
{while (false !== ($f = readdir($handle)))
{ if ($f != "." && $f != "..")
$file[] = $f;
} closedir($handle);
}
$count = count($file);


$x = ereg("^[0-9a-z]([-_.]?[0-9a-z])*@[0-9a-z]([-.]?[0-9a-z])*\\.[a-z]{2,3}$",$email);

if($x==0) {Header("Location: $mailerror");} else {

if (isset($_FILES["userfile"])) {
        if (is_uploaded_file($_FILES['userfile']['tmp_name'])) {
                $filename = $_FILES['userfile']['tmp_name'];
                $ext = substr($_FILES['userfile']['name'],
                        1 + strrpos($_FILES['userfile']['name'], "."));
                if (filesize($filename) > $max_image_size) {
                        echo 'Error: File size > 150K.';
                } elseif (!in_array($ext, $valid_types)) {Header("Location: $typeerror");} else {
                         $size = GetImageSize($filename);
                         if (($size) && ($size[0] < $max_image_width)
                                && ($size[1] < $max_image_height)) {
                                if (@move_uploaded_file($_FILES["userfile"]["tmp_name"], $uploaddir . preg_replace('/[^jpeg\.]/i', $count+1, $_FILES["userfile"]["name"]))) {Header("Location: $thankspage"); mail("$sms", "", "$smsmessage"); mail("$email", "photo.vl.ru", "$usermessage"); mail("$master", "New files in the gallery!", "$mastermessage");} else {Header("Location: $error");}
                        } else {Header("Location: $sizeerror");}
                }
        }else {Header("Location: $fileerror");}
}
}
?>
При добавлении файла в директорию все его символы кроме символов jpeg. переименовываются в цифры. (связка регулярное выражение+подсчет файлов в загружаемой папке)


Скажем человек загружает файл "тра n ля-ля!.__.jpg" а в папке он уже будет выглядеть так: "1111n1111111.11.jpg".
Если еще раз загрузить этот же файл он не затрет старый, а будет выглядеть вот так 2222n2222222.22.jpg.

Что и требовалось доказать!

У меня еще один вопрос из разряда странных. Прошу сильно ногами не бить! Я еще не сильна в PHP.

Вопрос:

Есть таблица *.html c формой, которая работает с вышеупомянутым скриптом.

В форме есть поле:



<select name="directory">

<option selected value="images">В общую папку</option>
<option value="nature">В папку природа</option>

</select>



С помощью select хочется решить проблему предоставления выбора пользователю по загрузке файла в ту или иную директорию.
Как связать select и значение переменной $uploaddir , которая кидает файлы в папки, выбранные пользователем.

Как это реализовать в скрипте?

Если есть ссылка на эту тему - дайте. Я сама не нашла.
 

crocodile2u

http://vbolshov.org.ru
natasha: если ты решила проблему с закачкой, и осталась у тебя лишь проблема переименования, совершенно незачем постить кучу кода, никак не относящегося к задаче.

Насчет переименования: можешь воспользоваться, допустим, strtr();
 

natasha

Guest
crocodile2u

Вопрос:

Есть таблица *.html c формой, которая работает с вышеупомянутым скриптом.

В форме есть поле:


PHP:
<select name="directory">

<option selected value="images">В общую папку</option>
<option value="nature">В папку природа</option>

</select>

С помощью select хочется решить проблему предоставления выбора пользователю по загрузке файла в ту или иную директорию.
Как связать select в HTML-форме и значение переменной $uploaddir в php-скрипте? Значение $uploaddir - путь к папке, в которые помещаются файлы при upload.

Как это реализовать в скрипте?

Если есть ссылка на эту тему - дайте. Я сама не нашла.
 

Фанат

oncle terrible
Команда форума
собственно, ссылкой на эту тему будет любой учебник по основам пхп, такой, как, например, на сайте php5.ru
поскольку обработка форм как раз и относится к основам.
прочитай, пожалуйста, как получить значение из формы в переменную.
а потом уже эту переменную ты, надеюсь, догадаешься подставить в $uploaddir ?
 

natasha

Guest
Фанат

Спасибо, разобралась... ;-)

Помогли две вещи:


Эта http://www.phpru.net/guide/submenu_10/

и

Эта http://www.php5.ru/study/forms

Все оказалось не так сложно!
 

Фанат

oncle terrible
Команда форума
молодец.
теперь перейдем к следующему этапу - безопасности.
чтобы хакер не мог послать всякую бяку вместо имени каталога, и перезаписать нужный файл, в селекты надо подставлять не имена каталогов, а просто циферки, к примеру.
а в скрипте написать простую проверку, если 1 - то каталог такой-то, если 2 - другой-то.
 

Magnat

Guest
Народ! Ны вы бы девушке объяснили бы.... Что к чему.. А не линки давали.. тут же три строчки написать :)))

-~{}~ 18.02.05 09:02:

Наташа!!! ты точно наташа?? Или может всётаки ты Хардин Александр??

http://photo.vl.ru/diary/2005/january/6.shtml

:) Фотки вроде как твои.. А копирайты Хардина стоят :)
 

Фанат

oncle terrible
Команда форума
А что тебя не устраивает?
Девшка что - не человек, что ли? прочесть не может?
Или то, как объясняет фиксер, тебе не нравится? Ты считаешь, что три строчки, написанные за 30 секунд ламером, объяснят что-то лучше, чем специпльно подготовленный и выверенный текст, написанный специалистом?
 

natasha

Guest
Фанат

Вот как сделала:


В форме:

<select name="directory" class=select>

<option selected value="12">Выберите...</option>

<option value="2">Город</option>
<option value="3">Животные</option>
<option value="4">Макрофотографии</option>
<option value="5">Натюрморт</option>
<option value="6">Памятники</option>
<option value="7">Пейзаж</option>
<option value="8">Портрет</option>
<option value="9">Предметы</option>
<option value="10">Событие</option>
<option value="11">Цветы</option>
<option value="12">Другое...</option>

</select>

Достаточно безопасно? ;-)


Ну а в коде скрипта нацарапала следующее:


if ($_POST['directory']==12) {$uploaddir = '/home//public_html/gallery/other/images/';}
else if ($_POST['directory']==2) {$uploaddir = '/home//public_html/gallery/town/images/';}
else if ($_POST['directory']==3) {$uploaddir = '/home//public_html/gallery/animals/images/';}
else if ($_POST['directory']==4) {$uploaddir = '/home//public_html/gallery/macrophotos/images/';}
else if ($_POST['directory']==5) {$uploaddir = '/home//public_html/gallery/stilllife/images/';}
else if ($_POST['directory']==6) {$uploaddir = '/home//public_html/gallery/monuments/images/';}
else if ($_POST['directory']==7) {$uploaddir = '/home//public_html/gallery/landscape/images/';}
else if ($_POST['directory']==8) {$uploaddir = '/home//public_html/gallery/portrait/images/';}
else if ($_POST['directory']==9) {$uploaddir = '/home//public_html/gallery/objects/images/';}
else if ($_POST['directory']==10) {$uploaddir = '/home//public_html/gallery/report/images/';}
else if ($_POST['directory']==11) {$uploaddir = '/home//public_html/gallery/flowers/images/';}

Может быть можно как-то попроще сделать? А то скрипт уже страшный выходит, большой?


Magnat

По дружбе помогаю фотографу, хотя сама еще ни бум-бум. :)
 

Breeze

goshogun
Команда форума
Партнер клуба
natasha

можно занести в массив:

$dirs = Array(
1=>"/home/public_html/gallery/town/images/",
2=>"/home/public_html/gallery/town/images/",
3=>"/home/public_html/gallery/town/images/"
);

$post_dir = isset($_POST['directory']) ? intval($_POST['directory']) : 1;

if ( isset($dirs[$post_dir]) ) {
$uploaddir = $dirs[$post_dir];
}
 

Фанат

oncle terrible
Команда форума
Достаточно безопасно? ;-)
довольно странный смайлик.
Наташа, вообще-то, ты вольна вообще ничего не делать из того, что тебе здесь рекомендуют.
Если ты считаешь такие замечания лишними - пропускай их мимо ушей.
ты ведь не мне делаешь сайт, а себе.

по поводу кода.
Надо себя любить. И не убивать себя на рутинной черной работе.
Если у тебя есть куча повторяющихся участков, то проще написать программу, которая будет делать все сама.
к примеру: Если у тебя постоянно повторяется некая строчка
/home//public_html/gallery/animals/images/ в которой меняется только одно слово, то и в программе надо менять только одно это слово, а полный путь получить потом:

if ($_POST['directory']==12) $dir='other';
if ($_POST['directory']==2) $dir='town';

$uploaddir = '/home//public_html/gallery/'.$dir.'/images/';

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

Далее. как правильно заметил тов. Breeze, кучу ифов проще заменить массивом. Только опять же - не пихать в него кучу повторяющихся слов, а только значимые, а потом нужный элемент подставить в $uploaddir

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

Breeze

goshogun
Команда форума
Партнер клуба
Фанат

про кучу слов правильно заметил..
/home//public_html/gallery/ -- тоже можно вынести..:)
 
Сверху