2015-08-10 19 views
5

Veritabanına görüntü eklediğim bir veritabanı uygulaması üzerinde çalışıyorum. Veritabanındaki InputStreams'ı bir BLOB olarak saklıyorum ve bunları almak ve bunları bir ImageIcon'a ayarlamakla ilgili sorunlarım var.Görüntü bloğunu MySQL içine ekleme - NullPointerException

fotoğraflar, döndüğüm Fotoğraf sınıfımı kullanan bir ArrayList'tir. Ben resimleri görüntülemek için denemek her zaman, aşağıdaki hatayı alıyorum ... Aşağıdaki kodu geliyor

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 
at business.appdev.Home.paintEditFrame(Home.java:577) 

..

editImageLabel[i].setIcon(
     new ImageIcon(img.getScaledInstance(imageSize, imageSize, imageSize))); 

Ben bazı temel println komutları gösteriyor ki beni img bir BufferedImage olan

[email protected] 
Retrieving a photo 
[email protected] 
Retrieving a photo 

olan MySQL veritabanından ne dönüyor. Herhangi bir yardım büyük, teşekkürler duyacağız! InputStream işlenmesi için

Kod Resultset döndü

for(int i = 0; i < photos.size(); i++){   
img = ImageIO.read(photos.get(i).getInputStream()); 
editImageLabel[i] = new JLabel(""); 
editImageLabel[i].setIcon(new ImageIcon(img.getScaledInstance(imageSize, imageSize, imageSize))); 

byte [] verilerle güncellenen Fotoğraf sınıfı okudum diğer bazı mesajlar dayanarak , ben depolamak ediyorum bayt [] MySQL'de bir varbin içine. Bundan sonra,

InputStream in = resultSet.getBinaryStream(4); 
byte[] photoData = new byte[(int) resultSet.getLong(3)]; 
ByteArrayOutputStream os = new ByteArrayOutputStream(); 
for (int len; (len = in.read(photoData)) != -1;) 
    os.write(photoData, 0, len); 
    os.flush(); 

o zaman benim fotoğraf nesnesi oluşturmak ve fotoğraflar bir ArrayList dönmek kullanarak veritabanından fotoğraf verilerini yakala. Bu, NullPointerException'ı ortadan kaldırdı, ancak şimdi ImageIcon JLabels'in görünmesini sağlayamıyorum. Ben bir Jpanel için

InputStream in = new ByteArrayInputStream(photos.get(i).getData()); 
BufferedImage newImage = ImageIO.read(in); 
editImageLabel[i] = new JLabel(""); 
editImageLabel[i].setIcon(new ImageIcon(newImage.getScaledInstance(imageSize, imageSize, Image.SCALE_DEFAULT))); 

eklemek için aşağıdaki kodu kullanabilirsiniz ve sonra Jpanel üzerine Label yerleştirin.

+0

'resultSet.getBinaryStream (index)' herhangi bir veri alıp almadığını kontrol edebilir misiniz? –

+1

Akış işleme kodunu "Photo" sınıfınızda paylaşır mısınız? –

+0

@ AlexandroSifuentesDíaz son kod bölümü resultSet.getBinaryStream (dizin) 'den dönen şeydir. Sadece test amacıyla println komutunda vardı. –

cevap

0

Görüntüyü dosya sisteminde saklayarak ve yalnızca veritabanınızdaki görüntünün yolunu kullanarak görüntüleri kodlama ve çözme zorluğundan kaçının. Bu, veritabanı boyutunuzu azaltmaya yardımcı olabilir ve bu da işlem verimliliğinize yardımcı olabilir. Sunucunuzdaki dosya için sayısal bir dosya adı oluşturmak için bazı hızlı kodları yazabilirsiniz.

+0

Bkz. Http://stackoverflow.com/questions/3748/storing-images-in-db-yea-or-nay. – fiddlestacks

İlgili konular