Oracle Blob как img src на странице PHP - PullRequest
5 голосов
/ 16 июня 2010

У меня есть сайт, который в настоящее время использует изображения на файловом сервере. Изображения появляются на странице, где пользователь может перетаскивать каждое из них по мере необходимости. Это сделано с помощью jQuery, и изображения включены в список. Каждое изображение довольно стандартное:

<img src='//network_path/image.png' height='80px'>

Теперь мне нужно сослаться на изображения, хранящиеся в виде BLOB в базе данных Oracle (выбора нет, поэтому обсуждение вопроса не стоит). У меня нет проблем с извлечением большого двоичного объекта и его отображением, используя:

$sql = "SELECT image FROM images WHERE image_id = 123";
$stid = oci_parse($conn, $sql);
oci_execute($stid);
$row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS);
$img = $row['IMAGE']->load();
header("Content-type: image/jpeg");
print $img;

Но мне нужно [эффективно] получить это изображение в качестве атрибута src тега img. Я попытался imagecreatefromstring (), но он просто возвращает изображение в браузере, игнорируя другой HTML. Я посмотрел на данные URI, но это ограничивает размер IE8.

Так что теперь я застрял. В моих поисках постоянно используется атрибут src, который загружает другую страницу, содержащую изображение. Но мне нужно, чтобы само изображение действительно отображалось на странице. (Примечание. Я говорю «изображение», то есть, по крайней мере, одно изображение, но целых восемь на странице)

Любая помощь будет принята с благодарностью.

Ответы [ 5 ]

7 голосов
/ 16 июня 2010

Ну, вы можете сделать несколько вещей.Вы можете сделать страницу, которая будет отображать изображение

<img src="image.php?id=123" />

Эта страница image.php будет иметь это:

$sql = "SELECT image FROM images WHERE image_id = " . (int) $_GET['id'];
$stid = oci_parse($conn, $sql);
oci_execute($stid);
$row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS);
if (!$row) {
    header('Status: 404 Not Found');
} else {
    $img = $row['IMAGE']->load();
    header("Content-type: image/jpeg");
    print $img;
}

Или вы можете кодировать base64 в src (примечаниене все браузеры справляются с этим хорошо):

<img src="data:image/jpeg;base64,<?php echo base64_encode($img); ?>" />
4 голосов
/ 16 июня 2010

Но мне нужно [эффективно] получить это изображение в качестве атрибута src тега img

Как уже сказал Байрон, принятым и правильным способом является вывод большого двоичного объекта в виденезависимый ресурс изображения, и внедрить его с помощью тега img.Это единственный хороший способ.Вы можете использовать data: URI , но они

  1. увеличивают ваш HTML-код
  2. не работают в IE <8 и <a href="http://msdn.microsoft.com/en-us/library/cc848897%28VS.85%29.aspx" rel="nofollow noreferrer"> ограничены 32КБ в IE 8 ,
  3. увеличивает объем данных на 33%, а
  4. лишает браузер возможности кэшировать ресурс изображения.

Почти никогда не бывает хорошим вариантом.

3 голосов
/ 16 июня 2010

Обычный способ сделать это с помощью поля <img src=/path/to/script?id=32>. Он будет отображаться на странице не как ссылка. В чем проблема с этим? Хотите встроить данные изображения в HTML?

Чтобы сделать его более эффективным, вы можете реализовать некоторый тип кэширования, например, записать данные изображения в файл и выполнить header(location...), если найдете его, вместо того, чтобы снова запрашивать БД. Также следует установить заголовки кэширования браузера , чтобы браузер не загружал изображение, если оно кэшировано локально.

1 голос
/ 16 июня 2010

Вы можете попробовать это:

$img = $row['IMAGE']->load();
print('<img src="data:image/png;base64,'.base64_encode($img).'" />');
0 голосов
/ 15 июня 2016
<?php
if(isset($_POST['']))//get the id
$roll_no=$_POST[''];
$conn = oci_connect("", "", "");//DB connection
$query = 'SELECT image FROM TABLE where id=:id';
$stmt = oci_parse ($conn, $query);
oci_bind_by_name($stmt, ':id', $id);
oci_execute($stmt);
$arr = oci_fetch_array($stmt, OCI_ASSOC);
$result = $arr['image']->load();
header("Content-type: image/JPEG");
echo $result;
oci_close($conn);
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...