SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 19.05.2008 15:37:22

prisoner
Участник
Зарегистрирован: 19.05.2008
Сообщений: 4

Вопрос про BLOB (размер изображения)

Есть скрипт, который помещает изображение в таблицу в поле BLOB. Как средствами МуСКУЛа  (+ ПХП) получить информацию о ширине и высоте загруженного изображения? И вообще, возможно ли это?

Неактивен

 

#2 19.05.2008 16:06:17

prisoner
Участник
Зарегистрирован: 19.05.2008
Сообщений: 4

Re: Вопрос про BLOB (размер изображения)

Уточнение.
Скрипт помещает изображения в таблицу 'images'. В таблице есть поля image_width и image_height. Откуда брать информацию для заполнения этих полей?
Может, getimagesize()? Но я так и не понял, как передать ей загружаемую картинку...

Неактивен

 

#3 19.05.2008 16:31:59

EugeneTM
Гуру
Зарегистрирован: 11.04.2008
Сообщений: 89

Re: Вопрос про BLOB (размер изображения)

Вот под руку попался кусок кода.
Может гнать. Нужно знать как имидж в блоб заталкивался. В данном случае проискейпленный jpg из строки.
$im обычный ресурс, с ним можно все что позволяет GD делать

if (mysqli_real_query($link, $query)) {
    if ($result = mysqli_store_result($link)) {
       $row = mysqli_fetch_assoc($result);
       $im = imagecreatefromstring($row[PictSmall] );
       if ($im !== false) {
           imagejpeg($im);
          }
      else {
           echo 'An error occurred.';
          }

Неактивен

 

#4 19.05.2008 17:45:48

prisoner
Участник
Зарегистрирован: 19.05.2008
Сообщений: 4

Re: Вопрос про BLOB (размер изображения)

Имаж в блобе оказывается следующим путем

<?
if(isset($_POST['upload']) && $_FILES['userfile']['size'] > 0)
{
$fName = $_FILES['userfile']['name'];
$tmpName  = $_FILES['userfile']['tmp_name'];
$fSize = $_FILES['userfile']['size'];
$fType = $_FILES['userfile']['type'];
$fp      = fopen($tmpName, 'r');
$content = fread($fp, filesize($tmpName));
$content = addslashes($content);
fclose($fp);
if(!get_magic_quotes_gpc())
{
    $fileName = addslashes($fName);
}
include'lib/config.php';
include 'lib/opendb.php';
$query = "INSERT INTO images (img_name, img_size, img_type, img_content ) ".
"VALUES ('$fName', '$fSize', '$fType','$content')";
mysql_query($query) or die('Error, query failed'.mysql_errno().":".mysql_error()."");
?>

На этом этапе реально получить требуемые данные? Чтобы сразу вбить их в поля image_width и image_height, одним запросом?

Неактивен

 

#5 19.05.2008 18:55:33

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Вопрос про BLOB (размер изображения)

Функция PHP getimagesize выполняет эту функцию, но ей надо передавать URL http://ru2.php.net/getimagesize

Как обходной вариант - сначала загружаете в базу BLOB  без размеров и делаете так, чтобы при этом рисунок стал доступен по HTTP. Вторым шагом - передаете HTTP-адрес рисунка функции getimagesize() и заносите размеры в базу

Неактивен

 

#6 20.05.2008 08:59:11

EugeneTM
Гуру
Зарегистрирован: 11.04.2008
Сообщений: 89

Re: Вопрос про BLOB (размер изображения)

prisoner написал:

Имаж в блобе оказывается следующим путем

<?
if(isset($_POST['upload']) && $_FILES['userfile']['size'] > 0)
{
$fName = $_FILES['userfile']['name'];
$tmpName  = $_FILES['userfile']['tmp_name'];
$fSize = $_FILES['userfile']['size'];
$fType = $_FILES['userfile']['type'];
$fp      = fopen($tmpName, 'r');
$content = fread($fp, filesize($tmpName));
$content = addslashes($content);
fclose($fp);
if(!get_magic_quotes_gpc())
{
    $fileName = addslashes($fName);
}
include'lib/config.php';
include 'lib/opendb.php';
$query = "INSERT INTO images (img_name, img_size, img_type, img_content ) ".
"VALUES ('$fName', '$fSize', '$fType','$content')";
mysql_query($query) or die('Error, query failed'.mysql_errno().":".mysql_error()."");
?>

На этом этапе реально получить требуемые данные? Чтобы сразу вбить их в поля image_width и image_height, одним запросом?

По порядку.
В переводе на человеческий это звучит так:
Получаем адрес файла, причем реально не знаем имидж ли он.
Получаем его тип , и верим этому sad.
Считываем его содержимое в переменную.
Не очень на мой взгляд правильно addslashes на переменную содержащую имидж (это так, IMHO).
Затем все это заталкиваем в базу.

Здесь не так:
Мы не проверили имидж ли это вообще и место ли ему в базе.
Если это все же имидж, мы не проверили его тип и размер. Вполне может пользователь пихнуть BMP метров на 100 и не обязательно по злому умыслу, может и сдуру. А от таких блобов у MySQL кома начинается.

Как по моему более правильно

Из переменной предположительно содержащей имидж создаем ресурс, $im это image identifier, ссылка на ресурс
$im = imagecreatefromstring($content);
if ($im !== false) {
   /* Если это все же корректный имидж*/
   /* Получаем его размеры */
    $width = imagesx($img);
    $hight = imagesy($img);
   /* Затем по идее необходимо имидж преобразовать во что-то типа PNG, возможно изменив размер.
       Велосипед изобретать не буду, здесь http://xpoint.ru/know-how/Articles/Teor … obrazheniy
       крайне подробный пример. Он только на первый взгляд страшный. */
    /* Преобразованный имидж заталкиваем назад в строку. GD этого не умеет , поэтому слегка ее обойдем */
    ob_start();
    imagepng($img); /*если конечно в png преобразовали, если нет - соответствующую функцию */
    $content = ob_get_contents();
    ob_end_clean();
    /* искейпим строку. это вместо $content = addslashes($content) */
    $content = mysql_escape_string($content); 
}
else {
    echo 'Это не имидж или данный формат не поддерживается, а может еще чего нить.';
}

Все. Все данные и причесанный имидж у нас есть. Можно заталкивать в базу.

Неактивен

 

#7 26.05.2008 01:13:33

prisoner
Участник
Зарегистрирован: 19.05.2008
Сообщений: 4

Re: Вопрос про BLOB (размер изображения)

Спасибо огромное. Буду работать дальше.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson