Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Загрузка файлов на сервер 
:(
    Опции темы
Thai
Дата 28.12.2011, 19:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 18.4.2010

Репутация: нет
Всего: нет



Всем доброго времени суток. С PHP столкнулся недавно и вот суть моего вопроса. Требуется создать скрипт для загрузки картинок на сервер. В моем случае сервер работает локально. Проблема состоит в том чтобы работала возможность загрузки разных изображений,но с одинаковыми названиями. Имя картинки заносится в базу MySQL,а сама картинка в папку upload. Со всем вроде справился,но вот изображения с одинаковыми названиями заменяют друг друга. У кого будут предложения по данной теме?
Код

<?php
$uploaddir = '/home/localhost/www/img/uploads/';
if (move_uploaded_file($_FILES['file']['tmp_name'], $uploaddir . 
        $_FILES['file']['name'])) {
    print "Картинка успешно загружена.";
        $file = $_FILES['file']['name'];
    $db = mysql_connect("localhost","root","");
    mysql_select_db("img");
        $q = mysql_query("INSERT INTO img (filename, path_to_image) VALUES ('$file','uploads/$file')");
    } else {
    print "Ошибка загрузки файла";
}            
?>


PM MAIL   Вверх
ksnk
Дата 28.12.2011, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Можно в имени файла дописывать [НОМЕР], если файл существует. И добавлять его на 1, если все еще сушествует...
Код

$f=$uploaddir.$_FILES['file']['name'];
while (file_exists($f)){
   $f=preg_replace_callback(
        '#(\[(\d*)\]|)(\.[^\.]*)$#',
        create_function(
            '$m',
            'return "[".(empty($m[1])?0:$m[2]+1)."]".$m[3];'
        ),$f);

};

if (move_uploaded_file($_FILES['file']['tmp_name'], $f)) {
...



--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
$дмитрий
Дата 28.12.2011, 20:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1037
Регистрация: 19.6.2004

Репутация: 17
Всего: 45



Сохраняй файлы под случайно сгенерированными именами
PM MAIL   Вверх
Thai
Дата 28.12.2011, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 18.4.2010

Репутация: нет
Всего: нет



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

Код

<?php
$f=$uploaddir.$_FILES['file']['name'];
while (file_exists($f)){
   $f=preg_replace_callback(
        '#(\[(\d*)\]|)(\.[^\.]*)$#',
        create_function(
            '$m',
            'return "[".(empty($m[1])?0:$m[2]+1)."]".$m[3];'
        ),$f);
};
$uploaddir = '/home/localhost/www/img/uploads/';
if (move_uploaded_file($_FILES['file']['tmp_name'], $uploaddir . 
        $_FILES['file']['name'])) {
    print "Картинка успешно загружена.";
        $file = $_FILES['file']['name'];
    $db = mysql_connect("localhost","root","");
    mysql_select_db("img");
        $q = mysql_query("INSERT INTO img (filename, path_to_image) VALUES ('$file','uploads/$file')");
    } else {
    print "Ошибка загрузки файла";
}            
?>
<a href="index.php"><p>Назад</p></a>

PM MAIL   Вверх
ksnk
Дата 28.12.2011, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Цитата(Thai @  28.12.2011,  20:43 Найти цитируемый пост)
но проблему это не решило.старая картинка заменяется новой с аналогичным названием..

В цикле вычисляется НОВОЕ имя файла. Его и надо использовать в move_uploaded_file


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Gold Dragon
Дата 29.12.2011, 21:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



выдерну из своего кода, может пригодится... smile

Код

// здесь будем хранить ошибки
$error = array();
// определяем правила для имён
$preg = '/\.[a-zA-Z0-9_]{1,}$/i';

// проверка расширения файла
$file_ext_tmp =  preg_match($preg, $_FILES['file']['name'], $tmp);
if (!$file_ext_tmp){
 // это типа расширение должно быть и должно быть нормальным. Правило общее, для картинок можно упростить проверку
    $error[] = "Ошибка ... с расширением";
}else{
    $file['ext'] = strtolower(str_replace('.', '', $tmp[0]));
}

// временное имя файла
$filename_temp = $_FILES['file']['tmp_name'];
        
// проверка имени файла
$file['name'] = parseFile(preg_replace($preg, '', $_FILES['file']['name']));
if ($file['name'] == ''){
    $error[] ="Ошибка ... с именем файла";
}

// на всякий случай проверяем ошибки 
$error = implode(' ', $error);
if($error != ''){
    // .. отправляем на обработку ошибку
}

// место куда копируется файл
$dir = ".. задаём абсолютный адрес для файла..";

// проверка на существование файла с таким же именем и замена на новое
$file['name'] = strtolower(fCheckingFilename($dir, $file['name'], $file['ext']));

// делаем окончательно имя
$filename = $file['name'] . '.' . $file['ext'];

// ну и окончатено копируем
move_uploaded_file($filename_temp, $dir . $filename);

// всё таки лучше кириллицу и другую гадость переделать в нормальный вид
function parseFile($file_name) {
    $in = array(
    'а','б','в','г','д','е','ё','ж','з','и','й','к','л','м','н','о','п','р','с','т','у','ф','х','ц','ч','ш','щ','ь','ы','ъ','э','ю','я',
    'А','Б','В','Г','Д','Е','Ё','Ж','З','И','Й','К','Л','М','Н','О','П','Р','С','Т','У','Ф','Х','Ц','Ч','Ш','Щ','Ь','Ы','Ъ','Э','Ю','Я',
    ' ', '`','~','!','@','#','$','%','^','&','*','(',')','=','+','{','}','[',']','"','№',';','%',':','?',"'",'/','|','\\'
    );
    $out = array(
    'a','b','v','g','d','e','yo','zh','z','i','y','k','l','m','n','o','p','r','s','t','u','f','h','ts','ch','sh','sch','','y','','e','yu','ya',
    'a','b','v','g','d','e','yo','zh','z','i','y','k','l','m','n','o','p','r','s','t','u','f','h','ts','ch','sh','sch','','y','','e','yu','ya',
    '_','');
    $result = str_replace($in, $out, $file_name);
    return $result;
}

// простая функция для исключения одинаковых имён файлов
function fCheckingFilename($dir, $name, $ext){
    if(is_file($dir . $name.'.'.$ext)){
        $name = $name.time();
    }
    return $name;
}


наверное слишком много лишнего, но мало ли что-то интересное найдётся ;)

Добавлено @ 21:25
я ещё делаю миниэскизы... Ну например чтобы в контенте показывать не весь размер а маленький и чтобы потом использовать например fancybox для просмотра оригинала smile
Код


$hauteur_destination =100; // размер миниэскиза
if ($_FILES['file']['type'] == 'image/png'){
    $image = imagecreatefrompng($dir . $filename);
    }
    if ($_FILES['file']['type'] == 'image/jpeg'){
    $image = imagecreatefromjpeg($dir . $filename);
    }
if ($_FILES['file']['type'] == 'image/gif'){
    $image = imagecreatefromgif($dir . $filename);
}
if ($_FILES['file']['type'] == 'image/png' OR $_FILES['file']['type'] == 'image/jpeg' OR $_FILES['file']['type'] == 'image/gif') {
    $largeur = imagesx($image);
    $hauteur = imagesy($image);
    if ($hauteur >= $hauteur_destination) {
        $pourcentage = $hauteur_destination / $hauteur;
        $largeur_destination = $largeur * $pourcentage;
        $destination = imagecreatetruecolor($largeur_destination, $hauteur_destination);
        imagecopyresampled($destination, $image, 0, 0, 0, 0, $largeur_destination, $hauteur_destination, $largeur, $hauteur);
        imagepng($destination, $dir . 'mini_' . $filename);
    } else{
        imagepng($image, $dir . 'mini_' . $filename);
    }
    if (isset($image)){
        imagedestroy($image);
    }
    if (isset($destination)){
        imagedestroy($destination);
    }
}


Добавлено @ 21:28
я в коде разделяю именно отдельно имя и расширение, чтобы более гибко с этим работать... К примеру у меня есть функция которая проверяет тип и выводит соответствующую картинку smile

Это сообщение отредактировал(а) Gold Dragon - 29.12.2011, 21:36


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Sanchezzz
Дата 29.12.2011, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1670
Регистрация: 19.11.2006
Где: Voronezh

Репутация: 41
Всего: 60



Тоже выдрал из рабочей cms-компании...

Код

/*
$source - название интпута file
$todir    - в какую папку складывать файл
$genName  true генерировать хеш имя файла
$argfile_name свое имя файла


*/
function moveUpload($source , $todir , $genName =  true , $argfile_name = '' ) {
    $todir.="/";
    $load = false;
    if(!empty($_FILES[$source]))
    if(is_uploaded_file($_FILES[$source]["tmp_name"])){
        $filename = $_FILES[$source]['tmp_name'];
        $ext = $ext = pathinfo($_FILES[$source]['name']);
        
        if($genName==true){
                          $new_name  = str_replace(array(',' , '.' , ' ' ),array('' , '', '' ), microtime() );
                            $new_name .= date('dmYs'); //или md5( microtime() . date('dmYs') );

            $new_filename = $new_name . "." . $ext['extension']);
        }elseif($argfile_name!=''){
            $new_filename =  $argfile_name;
        }else{
            $new_filename = $_FILES[$source]['name'];
        }

        if(move_uploaded_file($filename, str_replace('//', '/', $todir  . $new_filename ) )  ) {
            return array('filename'=> $new_filename  , 'error'=>'File successful uploaded');
        } else {
            return array('filename'=>'', 'error'=>'Error: moving file failed');
        }
    }else{
        return array('filename'=>'', 'error'=>'Error: empty file');
    }
}





--------------------
Понравился ответ "+" по репе, не забываем закрывать тему, заказы в LS.
PM MAIL Skype GTalk   Вверх
MoLeX
Дата 30.12.2011, 06:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

Репутация: 46
Всего: 140



Цитата(Thai @  28.12.2011,  19:42 Найти цитируемый пост)
Со всем вроде справился,но вот изображения с одинаковыми названиями заменяют друг друга. У кого будут предложения по данной теме?

все правильно, сам попробуй создать два одинаковых файла, не получилось?

название файлов дают уникальные, а вот в БД заносится нужное название которое и отображается пользователю


--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1347 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.