[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Нужна загрузка изображений в бд.
Потрашитель
Если не трудно,то можно готовый пример.
Если лень или просто не охота,то наводки на функции.

Нужно чтобы скрипт уменьшал изображение до определенной высоты,
а ширина изменялась автоматически.И желательно чтобы картинкам
давались имена.начинались с id1 потом id2 и тд.

Заранее спасибо



Спустя 8 минут, 55 секунд (15.06.2011 - 19:57) Mirexzpalich написал(а):
Цитата
Если лень или просто не охота,то наводки на функции.

Я тебе скажу большее... http://www.realcoding.net/article/view/4523

Спустя 46 секунд (15.06.2011 - 19:58) Игорь_Vasinsky написал(а):
Гдето была, но не могу найти в гугле resize image php набери.

По поводу хранения катинок в БД - это принципиально?
Экономичнее хранить пути и имена файлов в БД.

Спустя 1 час, 31 минута, 34 секунды (15.06.2011 - 21:29) Потрашитель написал(а):
ФОРУМЧАНЕЕЕЕ!!!
Не могу найти путный код..помогите кто-нибудь ПРОСТО с загрузкой изображения в mysql!или в папку без разницы!!!А уменьшить изображения я смогу и с помощью html!

Спустя 7 минут, 5 секунд (15.06.2011 - 21:36) Игорь_Vasinsky написал(а):
Цитата
загрузкой изображения в mysql!или в папку без разницы!!!

огромная разница wink.gif

Давай вместе начнём, для начала покажи вою форму.

Спустя 1 минута, 1 секунда (15.06.2011 - 21:37) sharki написал(а):
Цитата
А уменьшить изображения я смогу и с помощью html!

сочувствую пользователям загружаещие изображение 100х100 пикслей, а на самом деле там 1024х780пикселей))

Спустя 4 минуты, 13 секунд (15.06.2011 - 21:42) Потрашитель написал(а):
Цитата
сочувствую пользователям загружаещие изображение 100х100 пикслей, а на самом деле там 1024х780пикселей))

а у меня есть другой выход?!..
------------------------------------------------------------
Цитата
Давай вместе начнём, для начала покажи вою форму.

СПАСИИИИБО!
У меня сайт RAhABr.ru - бесплатные визитки.я хочу туда добавить чтобы пользователи могли на свою визитку прикреплять аватарки.Могу кинуть код обработчика и html формы.Я сейчас не много в денвере его изменяю.Поэтому кину уже измененнный..Кидать?

Спустя 1 минута, 20 секунд (15.06.2011 - 21:43) Игорь_Vasinsky написал(а):
Да. PHP может ресайзить, jquery - кропить. 21 век уже.
sharki
если не ленивый то покжу как сделать, но это не начало вороса, до этого дойдём.

Спустя 1 минута, 51 секунда (15.06.2011 - 21:45) Игорь_Vasinsky написал(а):
нет. ни чё кидать не нужно wink.gif в меня по крайней мере.

Твоя задача - предложить (показать код) форму для загрузки аватарки (HTML).

Я тока помагаю. А делаю я под заказ.

Спустя 3 минуты, 32 секунды (15.06.2011 - 21:48) Потрашитель написал(а):
сейчас будет html форма..

Спустя 2 минуты, 55 секунд (15.06.2011 - 21:51) Потрашитель написал(а):
<form method="post" action="avatar.php">
<table align="center">
<tr>
<td style="border: 0px">Картинка:</td>
<td style="border: 0px"><input type='file' name='img' id="img"></td>
</tr>
<tr>
<td style="border: 0px"><input type="submit" name="ok" value="Добавить" size="10"></td>
</tr>
</table>
</form>

Спустя 11 минут, 36 секунд (15.06.2011 - 22:03) sharki написал(а):
Могу скинуть функцию, которая ресайзит картинки, и сохраняет маленькую копию)

