[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Вывод изображения
Begmak
Доброго времени суток !

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

А проблема в следующем: мне нужно выводить изображение из базы (изображение хранится целиком в БД, про недостатки такого способа просьба не писать, знаю, но желание заказчика - закон:) )

Так вот,у меня есть скрипт image.php:


<form enctype='multipart/form-data' method=post>
<
input type="file" name="image"><br>
<
input type=submit value='Загрузить'>
</
form>
<?php
// Число изображений на странице
$pnumber = 3;

// Устанавливаем соединение с базой данных
require("connect.inc.php");

// Обработчик HTML-формы
if(!empty($_FILES))
{
// Проверяем является ли переданный файл картинкой
if(substr($_FILES['image']['type'],0,5) == 'image')
{
// Читаем содержимое файла
$content = file_get_contents($_FILES['image']['tmp_name']);
// Уничтожаем файл во временной директории
unlink($_FILES['image']['tmp_name']);

// Экранируем спец-символы в бинарном содержимом файла
$content = mysql_escape_string($content);

// Формируем запрос на добавление файла в таблицу
$query = "INSERT INTO image VALUES(NULL, '".$_FILES['image']['name']."', '$content')";
if(mysql_query($query))
{
// Осуществляем автоматическую перезагрузку страницы
echo "<HTML><HEAD>
<META HTTP-EQUIV='Refresh' CONTENT='0; URL=
$_SERVER[PHP_SELF]'>
</HEAD></HTML>"
;
} else exit(mysql_error());
}
}

?>


<?php

// Устанавливаем соединение с базой данных
require_once("connect.inc.php");

// Провряем передан ли параметр id_image
// и является ли он целым числом, чтобы
// предотвратить SQL-инъекцию

if(!preg_match("|^[\d]+$|",$_GET['id_image']))
{
exit("Недопустимый формат URL-запроса");
}

// Извлекаем файл из базы данных
$query = "SELECT * FROM image
WHERE id_image =
$_GET[id_image]";
$img = mysql_query($query);
if(!$img) exit(mysql_error());
$image = mysql_fetch_array($img);

// Отсылаем заголовки на загрузку файла
header("Content-type: image/*");
// Отправляем файл пользователю
echo $image['content'];
?>


Соответственно на этой странице есть форма загрузки,загрузка происходит нормально. Далее вставляю в другой странице:
 <img src="image.php?id_image=1" alt="">

и вместо изображения у меня появляется рамка с картинкой и написано "Изображение" (как это бывает, если отключить показ картинок в Опере, например)

Структура таблицы такова :
CREATE TABLE image (
id_image int(11) NOT NULL auto_increment,
name tinytext NOT NULL,
content longblob NOT NULL,
PRIMARY KEY (id_image)
)


Просьба подсказать что у меня тут напортачено,или что я делаю неправильно...
Заранее благодарен!:)

П.С. Поиском пользовался, но подобной темы на форуме не нашел. Прошу простить, если она все же была.



Спустя 44 минуты, 17 секунд (18.06.2012 - 16:43) vagrand написал(а):
Откройте в отдельном окне ссылку: image.php?id_image=1 и посмотрите какие выводит ошибки

Спустя 1 час, 16 минут, 41 секунда (18.06.2012 - 18:00) CyberOrcX написал(а):
$query = "SELECT * FROM image
WHERE id_image =
$_GET[id_image]";


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

$query = "SELECT * FROM `image`
WHERE `id_image` = '"
. $_GET['id_image']. "'";

Спустя 10 минут, 34 секунды (18.06.2012 - 18:11) Begmak написал(а):
Никаких изменений sad.gif

Спустя 1 минута, 46 секунд (18.06.2012 - 18:12) Begmak написал(а):
Цитата (vagrand @ 18.06.2012 - 13:43)
Откройте в отдельном окне ссылку: image.php?id_image=1 и посмотрите какие выводит ошибки

Никаких ошибок,только появляется окно с загрузкой файла,куда сохранить и т.д. В формате php файл по умолчанию.Если переименовать в формат jpg, получается ерунда)

Спустя 42 минуты, 27 секунд (18.06.2012 - 18:55) Placido написал(а):
Перед вызовом функции header() не должно быть никакого вывода. А у вас в начале страницы форма выводится.

Цитата
Remember that header() must be called before any actual output is sent, either by normal HTML tags, blank lines in a file, or from PHP.

