LargeObject anzeigen

MScalli

Erfahrenes Mitglied
Hi Leutz.
Ich versuche ein Dokument/Bild in einer Postgres Datenbank als Large Object zu speichern(oid in der Datenbank).
Das klappt auch soweit.
Leider bekomme ich es nicht hin daraus wieder ein Dokument (in diesem fall ein Bild) zu erzeugen.
Ich habe vor Bilder und vor allen dingen PDF´s so zu speichern.
Hier mal mein Quellcode wie ich es speichere.

Code:
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

import org.postgresql.PGConnection;
import org.postgresql.largeobject.LargeObject;
import org.postgresql.largeobject.LargeObjectManager;


public class SaveDocumentsInDB {

	SaveDocumentsInDB() throws SQLException, IOException{
		
		String user = "postgres";
		String pw = "passwort";
		String host = "localhost";
		String database = "database";
		String port = "5432";
		Connection con = null;
		
	    try {
	      Class.forName ("org.postgresql.Driver");
	    } catch (ClassNotFoundException e) {
	      e.printStackTrace ();
	      System.exit (1);
	    }
	    
	    // Verbindung mit der Datenbank herstellen
	    try{
	      con = DriverManager.getConnection ("jdbc:postgresql:" + "//" + host + ":" + port + "/" + database ,user, pw);
	    } catch (SQLException e) {
	      e.printStackTrace ();
	      System.exit (1);
	    }


			PGConnection pgconn = (PGConnection) con ;
			con.setAutoCommit(false) ;
			
			LargeObjectManager lom =
			pgconn.getLargeObjectAPI( ) ;

			long oid = lom.createLO( lom.READ ) ;

			LargeObject lo = lom.open ( oid ) ;
			File f2 = new File ( "C:\\Dokumente und Einstellungen\\All Users\\Dokumente\\Eigene Bilder\\Beispielbilder\\Winter.jpg" ) ;
			FileInputStream fis2 = new FileInputStream ( f2 ) ;
			while ( fis2.available() > 0 )

			lo.getOutputStream().write( fis2.read( ) ) ;
	
			lo.close( ) ;
			
			
			PreparedStatement ps2 =((Connection) pgconn).prepareStatement (
				"INSERT INTO Bilder " +
				"( name, bildoid ) " +
				"VALUES( ? , ? ) " ) ;
				ps2.setString( 1 , "Winter.jpg" ) ;
				ps2.setLong ( 2 , oid ) ; // The OID o f the LO
				
				ps2.executeUpdate ( ) ;
				ps2.close( ) ;
				con.commit ( ) ;
				con.setAutoCommit( true ) ;
				con.close( ) ;
    
	}
	/**
	 * @param args
	 * @throws IOException 
	 * @throws SQLException 
	 */
	public static void main(String[] args) throws SQLException, IOException {
		new SaveDocumentsInDB();

	}

}

WIe schon gesagt ist alles nur mal zum testen.
Aber wie in 3 teufels namen mache ich aus dem ding wieder ein jpg ?!

Habe schon paar sachen ausprobiert die ich im Netz gefunden habe leider klappt es nicht mal ansatzweise :(

plz help!!
 
Nett wäre jetzt zu wissen was du ausprobiert hast?

Also ohne jetzt nachgeschaut zu haben würde ich sagen du stellst die Datenbankanfrage und machst dann auf dem ResultSet getBytes und schreibst das wieder in eine Datei oder lädst mittels ImageIO vom Byte Array.
 
Das hier z.B. aus dem netzt.. das läuft auch durch.. nur weiss ich nicht genau wie ich jetzt daraus wieder das bild erzeuge!!

// Alle LargeObject-Aufrufe müssen in einem Transaktionsblock stehen
conn.setAutoCommit(false);

// Erzeuge einen Large-Object-Manager
LargeObjectManager lobj = ((org.postgresql.PGConnection)conn).getLargeObjectAPI();

PreparedStatement ps = con.prepareStatement("SELECT bildoid FROM bilder WHERE name = ?");
ps.setString(1, "meinbild.gif");
ResultSet rs = ps.executeQuery();
if (rs != null) {
while (rs.next()) {
// Öffne das Large Object zum Schreiben
int oid = rs.getInt(1);
LargeObject obj = lobj.open(oid, LargeObjectManager.READ);

// Lese die Daten
byte buf[] = new byte[obj.size()];
obj.read(buf, 0, obj.size());
// Hier soll/kann man die daten verwenden.. aber wie!

// Schließe das Objekt
obj.close();
}
rs.close();
}
ps.close();
 
Du kannst buf über nen FileOutputStream in ne Datei schreiben oder mit
Java:
ImageIO.read(new ByteArrayInputStream(buf))
direkt in nen Bild einlesen.

Tu uns bitte den Gefallen und verwende die entsprechenden Code-Tags wenn du länger Code-Abschnitte postest.
 
ups sry. Dachte eigentlich das hab ich :)
werd ich heut abend nach der Arbeit gleich mal ausprobieren das in eine Datei zu schreiben.
Müsste doch dann klappen wenn ich eine pdf speichere und den Stream dann wieder als pdf speichere bzw. erzeuge.
Ich poste dann wie es geht, wenn es geht ! ^^
 
Zurück