Wie kann ich textdateien, die als BLOB abgespeichert sind, aus der Datenbanktabelle auslesen?

ebruss17

Bekanntes Mitglied
die folgende Seite soll anhand der b_ID innerhalb des SELECT-Statements die jeweiligen Textfiles auf der JSP-Seite anzeigen: Ich versuche mit dem p-Tag ganz weit unten die Spalte "Attachments" die die jeweiligen Textfiles beinhaltet, d.h. als Datentyp "BLOB" bekommen hat, auf der JSP-Seite auszulesen geht aber leider nicht! Wie könnte ich die jeweiligen Textfiles, die in der Spalte "Attachments" innerhalb der Datenbanktabelle "Blob" gespeichert sind, auslesen? der Select-Statement soll die Spalte "Attachments" aus der Tabelle "Blob" anzeigen, jenachdem auf welche b_ID in der vorherigen Seite geklickt wurde...
Java:
Connection connection = null;
	PreparedStatement selectKunden = null;
	ResultSet resultSet = null;
	BufferedReader read;

	String id = request.getParameter("xml");

	int zahl;
	zahl = Integer.parseInt(id);
	
	try {
		response.setContentType("text/plain");
		connection = DriverManager.getConnection(url, user, password);

		selectKunden = connection
				.prepareStatement("SELECT RT.Blob.Attachments FROM RT.Blob WHERE RT.Blob.b_ID =?");
		selectKunden.setInt(1, zahl);
	} catch (SQLException e) {
		e.printStackTrace();
	}

	try {

		
		resultSet = selectKunden.executeQuery();
		

	} catch (SQLException e) {
		e.printStackTrace();
	}
	

%>  <%


 	while (resultSet.next()) {
	
 		
 		Blob blob = resultSet.getBlob("Attachments");
 		InputStream in = blob.getBinaryStream();
 		in.read();
 		 %>  <p><%= blob%></p><%
 	}
 %> </body> </html>

Die Ausgabe meiner JSP-Seite sieht so aus:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html> <head><title>Titel hier einfügen</title> </head> <body>

<p>com.ibm.db2.jcc.am.je@cb4d72ba</p> </body> </html>
 

Dompteur

Top Contributor
Versuche es einmal damit (ab Zeile 40) :
Java:
Blob blob = resultSet.getBlob("Attachments");
 byte[] bdata = blob.getBytes(1, (int) blob.length());
 String text = new String(bdata);
Dann kannst du den Inhalt der Variable text in deinem JSP Code verwenden.
 

ebruss17

Bekanntes Mitglied
ich habe es jetzt mal so umgebaut, wie du es gesagt hast, aber jetzt wird mit der Dateipfad ausgegeben! :D Ich möchte aber den Inhalt der Textdatei sehen :D

Java:
while (resultSet.next()) {
	
 		
 		Blob blob =resultSet.getBlob("Attachments");
        byte[] bdata = blob.getBytes(1, (int)blob.length());
        String text  = new String(bdata);
 		 %> 
 		 	<p><%=text%></p>
 		  
 		 <%
 	}
 %> </body> </html>
 

Dompteur

Top Contributor
Wo kommt der Dateipfad her ?
Ich vermute, du speicherst in der Datenbank den Dateipfad und den Dateiinhalt.
Ist der Dateipfad auch ein BLOB ?

Wenn das so ist, dann prüfe bitte, ob du das richtige Feld aus der Datenbank holst.

Nachtrag: Falls du es noch nicht gemacht hast, solltest du auch prüfen, ob in der Datenbank die richtigen Daten drin stehen.
 
Zuletzt bearbeitet:

ebruss17

Bekanntes Mitglied
ich hatte es so in die Datenbank gespeichert gehabt, d.h. mit dem Dateipfad