Спустя 2 минуты, 25 секунд (15.06.2011 - 22:05) Потрашитель написал(а):
А можно без ресайза?
Просто чтобы она загружалась в папочке ava к примеру,и ссылка на неё заносил в базу при регистрации вместе с остальными данными!

Спустя 1 минута, 51 секунда (15.06.2011 - 22:07) sharki написал(а):
Ну ты загрузи изображение в папку, потом ресайз картинку до нужных размеров, в другую папку с тем же названием, занеси в БД название файла, и при выводе просто укажи путь к маленькой картинке, а в ссылке укажи путь к большой smile.gif

Спустя 1 минута, 29 секунд (15.06.2011 - 22:09) Потрашитель написал(а):
blink.gif

Спустя 1 минута, 21 секунда (15.06.2011 - 22:10) Игорь_Vasinsky написал(а):
Сразу учимся использовать bb-код для вставки кода за одно пишем валидным кодом. ок?

Если собрался загружать файл - то в <form> надо добавить ещё 1 атрибут:
enctype="multipart/form-data"


<form method="POST" action="/avatar.php" enctype="multipart/form-data">
<table
align="center">
<tr>
<td
style="border: 0px">Картинка:</td>
<td
style="border: 0px"><input type='file' name='img' id="img" /></td>
</tr>
<tr>
<td
style="border: 0px"><input type="submit" name="ok" value="Добавить" size="10" /></td>
</tr>
</table>
</form>


С формой определились.

Теперь обработчик avatar.php

Алгоритм такой:
1. Проверить данные из формы (а тут хоть POST - но из input type='file' - ты получишь массив $_FILES)
- Проверяем макс. размер в kb
- Проверяем расширение jpg, jpeg, bmp, png, gif
2. Грузим в мусорку
3. Ресайзим картинку до нужного размера (имнно ресайз - кроп я не рассматриваю)
4. Перемещаем и переименовываем в конечную папку.
5. Пишем в БД путь и имя файла аватарк для определённого юзера.

Структура БД опеделеа? покажи.

Есть что добавить?

Спустя 1 минута, 38 секунд (15.06.2011 - 22:12) sharki написал(а):
Я спать, сразу ему скину функцию, сам разберется. Все прокомментино.
// функция уменьшения изображения превью.
# $big = название большой картинки (исходная)
# $small = название будущей маленькой картинки
# $width и $height тут все понятно (уменьшает пропорционально, не искажая картинку)
# $small_patch,$big_patch ну тут тоже все понятно, пути большой и маленькой ($small_patch - путь куда класть новую маленькую картинку)


function resizeimg($big, $small, $width, $height,$small_patch,$big_patch) {
// имя файла с маштабируемым изображением
$big = $big_patch.$big;

// имя файла с уменьшенной копией
$small = $small_patch.$small;

//определиям коэфицент сжатия генерируемого изображения
$ratio = $width/$height;

// получаем размеры исходного изображения
$size_img = getimagesize($big);
list($width_src, $height_src) = getimagesize($big);

// если размеры меньше, то маштабирование не нужно
if(($width_src<$width) && ($height_src<$height)) {
copy($big, $small);
return true;
}

// получаем коэфицент сжатия исходного изображения
$src_ratio = $width_src/$height_src;

// вычисляем размеры уменьшенной копии, чтобы при мащтабировании сохранились пропорции исходного изображения
if ($ratio<$src_ratio) {
$height = $width/$src_ratio;
}
else {
$width = $height*$src_ratio;
}
// создаем пустое изображение п заданным размерам
$dest_img = imagecreatetruecolor($width,$height);
$white = imagecolorallocate($dest_img, 255, 255, 255);
if ($size_img[2] == 2) $src_img = imagecreatefromjpeg($big);
else if ($size_img[2] == 1) $src_img = imagecreatefromgif($big);
else if ($size_img[2] == 3) $src_img = imagecreatefrompng($big);

// маштабируем изображение функцией imagecopysapled()
// $dest_img - уменьшенная копия
// $src_img - исходное изображение
// $width - ширина уменьшенной копии
// $height - высота уменьшенной копии
// $size_img[0] - ширина исходного изображения
// $srze_img[1] - высота исходного изображения


imagecopyresampled($dest_img,
$src_img,
0,
0,
0,
0,
$width,
$height,
$width_src,
$height_src);

// сохраняем уменьшенную копию в файл
if ($size_img[2]==2) imagejpeg($dest_img,$small);
else if ($size_img[2]==1) imagegif($dest_img,$small);
else if ($size_img[2]==3) imagepng($dest_img,$small);
// очищаем память от созданных изображений
imagedestroy($dest_img);
imagedestroy($src_img);
return true;
}

