Lesen von Large Objects aus PostgreSQL-DB

luigied

Mitglied
Hi Leute,

ich habe Binärdateien in meiner PostgreSQL-Datenbank (Bilder, Musik). Diese sind als Large Objects gespeichert, d.h. in meiner eigentlichen Tabelle sind nur die Oids und ein der dateiname als primary key.

Wenn ich die Daten jetzt aber über JDBC auslese und die Dateien auf die Festplatte schreiben will, werden die Dateien da zwar angelegt (größe stimmt laut Win Explorer auch) aber ich kann sie nicht öffnen. Wenn ich die Dateien mit einem Texteditor öffne, wird nichts angezeigt. Ich vemute daher, dass nur Speicherplatz reserviert wird, aber nichts aus der db geschrieben wird.

Hier mein Code:
Code:
dbCon.setAutoCommit( false ); //Muss hier wegen Postgresql gemacht werden
			// TabellenSpalte falsch benannt; in spalte video ist Bild gespeichert
			PreparedStatement ps = dbCon.prepareStatement("SELECT video FROM \"mmTable\" WHERE id = ?");
			String fileName_short = fileName.replaceFirst("./attachment/", "");
			ps.setString(1, fileName_short);
			ResultSet rs = ps.executeQuery();
			if(rs.next()){		//Sicherstellen, dass ein Wert zurückgeliefert wird und ZEiger posistionieren
				// Open the large object for reading
				FileOutputStream fs = new FileOutputStream("./temp/"
						+ fileName);
			    int oid = rs.getInt(1);
			    LargeObject obj = lobj.open(oid, LargeObjectManager.READ);

			    // Read the data
			    byte buf[] = new byte[obj.size()];
			    //obj.read(buf, 0, obj.size());
					fs.write(buf, 0, obj.size());
			    // Do something with the data read here
			    System.out.println("Objektgröße: " + String.valueOf(obj.size()));
			    // Close the object
			    fs.close();
			    obj.close();
			}
			rs.close();
			ps.close();

			// Finally, commit the transaction.
			dbCon.commit();

Weiss einer, was ich hier falsch mache?

Danke im Vorraus.

Mfg LuigiEd
 
Ich habe keine Ahnung von Postgres, aber du schreibst doch nirgendwo etwas in das Array. Dort wo du als Kommentar "Read the data" stehen hast, erstellst du ein Bytearray und schreibst das in die Datei. Defaultmäßig stehen dort nur Nullen drin (öffne die Datei mal mit einem Hex-Editor).
Java:
// Read the data
byte buf[] = new byte[obj.size()];

//Die Zeile hier fehlt! So ähnlich müsste es funktionieren
obj.read(buf, 0, obj.size());

fs.write(buf, 0, obj.size());

Edit: Ich sehe gerade, dass die Zeile ja da ist, aber auskommentiert. Wieso?
 
Zuletzt bearbeitet:
Warum zum Geier ist die ZEile bei mir auskommentiert, und noch schlimmer: Wieso ist mir das nicht aufgefallen****?

Danke erstmal. Werd es nachher gleich mal probieren
 
Zurück