Спустя 52 минуты, 27 секунд (18.06.2012 - 19:47) Begmak написал(а):
Пробовал и так,и сяк:( Результат такой же sad.gif

Спустя 17 минут, 17 секунд (18.06.2012 - 20:05) Placido написал(а):
Значит, нужно попробовать по-другому.
Уберите вот эту форму
<form enctype='multipart/form-data' method=post>
<
input type="file" name="image"><br>
<
input type=submit value='Загрузить'>
</
form>
<?php
...
->
<?php
...

Причем, смотрите, чтобы перед открывающим тегом php ничего не было (даже пробелов), а также, если файл в кодировке utf, чтобы кодировка была без BOM.
И измените это (с соответствующим типом jpg/png/gif - что там у вас):
header("Content-type: image/*");
->
header("Content-type: image/jpg");

Спустя 23 минуты, 49 секунд (18.06.2012 - 20:28) varvar написал(а):
это рабочий пример, если у тебя не сработает, значит ищи причину в настройках пхп и апача

<?
// Устанавливаем соединение с базой данных
require_once("connect.inc.php");

function echoImage()
{
// Провряем передан ли параметр id_image
// и является ли он целым числом, чтобы
// предотвратить SQL-инъекцию

if(!preg_match("|^[\d]+$|",$_GET['id_image']))
die("Недопустимый формат URL-запроса");
// Извлекаем файл из базы данных
$query="SELECT * FROM `image` WHERE `id_image`=".$_GET["id_image"];
$img=mysql_query($query);
if($img===false) die(mysql_error());
$image=mysql_fetch_array($img);
if(!$image)die("Изображение не найдено!");
// Отсылаем заголовки на загрузку файла
$ext=explode(".",$image["name"]);
if(count($ext))
$ext=$ext[count($ext)-1];
else
$ext="jpg";
header("Content-type: image/".$ext);
header("Content-Length: ".strlen($image['content']));
// Отправляем файл пользователю
echo $image['content'];
}

function echoUploadForm()
{
?>
<form enctype='multipart/form-data' method=post>
<
input type="file" name="image"><br>
<
input type=submit value='Загрузить'>
</
form>
<?
// Число изображений на странице
$pnumber = 3;
// Обработчик HTML-формы
if(!empty($_FILES))
{
// Проверяем является ли переданный файл картинкой
if(substr($_FILES['image']['type'],0,5) == 'image')
{
// Читаем содержимое файла
$content = file_get_contents($_FILES['image']['tmp_name']);
// Уничтожаем файл во временной директории
unlink($_FILES['image']['tmp_name']);
// Экранируем спец-символы в бинарном содержимом файла
$content = mysql_escape_string($content);
// Формируем запрос на добавление файла в таблицу
$query="INSERT INTO image VALUES(NULL, '".$_FILES['image']['name']."', '$content')";
if(mysql_query($query))
{
// Осуществляем автоматическую перезагрузку страницы
echo"
<HTML><HEAD>
\n
<META HTTP-EQUIV='Refresh' CONTENT='0; URL=".$_SERVER[PHP_SELF]."'>\n
</HEAD>\n
</HTML>";
}
else exit(mysql_error());
}
}
}


if(isset($_GET["id_image"]))
echoImage();
else
echoUploadForm();
?>

Спустя 15 минут, 48 секунд (18.06.2012 - 20:44) Begmak написал(а):
Цитата (Placido @ 18.06.2012 - 17:05)
Значит, нужно попробовать по-другому.
Уберите вот эту форму
<form enctype='multipart/form-data' method=post>
<
input type="file" name="image"><br>
<
input type=submit value='Загрузить'>
</
form>
<?php
...
->
<?php
...

Причем, смотрите, чтобы перед открывающим тегом php ничего не было (даже пробелов), а также, если файл в кодировке utf, чтобы кодировка была без BOM.
И измените это (с соответствующим типом jpg/png/gif - что там у вас):
header("Content-type: image/*");
->
header("Content-type: image/jpg");

Не помогло sad.gif


Спустя 3 минуты, 58 секунд (18.06.2012 - 20:48) Begmak написал(а):
varvar - Работает,но наполовину smile.gif

Когда прописываю image.php?id_image=1 в адресной строке, выводится изображение (наконец таки!)
Но, ссылка на другой странице по прежнему не работает sad.gif

Подскажите , пожалуйста, в какой стороне копать.

Спустя 5 минут, 1 секунда (18.06.2012 - 20:53) varvar написал(а):
дай кусок хтмл, где эта ссылка вбита

Спустя 1 минута, 16 секунд (18.06.2012 - 20:54) Begmak написал(а):
Цитата (Begmak @ 18.06.2012 - 17:48)
varvar - Работает,но наполовину smile.gif

Когда прописываю image.php?id_image=1 в адресной строке, выводится изображение (наконец таки!)
Но, ссылка на другой странице по прежнему не работает sad.gif

Подскажите , пожалуйста, в какой стороне копать.

Прошу прощения, все заработало !

Большое спасибо всем, кто помогал !:)

Пошел постигать тайны дальше smile.gif

Спустя 3 минуты, 53 секунды (18.06.2012 - 20:58) sergeiss написал(а):
Цитата (Begmak @ 18.06.2012 - 16:59)
про недостатки такого способа просьба не писать, знаю, но желание заказчика - закон

А если заказчик захочет, чтобы ты не на ПХП делал, а на другом языке - будешь другой язык изучать?
На чем, интересно, основано такое "требование"? Это же и на Мускуль бОльшая нагрузка, и на ПХП. Т.е. сервер в итоге сильно перегружен получается. На Мускуль нагрузка больше как при выборке, так и при сохранении/изменении данных.

Спустя 3 минуты, 30 секунд (18.06.2012 - 21:02) Begmak написал(а):
Цитата (sergeiss @ 18.06.2012 - 17:58)
Цитата (Begmak @ 18.06.2012 - 16:59)
про недостатки такого способа просьба не писать, знаю, но желание заказчика - закон

А если заказчик захочет, чтобы ты не на ПХП делал, а на другом языке - будешь другой язык изучать?
На чем, интересно, основано такое "требование"? Это же и на Мускуль бОльшая нагрузка, и на ПХП. Т.е. сервер в итоге сильно перегружен получается. На Мускуль нагрузка больше как при выборке, так и при сохранении/изменении данных.

Заказчик "чуть-чуть" в этом разбирается,а переубедить его не получилось smile.gif

Если бы был другой язык- я бы просто не взялся за это дело smile.gif

Сайт будет маленьким, изображений будет от силы 100-200 штук,маленькие причем.
Быстрый ответ:

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