Спустя 6 минут, 7 секунд (15.06.2011 - 22:18) Потрашитель написал(а):
Игорь_Vasinsky,вот сделаю что смогу:
<form method="POST" action="/avatar.php" enctype="multipart/form-data">
<table
align="center">
<tr>
<td
style="border: 0px">Картинка:</td>
<td
style="border: 0px"><input type='file' name='img' id="img" /></td>
</tr>
<tr>
<td
style="border: 0px"><input type="submit" name="ok" value="Добавить" size="10" /></td>
</tr>
</table>
</form>


<?php

$localhost = "localhost";

$user = "mesherjakov";

$passworduser = "123456";

$mysql_db = "mesherjakov";

$db = mysql_connect($localhost,$user,$passworduser);

mysql_select_db($mysql_db,$db);

$avatar = trim ($_FILE['img']);

if (! $avatar) exit ('бла бла бла');

?>

Дальше как делать я не знаю=(

Спустя 7 минут, 8 секунд (15.06.2011 - 22:25) Игорь_Vasinsky написал(а):
Не знаешь - покажем, но не расчитывай что сидеть придётся ложа руки.
Опять же:

<?php
//Для отладки вкл. отображение всех ошибок и нотисов
error_reporing(E_ALL);

$localhost = "localhost";
$user = "mesherjakov";
$passworduser = "123456";
$mysql_db = "mesherjakov";

//Если указать mysql_error() - то увидишь ошибку БД когда она будет
$db = mysql_connect($localhost,$user,$passworduser) or die(mysql_error());
//Если у тебя подключение одно - 2й аогумент можешь не указывать
$select_db = mysql_select_db($mysql_db) or die(mysql_error());
?>


Я просил структуру таблицы БД показать, типа

id | login | pass | date |avatar и т.д.

так ж ты наверно же указывал атрибуты полей text, varchar, int и т.д.

Вот это и надо. Сразуи по SQL пробежимся.

Работка предстоит не пыльная - но требующая особое внимания на некоторые моменты.

Спустя 3 минуты, 48 секунд (15.06.2011 - 22:29) Потрашитель написал(а):
я сейчас скину скришот!

Спустя 3 минуты, 5 секунд (15.06.2011 - 22:32) Потрашитель написал(а):
user posted image

Спустя 3 минуты, 10 секунд (15.06.2011 - 22:35) Потрашитель написал(а):
на AVATAR поставил тип - text .мне там нужна ссылка!

Спустя 12 минут, 6 секунд (15.06.2011 - 22:47) Игорь_Vasinsky написал(а):
Ты не рационально тратишь ресурсы.

id auto_increment INT(11) not null,
fio VARCHAR(60)
datarojdenia VARCHAR(8) // формат дд.мм.гг.
//
datarojdenia VARCHAR(12) // дд.мм.гггг
//datarojdenia VARCHAR(23) // дд месяц гггг
vkontakte VARCHAR(40) //я думаю максимум для url
mail VARCHAR(25)
info TEXT
avatar VARCHAR(150) //раз уж ссылка, может у тя многу народа будет ))


id- менно auto_increment - на то он и id - он должен быть уникальным для каждой строки (сам писаться будет, без твоего участия)

Тока так мы будем узнавать юзера и переименовывать его аватар.
Исправь, продолжим.

Спустя 8 минут, 45 секунд (15.06.2011 - 22:56) Игорь_Vasinsky написал(а):
Далее так как ты хочешь переименовывать аватар:

1. Загруза авы доступна при регистрации
2. Загрузка авы доступна после регистрации, редактирование профиля

Это 2 разных моменты. Как у тя?

Спустя 40 секунд (15.06.2011 - 22:56) allplayer написал(а):
У меня есть готовая. Для сайта одног делал.. Могу скинуть. пиши в асю 585-609-005

Спустя 5 минут, 59 секунд (15.06.2011 - 23:02) Потрашитель написал(а):
Игорь_Vasinsky ,смори как у меня вот тут - http://rahabr.ru/ мы для него +авы делаем.ты поймешь!

Спустя 6 минут, 18 секунд (15.06.2011 - 23:09) Потрашитель написал(а):
Цитата (allplayer @ 15.06.2011 - 19:56)
У меня есть готовая. Для сайта одног делал.. Могу скинуть. пиши в асю 585-609-005

У меня нет icq.

Спустя 4 минуты, 11 секунд (15.06.2011 - 23:13) Игорь_Vasinsky написал(а):
Я понял что ты хочешь, видел я твой сайт - его мысл не понял, ну да лан.

Вопрос остаётся вопросом или значит будет добавлено поле для загрузки авы сразу так?

Спустя 53 секунды (15.06.2011 - 23:14) Потрашитель написал(а):
Ага

Спустя 12 минут, 51 секунда (15.06.2011 - 23:27) Игорь_Vasinsky написал(а):
Так. структуру БД оставил наверн свою, раз сайт уже в работе....

Значить так - тебе не нужно новый обрботчик avatar.php - у тя уже есть какой то - туда и дополнишь код.

Теперр по пунктам.

1. Проверить что передала форма, а именно наличие массива


//имя фала
$_FILES['img']['name'];
//имя файла во временной директории
$_FILES["img"]["tmp_name"];
//вес файла кб
$_FILES['img']['size'];

а именно проверить наличие
$_FILES['img']['name'];
если это присутствует - то значит всё таки файл загрузили..

С тернарным оператором работад? проверку на присутствие пердоваемых данных пкажешь?

Спустя 7 минут, 37 секунд (15.06.2011 - 23:34) Потрашитель написал(а):
Проверка:
<?php
$img = trim ($_FILES['img']['name']);
if(! $img)
{
$_FILES["img"]["tmp_name"];
$_FILES['img']['size'];
}
else
{
echo "Аватар не загружен!";
}
?>

Так?

Спустя 7 минут, 24 секунды (15.06.2011 - 23:42) Потрашитель написал(а):
база моя терь вот так выглядит:
user posted image

Спустя 12 минут, 45 секунд (15.06.2011 - 23:54) Игорь_Vasinsky написал(а):
вникал вникал - нет логики

[php]<?php
//объявил переменную - значениякоторой может и не быть (не отправять данные)
$img = trim ($_FILES['img']['name']);
//если не объявлена переменная
if(! $img)
{
//значит откудато появятся вдруг Массив
$_FILES["img"]["tmp_name"];
$_FILES['img']['size'];
}
else
{
//а если объявлена - значит не загружена
echo "Аватар не загружен!";
}
?>


Есть тернарный опеаратор, призван упростить и сократить код (вместо if-else),работает так:
переменная = условие ? значение если условие выполнено : значение если не выполнено условие
(в моей подписи ссылка есть, почитай)

$img_tmp = isset($_FILES['img']['tmp_name']) ? $_FILES['img']['tmp_name'] : null


$img_tmp = существуют ли переданные данные ? равно переданным данным : нуль (нет значения - нет переменной)

Тепер необходимо проверить - была ли нажата кнопка submit в форме:

//Если нажата submit и были отправлены данные (на примере временного 
//имени файла который в этот момент во временной директории сервера уже)
//если не нажата - зачем тратить время и ресурсы..

if(isset($_POST['ok']) AND $img_tmp)
{
//Опредли оставшиеся 2 переменные из массива $_FILES
//тока давай им внятные имена

}


Спустя 6 минут, 51 секунда (16.06.2011 - 00:01) Игорь_Vasinsky написал(а):
У меня 3 часа ночи.

Домашнее задание

Определить 2 переменные $img_name и $img_size

Первую проверить на соответствие (тут самое - регулярка):
- не кирилица
- расширеня jpg, jpeg, bmp, png

Вторую - на максимально допустимый разрешённый размер (какой ты хошь)

Спустя 11 минут, 2 секунды (16.06.2011 - 00:12) Игорь_Vasinsky написал(а):
Тока под конец занятия учти:

1. Картинки загружаемые пользователями могут иметь не пропорцианльный размер
2. а ты скорее всего хочешь ресайзить 100х100 (или что то такое - пропорциональное)
3. След- но часть фото будет урезана - а значит кто то на своейаватарке увидит только лоб, например.

4. Варианты:

1. Подключать JQuery.Crop
2. Юзер сразу должен грузить картинку в нужном размере

И мне стало мешно biggrin.gif .
Зато краткий курс - бесплатного обучения.

Спустя 4 минуты, 8 секунд (16.06.2011 - 00:16) Потрашитель написал(а):
Спс.Завтра проснусь и с новыми силами доделаю..мож что получится=)..тока мне не надо уменьшать в размерах!Мне просто созранить картинку в папку и ссылку в mysql и се..

