Bir mysql blob bir Image görüntülemek için nasıl

4 Cevap php

Ben MySQL blob alana bir resim görüntülemek için çalışıyorum. Ben bir kaç farklı şeyler denedim ve bunların hiçbiri çalışmıyor gibi görünüyor.

Ben denedim:

  • header("Content-type: $type"); img src = $blobData;

  • header("Content-type: $type"); echo($blobData);

4 Cevap

(Eğer Apache üzerinde olduğunu varsayarsak) düşünebilirsiniz Başka bir seçenek:

Oluştur .htaccess tüm resim uzantıları (png, jpg, gif) için mod_rewrite ile dosya.

Bu DB istenen görüntüyü arar bir php komut dosyası yönlendirme var. Orada ise, başlık ve BLOG dışarı echos. Orada değilse, standart bir 404 döndürür.

Eğer sahip olabilir bu şekilde:

<img src="adorablepuppy.jpg" />

Sonra ala yönlendirildi Hangi:

RewriteEngine on
RewriteRule \.(gif|jpg|png)$ imagelookup.php

Bu komut istenen görüntü URL dosya eşleşen benzersiz bir anahtara sahip olduğunu varsayar (tabii ki) görüntü, bir sorgu yapar:

 $url = $_SERVER['REQUEST_URI'];
 $url_parts = explode("/", $url);
 $image_name = array_pop($url_parts);

Şimdi sadece görüntü dosya var. (Herhangi bir doğrulama yöntemleri ve çeklerin gerçek dosyalar için adres, vb de birlikte ben size bırakıyorum eder,) sorgusu yapmak.

Bu sonuçlar ile gelirse:

 header('Content-type: image/jpeg');
 header('Content-Disposition: inline; filename="adorablepuppy.jpg"');
 print($image_blog);

Aksi takdirde:

 header("HTTP/1.0 404 Not Found");

Bilginize: Bu performans açısından kötü olurdu ben hiçbir fikrim yok. Ama bu basit bir image elemanı kullanılarak sunucu üzerinde düz bir görüntü dosyası sanki görüntü çıkışı olan, ben seni istiyorum ne yapmak için izin verecek. Ben BLOB'lar gitmek için en iyi yol olmadığını kabul etmek eğiliminde değilim, ama bu herhangi bir çapraz tarayıcı sorunları önlemek gelmez.

<?php
  header("Content-type: $type");
  echo $blobData;
?>

Bu kod mükemmel Tamam görünüyor. Ancak, benzer bir başka kişiden şikayet duydum ve bunu temin ederek bunu gidermek mümkün:

  1. Php script çıktılarının herhangi bir ekstra karakter değil önce veya ikili görüntü verilerini gönderdikten sonra.

  2. Php komut dosyası değil Unicode/UTF-8 olarak kodlanan dosya, saf bir ASCII metin dosyası olarak kaydedilir. Unicode/UTF-8 kodlanmış PHP dosyaları ilk bayt olarak bir imza içerebilir. Bu bayt metin editörü görünmez olacak ama sunucu JPEG / GIF / PNG veri önce tarayıcıya bu birkaç ekstra bayt göndereceğiz. Tarayıcı nedenle verilerin başında yanlış imza bulabilirsiniz. , Geçici çözüm notepad boş bir metin dosyası oluşturun, php kodu yapıştırın ve ANSI kodlama dosyayı kaydetmek için.

Ben karşılaşmış sorunu kodlama ile ilgili bir sorun olduğuna inanıyoruz. Bu kaynak kullanabileceğiniz iddia the print function.

Sadece veritabanından görüntü almak. Ve doğru başlıklarını kullanarak yazdırabilirsiniz.

$image = mysql_fetch_array(...)
header("Content-type: image/jpeg"); // change it to the right extension 
print $image['data'];

Performansı düşürmemek için ... bu tavsiye edilmez. Orada veritabanları görüntü koymak için çeşitli nedenleri vardır ama en yaygın şunlardır:

a) keeping them indexed (duh!)
You can do this by storing the images flat on the server and just indexing the image filename.

b) keeping the image hidden/protected
Flickr and alike still store the images flat on the server and use a different approach. They generate a URL thats hard to find.

Bu link points to a protected image hesabımda. Eğer doğru URL'yi bilmek kez yine erişebilirsiniz. Deneyin!

farm2.static - a farm optimized for delivering static content
1399 - perhaps the server
862145282 - my username
bf83f25865_b - the image

Tüm gizli görüntüleri bulmak için herhangi bir kullanıcı sabit yukarıdaki adresi ile Flickr vurdu ve son bölümünü değiştirebilir. Ama yaş alacağını ve kullanıcı muhtemelen 404s binlerce sunucuyu çekiç için bloke olur.

Bu BLOB'lar görüntüleri depolamak için küçük bir sebep olduğunu söyledi.

Edit:
Just a link pointing to someone that explained much better than I did why BLOB is not the way to go görüntüleri saklarken.