Java:
INSERT INTO RT.Blob (l_ID, Attachments) VALUES (21, blob(''C:/Users/ADMIN/Desktop/log.zip/log/curation/WatsonCuratorPreReqTest_Knockout_Round_5_2014-11-11_23h14m09s/IWCPreReq_results.log'))

wäre das denn nicht korrekt? Wie müsste ich es denn reinspeichern?
 

Dompteur

Top Contributor
Fangen wir mit der guten Nachricht an: Dein ursprüngliches Problem dürfte gelöst sein. Es zeigt das an, was in der Datenbank im BLOB drin steht.

Bei deinem Insert wird der Dateiname als String in das BLOB gespeichert. Du kannst es ausprobieren, indem du statt des Pfads einen beliebigen Text reinschreibst.

Ich vermute, dass du das über ein Datenbank-Frontend eingibst. Oder ?
Ob man damit so einfach Dateien in die Datenbank importieren kann, müßtest du in der Dokumentation nachschauen.
Sonst müsstest du die ein Java-Programm für den Import schreiben.
 

stg

Top Contributor
....mal ganz unabhängig vom bisher geschriebenen: Unterstützt deine Datenbank kein CLOB? Wenn du nur Text speichern willst, wäre das doch sinnvoller. :)
 

ebruss17

Bekanntes Mitglied
ähhhmmmm in dieser BLOB-Spalte "Attachments" sollen auch viele andere Datein abgespeichert werden, wie z.B. XML, pdf usw. Ich möchte halt, dass mir dann die jeweiligen Inhalte von diesen Dateien auf der JSP-Seite angezeigt werden. KÖnnte mir jemand einen Beispiel dafür geben? (Codebeispiel) wie ich das in Java umzusetzen habe??
 

ebruss17

Bekanntes Mitglied
Kann man denn nicht innerhalb von FileReader die entsprechende BLOB-Spalte auslesen mit dem resultSet? Wie etwa so??

<%


Java:
while (resultSet.next()) {
	
 		
 		 FileReader fr = new FileReader(resultSet.getBlob("Attachments").toString());
    BufferedReader br = new BufferedReader(fr);

    
 		 %> 
 		 	<p><%=br%></p>
 		  
 		 <%
 	}
 %> </body> </html>
 

Dompteur

Top Contributor
Ich habe das jetzt nicht ausprobiert. Aber, wenn das funktionieren sollte, dann liest du ja den Filenamen aus der Datenbank und den Inhalt des File von der Platte.
Ist es wirklich das, was du willst ?
Ich dachte, dass du den Fileinhalt im BLOB haben möchtest.
 

ebruss17

Bekanntes Mitglied
genau ich möchte den Fileinhalt haben, sodass es auch auf der JSP-sEite ausgegeben wird. Muss hierfür nicht der Dateipfad in das BLOB-Feld eingespeichert sein?
 

Dompteur

Top Contributor
Nein, ins BLOB gehört der Fileinhalt.

Sobald der Fileinhalt in der Datenbank (also im BLOB) ist, kannst du das File sogar löschen. Der Dateipfad ist ab dann uninteressant.

Den Filepfad brauchst du wirklich nur zum Zeitpunkt des INSERTs.
 

ebruss17

Bekanntes Mitglied
okayyy ist dieser InSERT dann falsch?? Wenn ja, wie müsste das denn aussehen?


Java:
    INSERT INTO RT.Blob (l_ID, Attachments) VALUES (21, blob('C:/Users/ADMIN/Desktop/log.zip/log/curation/WatsonCuratorPreReqTest_Knockout_Round_5_2014-11-11_23h14m09s/IWCPreReq_results.log'))
 
Zuletzt bearbeitet:

Dompteur

Top Contributor
Ja, das INSERT ist falsch.

Dein INSERT hast du ja nicht so im JAVA Code. Es sieht für mich so aus als würdest du ein Frontend für deine Datenbank verwenden und dort SQL Statements eingeben.
Ich weiß nicht, welche Möglichkeiten dieses Tool hat - ich weiß ja nicht einmal welches Tool du da verwendest... Daher kann ich dir da nicht helfen.

Zur Probe kannst du ja dein INSERT Statement so ändern, dass da nicht der Dateiname steht, sondern der Text aus der Datei.


Wenn du nicht weiterkommst, dann musst du dir wohl ein Java-Programm schreiben und die Dateien damit importieren.
 

ebruss17

Bekanntes Mitglied
genau, ich habe ein Frontend für meine Datenbank, wo ich einige aber nicht alle INSERT-Statements hierbei ausführen lasse. Das ist der "Rational Application Developer for WebSphere Software". Ich habe diesen INSERT-Statement so wie du gemeint hast auch abgeändert, wo dann der TExt aus der Datei drinsteht. DAs wird mir auch ohne Probleme ausgegeben auf der JSP-SEite... ABER hat man denn nicht die Möglichkeit, den Dateipfad im INSERT-Statement einzuspeichern und dass man dann wenn man auf einen Hyperlink klickt auf die jeweilige Text-Datei verwiesen wird???
 

Dompteur

Top Contributor
Du musst dich entscheiden, was du in der Datenbank speichern willst:
* den Dateiinhalt (optional den Dateinamen in einem eigenen Feld)
* den Dateipfad

Beides hat Vor- und Nachteile.

Da du ein BLOB Feld benutzt hast, bin ich davon ausgegangen, dass du Variante 1 gewählt hast.

Natürlich ich auch Variante 2 möglich. Da sollte dir aber bewußt sein, dass jeder Client der Datenbank unter C:\.. einen anderes physischen Ort adressiert. Solange aber nur dein Webserver diese Pfade benutzt, wäre das handhabbar. Da ich dein Projekt nicht kenne, enthalte ich mich einer Wertung.
In diesem Fall würdest du also zuerst den Filenamen aus der Datenbank lesen und dann müsstest du den Dateiinhalt von der Platte lesen.

Also etwa so:

Java:
  import java.nio.file.Files;
  import java.nio.charset.Charset;
 
  String readFile(String path) throws IOException 
  {
     byte[] encoded = Files.readAllBytes(Paths.get(path));
     return new String(encoded, Charset.defaultCharset());
  }
...
 

  Blob blob = resultSet.getBlob("Attachments");
  byte[] bdata = blob.getBytes(1, (int) blob.length());
  String filename = new String(bdata);

  String text = readFile(filename);

Wobei du dich noch um die Exceptionbehandlung kümmern musst. Außerdem solltest du nicht alles im JSP File machen, sondern in eine Bean verlagern.
 
Zuletzt bearbeitet:

ebruss17

Bekanntes Mitglied
ich habe das jetzt mal so umgesetzt, wie du es angegeben hast: Bei
Java:
String readFile(String path)
steht jedoch irgendwas mit Syntaxfehler verstehe aber nicht warum????:bahnhof:

Java:
<%
		String readFile(String path)
	{
	byte[] encoded = Files.readAllBytes(Paths.get(path));
	return new String(encoded, Charset.defaultCharset());
	}
	 	while (resultSet.next()) {

		
	     Blob blob =resultSet.getBlob("Attachments");
		byte[] bdata = blob.getBytes(1, (int)blob.length());
		String filename = new String(bdata);
		String text = readFile(filename);
	%>
	<div><%=text%></div>

	<%
		}
	%>
</body>
</html>
 

Joose

Top Contributor
steht jedoch irgendwas mit Syntaxfehler verstehe aber nicht warum????:bahnhof:

Wenn du bei deinen Antworten präziser wärst, könnte man dir einfacher helfen.
Kopiere doch einfach Fehlermeldungen 1:1 und poste sie hier. Egal ob es ein Compile Error, Syntax Error oder eine Exception ist.
Nur mit "sowas wie ...." können wir nichts anfangen!

Und antworte auf Fragen, wenn man sie dir stellt: Du hast uns noch nicht verraten was du nun wirklich speichern willst.
Willst du den Dateinhalt oder den Dateipfad in der Datenbank speichern?
Für den Dateipfad brauchst du keine BLOB Spalte da reicht ein einfaches VARCHAR Feld. Für den Dateiinhalt wäre natürlich CLOB die richtige Wahl.
 

ebruss17

Bekanntes Mitglied
da wird keine exception ausgegeben, sondern links an der Zeile
Java:
String readFile(String path)
ein Fehler, da steht: "Syntaxfehler bei Tocken "(",; erwartet"

zu Joose:

ich möchte hierbei innerhalb der "Attachments"-Spalte auch zip-Dateien speichern... D.H. dann muss ich doch den Dateipfad mitspeichern oder??
 

Joose

Top Contributor
Ja da steht doch genau was der Compiler bemängelt. Es wird wo eine "(" erwartet die aber nicht kommt.
Syntaxfehler sollten in der Regel von alleine zu lösen sein!

Das beantwortet meine Frage nicht. Willst du nur den Dateipfad speichern oder gleich die ganze Datei? (Welche Art von Datei ist unerheblich
 

ebruss17

Bekanntes Mitglied
ich möchte die ganze Datei speichern!!! und wenn ich auf den jeweiligen Link klicke, soll es mich auf die andere JSP-Seite verweisen, wo mir dann der Inhalt der Datei ausgegeben werden soll!
 

Dompteur

Top Contributor
Zuerst zum Syntaxfehler:
Die neue Methode readFile darf natürlich nicht mitten in deinem Code stehen. Der Compiler erwartet nicht mitten in einer Methode die Definition einer weiteren Methode.

Möglicherweise hast du meinen Satz "Außerdem solltest du nicht alles im JSP File machen, sondern in eine Bean verlagern. " überlesen. Ich würde sowohl die Datenbankabfrage als auch das Einlesen der Datei in die Bean verlagern.

Beans sind Javaklassen, in die du alles, was nicht mit dem Seitenlayout zu tun hast, verlagerst.
Hier 2 Links zu diesem Thema (einmal deutsch, einmal englisch):
* https://www.tu-chemnitz.de/wirtschaft/wi1/lehre/2004_ss/wi_pr3/java2/jsp2.htm
* JSP - JavaBeans

Allerdings glaube ich weiterhin nicht, dass du die readFile Methode brauchst.

Daher zum Generellen:

Anscheinend brauchst du sowohl einen Namen für die Datei als auch deren Inhalt.
Deine Tabelle muss also:
* eine ID (die hast du bereits: bl_id)
* einen Namen : Dieser dient nur der Anzeige in der Liste. Wahrscheinlich brauchst du da auch nicht den ganzen Pfad
* den Dateiinhalt : eben dein BLOB
enthalten.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
krgewb Breite und Höhe von Blob Datenbankprogrammierung 7
H Oracle Resize eines Images in Java und Rückgabe des Image als BLOB an die Oracle Datebank Datenbankprogrammierung 14
H Java Class zum komprimieren von Jpeg-Images zum Einbinden in Oracle DB - Bild als blob (in und out) Datenbankprogrammierung 23
D MySQL Sicherheitslücke als Blob? Datenbankprogrammierung 3
buggy84 MySQL BLOB Geschwindigkeit Datenbankprogrammierung 16
L H2 Blob Dateien in der DB komprimieren? Datenbankprogrammierung 8
L H2 Blob Spalte im Client anzeigen Datenbankprogrammierung 2
E Wie kann man das Problem mit der BLOB-Spalte lösen? Datenbankprogrammierung 1
E Wie kann man BLOB-Spalten in DB2 einfügen? Datenbankprogrammierung 9
R MySQL Blob aus DB auslesen und einer Tabelle ausgeben Datenbankprogrammierung 7
J BLOB to ImageIcon? Datenbankprogrammierung 3
Kenan89 Sinnvoller URL oder BLOB? Datenbankprogrammierung 2
F H2:Wie kann man insert eine Reihe "int" wert als blob in table? Datenbankprogrammierung 12
N Leeres Blob in ein PreparedStatement eintragen Datenbankprogrammierung 2
C MySQL Fragen zu BLOB zu byte[], Date zu java.util.Date uvm. Datenbankprogrammierung 6
D Blob MimeTyp auslesen Datenbankprogrammierung 2
P MySQL Objekt aus BLOB auslesen Datenbankprogrammierung 3
M Problem Array in BLOB-Feld in DerbyDB zu speichern Datenbankprogrammierung 5
C MP3 in DB als Blob, wieder auslesen und als MP3 speichern??? Datenbankprogrammierung 8
S BLOB in Datei speichern Datenbankprogrammierung 8
S Hibernate Blob mit Stream speichern Datenbankprogrammierung 3
V PostgreSQL langsam (Blob) Datenbankprogrammierung 10
G Blob aus Oracle-Datenbank Datenbankprogrammierung 2
O Vector als Blob in Oracle Datenbank speichern Datenbankprogrammierung 3
D Insert Oracle BLOB Datenbankprogrammierung 1
B Java Derby Datenbank mit CLOB & BLOB Datenbankprogrammierung 5
J Bild aus Mysql Blob in Webseite einbinden Datenbankprogrammierung 9
H Blob erzeugen Datenbankprogrammierung 2
T Inhalt von Blob in Console ausgeben Datenbankprogrammierung 2
G Sybase IMAGE-Daten zu MySQL als BLOB schreiben. Datenbankprogrammierung 2
T Datei (Blob) mit verknüpfter Software öffnen? Datenbankprogrammierung 4
G File nach Blob konvertieren ? Datenbankprogrammierung 6
G JPEG to BLOB Datenbankprogrammierung 7
H File into blob Datenbankprogrammierung 3
A Blob in Oracle-DB einfügen (veraltete Methode) Datenbankprogrammierung 3
EagleEye Blob -> backup Datenbankprogrammierung 6
Y Problem mit Ablage einer Datei in einer Datenbank als BLOB Datenbankprogrammierung 6
O Oracle Blob in MySQL Blob umwandeln Datenbankprogrammierung 2

Ähnliche Java Themen

Neue Themen


Oben