Спустя 3 минуты, 30 секунд (16.06.2011 - 00:20) Игорь_Vasinsky написал(а):
т.е. ресайз уже не нужен?
ну можно хоть на макс width=400px вырезать, чтоб не тяжёлая была,но и посмотреть можно было.

Вдруг с цифровиков 5Mpx грузить начнут....

Спустя 12 минут, 1 секунда (16.06.2011 - 00:32) Игорь_Vasinsky написал(а):
Цитата
Определить 2 переменные $img_name и $img_size

Первую проверить на соответствие (тут самое - регулярка):- не кирилица- расширеня jpg, jpeg, bmp, png

Вторую - на максимально допустимый разрешённый размер (какой ты хошь)

Про вторую - размер = вес в байтах

По первой - если опыта с регулярками нет - лан. сам покажу как. wink.gif

Спустя 9 часов, 37 минут, 32 секунды (16.06.2011 - 10:09) VolDroN написал(а):
ппц, ну и дырявый у тебя сайт..)
сам писал?
http://rahabr.ru/id6 - хсска активная
не одно поле не проверяется, в мыло можно хоть что написать, тоже самое в аську и телефон %)

Спустя 1 час, 34 минуты, 5 секунд (16.06.2011 - 11:43) Guest написал(а):
Эт поправимо.
Регулярка на кирилицу отменяется, всё равно переименовывать же.

