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



## ebruss17 (5. Feb 2015)

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...

```
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>


----------



## ebruss17 (5. Feb 2015)

Kann mir denn niemand befhilflich sein?? :/


----------



## Dompteur (6. Feb 2015)

Versuche es einmal damit (ab Zeile 40) :

```
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 (6. Feb 2015)

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


```
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 (6. Feb 2015)

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.


----------



## ebruss17 (6. Feb 2015)

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


```
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 (6. Feb 2015)

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 (6. Feb 2015)

....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 (6. Feb 2015)

ä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 (6. Feb 2015)

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

 <%



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

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


----------



## Dompteur (6. Feb 2015)

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 (6. Feb 2015)

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 (6. Feb 2015)

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 (6. Feb 2015)

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



```
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'))
```


----------



## Dompteur (6. Feb 2015)

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 (6. Feb 2015)

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 (6. Feb 2015)

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: 


```
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.


----------



## ebruss17 (6. Feb 2015)

ich habe das jetzt mal so umgesetzt, wie du es angegeben hast: Bei 
	
	
	
	





```
String readFile(String path)
```
 steht jedoch irgendwas mit Syntaxfehler verstehe aber nicht warum????:bahnhof:


```
<%
		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>
```


----------



## Dompteur (6. Feb 2015)

ebruss17 hat gesagt.:


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


Ich schreibe von unterwegs und habe daher keinen Compiler dabei, um das zu kontrollieren.
Was für einen Fehler bekommst du?


----------



## Joose (6. Feb 2015)

ebruss17 hat gesagt.:


> 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 (6. Feb 2015)

da wird keine exception ausgegeben, sondern links an der Zeile 
	
	
	
	





```
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 (6. Feb 2015)

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 (6. Feb 2015)

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 (6. Feb 2015)

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.


----------

