2010-06-16 9 views
5

Mam witrynę, która obecnie używa obrazów na serwerze plików. Obrazy pojawiają się na stronie, na której użytkownik może przeciągać i upuszczać każdą, jaka jest potrzebna. Odbywa się to za pomocą jQuery, a obrazy są ujęte w liście. Każdy obraz jest dość standardowy:Oracle Blob jako img src na stronie PHP

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

Teraz jednak muszę odwołać obrazów zapisanych jako BLOB w bazie danych Oracle (nie ma wyboru w tej sprawie, więc nie jest to zasługa dyskusja). Nie mam problem podczas pobierania BLOB i wyświetlania na jego własne przy użyciu:

$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; 

Ale muszę [skutecznie] dostać ten obraz jako atrybutu src znacznika img. Próbowałem imagecreatefromstring(), ale to po prostu zwraca obraz w przeglądarce, ignorując inny html. Przyjrzałem się pliowi danych, ale limit rozmiaru IE8 wyklucza to.

Więc teraz utknąłem. Moje wyszukiwania wciąż wymyślane są przy użyciu atrybutu src, który ładuje inną stronę zawierającą obraz. Ale potrzebuję samego obrazu, aby rzeczywiście wyświetlał się na stronie. (Uwaga: mówię obraz, co oznacza co najmniej jeden obraz, ale aż osiem na stronie).

Każda pomoc zostanie bardzo doceniona.

Odpowiedz

7

Cóż, można zrobić kilka rzeczy. Można też zrobić stronę, która będzie renderować obraz

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

To strona image.php miałoby to:

$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; 
} 

Albo, można base64 zakodować ją do src (uwaga, nie wszystkie przeglądarki obsługiwać to dobrze):

<img src="data:image/jpeg;base64,<?php echo base64_encode($img); ?>" /> 
+0

Zupełnie dobrze, dziękuję. Próbowałem tego na początku i nie mogłem go uruchomić. Problem nie polegał na podejściu, tylko błędna nazwa zmiennej została przekazana w adresie URL skryptu. Jeszcze raz dziękuję. – menkes

3

Normalny sposób to zrobić z polem <img src=/path/to/script?id=32>. Pojawi się na stronie, a nie jako link. Jaki jest problem z tym? Czy chcesz osadzić dane obrazu w HTML?

Aby uczynić go bardziej wydajne, można wdrożyć jakiś rodzaj buforowanie czyli zapisu danych obrazu do pliku i zrobić header(location...) jeśli znajdziesz go zamiast ponownie zapytań db. Również należy ustawić browser caching headers, aby przeglądarka nie pobrała obrazu, jeśli jest on buforowany lokalnie.

1

Możesz spróbować tego:

$img = $row['IMAGE']->load(); 
print('<img src="data:image/png;base64,'.base64_encode($img).'" />'); 
4

Ale muszę [skutecznie] dostać ten obraz jako atrybutu src znacznika img

Jak już powiedział Byron, akceptowanym i właściwym sposobem jest wyprowadzenie obiektu typu blob w niezależnym zasobie obrazu i osadzenie go za pomocą znacznika img. To jedyna dobra droga. Można użyć data: URIs ale

  1. dokarmiać kod HTML
  2. nie działa w IE < 8 i są limited to 32 KB in IE 8,
  3. poszerzyć ilość danych o 33%, a
  4. zabrać Brower-tych możliwość buforowania zasobu obrazu.

Prawie nigdy nie jest dobrym rozwiązaniem.

+0

+1 na wzrost ilości danych w base64. –

0
<?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); 
?> 
+0

Lepiej dodaj wyjaśnienie dla swojej odpowiedzi. –

Powiązane problemy