Спустя 6 часов, 50 минут, 43 секунды (16.06.2011 - 18:34) Игорь_Vasinsky написал(а):
Куда пропал? :blink:

<?php
error_reporting(E_ALL);
/**
*
@author I am
*
@copyright 2011
*/

#имя файла из временной директории
$img_tmp = isset($_FILES['img']['tmp_name']) ? $_FILES['img']['tmp_name'] : null;
#Максимальный размер файла в байтах, ~460кб - достаточно для хорошего фото
$size = 460000;
#Вес в кб
$size_kb = $size / 1024;
#Разрешённые типы, лучше мы проверим mime type, расширение можно подделать
#Создадим индексный массив расширение => mime type

$ext = array("jpg", "jpeg", "bmp", "png");

#Создадим пустой массив для ошибок
$error = array();

#нажата submit и выбрана картинка, успешно загружена в tmp директорию
if(isset($_REQUEST['send']) AND is_uploaded_file($img_tmp))
{
#имя файла на локальном компе
$img_name = isset($_FILES['img']['name']) ? $_FILES['img']['name'] : null;
#вес файла в кб
$img_size = isset($_FILES['img']['size']) ? $_FILES['img']['size'] : null;
$img_size_kb = $img_size / 1024;
#myme type файла вида: image/x-png, используем str_replace чтобы получить только расширение - для сравнения с $ext
$img_type = isset($_FILES['img']['type']) ? str_replace("image/x-", "", $_FILES['img']['type']) : null;

#Проверим - не привышает ли максимальный размер на занруженный файл
if($img_size > $size)
#Запишем ошибку в пустой массив $error
$error[] = "Максимальный размер разрешённого файла: ".$size.", Ваша картинка: ".$img_size_kb."<br />";

#Проверим соответствует ли mime type, для этого поищем совпадения типа файла в нашем массиве $ext -
#у нас для этого есть in_array()!
#Мы пойдём от обратного - если совпадения нет - запишим ошибку в наш массив ошибок

if(!in_array($img_type, $ext))
$error[] = "Разрешено загружать картинки в формате JPG, JPEG, BMP, PNG<br />";


#Теперь нам остаётся загрузить и на лету переименовать файл
#Но мы не продолжим работу - если присутствуют ошибки!
#Если наш массив пуст - то ошибок нет и мы продолжаем

if(!$error)
{
#Сначала требуется проверка, был ли загружен файл во временную директорию, но так как у нас вначале скрипта стоит
#AND is_uploaded_file($img_tmp)- и раз мы здесь - значит загрузка прошла успешно, иначе бы и небыло $img_tmp
#нам остаётся переименовать и переместить его на постоянное место
#Чтобы переименовать картинку по id пользователя - нужно знать id пользователя но мы его не знаем ещё
#Чтобы узнать id есть 2 варианта: 1 - сделать запрос в БД с сортировкой по id DESC - т.е выташить id последнего
#увеличить его на 1, либо 2: записать все данные нового пользователя, вместо картинки указать null, сделать запрос в БД
#чтобы узнать значение id почследней вставленной записи - mysql_insert_id();
#сделать UPDATE avatar этой строки, 1й вариант повседневен
#а вот второй для практики не помешает - его и используем!

#Предположим что данные для нового юзера ты записал ранее этого кода, значит нам остаётся выташить последний ID

$lastID = mysql_insert_id();
#Теперь у нас есть ID - значит и новое имя файла, соберём имя картинки, так быстрей
#id.расширение(урезанный тип)

$img_name = $lastID.".".$img_type;
#обновим строку - запишем путь до аватара
#Заглушим ошибку -т.к. у нас есть свой массив ошибок

$query = @mysql_query("UPDATE `таблица` SET `avatar` = '/папка/".$img_name."'");

#Если запрос в БД прошёл, переименуем и переместим файл
if($query)
{
if(!$upload = move_uploaded_file($img_tmp, "/папка/".$img_name))
#Если перемещение файла не удалось - ошибка в массив
$error[] = "Не могу переместить файл в конецную папку";
}
#Если запрос не прошёл - запишем ошибку\
else
$error[] = "Не могу записать данные в БД";
}

#Самое время вывести ошибки - если они есть
if($error)
{
foreach($error as $errors)
{
echo $errors."<br />";
}
}

else
echo "Картинка переименована и размещена в конечной папке!"

}
?>

Спустя 1 час, 11 минут, 53 секунды (16.06.2011 - 19:46) Игорь_Vasinsky написал(а):
и что?

Спустя 3 минуты, 8 секунд (16.06.2011 - 19:49) Потрашитель написал(а):
Спасибо ОГРОМНОЕ,Игорь_Vasinsky!
За ваше терпение и за бесплатный урок.
-------------------------------
Я считаю тему закрытой.
-------------------------------
Прошу посмотрите новую тему(она на много легче):
http://phpforum.ru/index.php?showtopic=46770&hl=
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.