Jackrabbit

Michimitsu

Bekanntes Mitglied
Hallo alle zusammen,

ich habe folgendes Problem, ich habe eine Datei ins Jackrabbit repository hochgeladen und jetzt möchte ich herausfinden ob ich datei wirklich gespeichert hatte. Also wollte ich ganz einfach die Datei auslesen und woanders hin speichern um das zu überprüfen.

Java:
Item item = session.getItem("/"+nodeName+"/"+fileName);
byte[] dateiinhalt = item.getPath().getBytes();

Da das ganze ein Item ist musste ich das erstmal in ein byte array umwandeln. Wie ist es möglich das byte array jetzt auf meinem Pc als datei zu speichern ??

Danke schonmal für die Hilfe:)
 

swp

Mitglied
Erstmal solltest du statt "/" lieber File.separator nutzen, das ist dann plattformunabhängig.

Abspeichern des Dateiinhalts geht so:

Java:
try {
  FileOutputStream fos = new FileOutputStream("/Pfad/zur/Datei"); // Stream aufmachen
  fos.write(dateiinhalt); // Bytearray in Schreibpuffer schreiben
  fos.flush(); // Puffer in Datei übertragen und leeren
  fos.close(); // Datei schließen
} catch(FileNotFoundException e) {
  // Handlen, wenn die Datei nicht angelegt werden kann
} catch(IOException e) {
  // Handlen, wenn anderweitige I/O-Fehler auftreten
}
 

Michimitsu

Bekanntes Mitglied
Also funktionieren tut es schonmal ... nur das die datei nicht gespeichert wird sondern der Pfad aus dem Repository :(

Hast du da auch vielleicht noch eine Idee wie ich das da reinbekomme ??

Java:
Item item = session.getItem("/"+nodeName+"/"+fileName);
byte[] dateiinhalt = item.getPath().getBytes();

So scheint es ja nicht zu gehen. Ich hab eine Item und müsste das irgendwie vernünftig umformen.
 

swp

Mitglied
Das "item.getPath()" scheint auch den Pfad zurückzugeben und nicht den Inhalt. Gibt es irgendeine Methode, um an den Inhalt des Items zu kommen?
 

Michimitsu

Bekanntes Mitglied
unter item nicht wirklich ... aber es gibt unter session sowas

Java:
session.exportSystemView(absPath, contentHandler, skipBinary, noRecurse);
session.exportDocumentView(absPath, contentHandler, skipBinary, noRecurse);
 

swp

Mitglied
Dann musst du diesen Inhalt mit den entsprechenden Methoden in ein Byte-Array konvertieren und dann wie oben abspeichern. Wie das genau aufgebaut ist, weiß ich bei Jackrabbit nicht - du musst jedenfalls den Inhalt der Datei als Byte-Array bekommen.
 

Wildcard

Top Contributor
Du hast den Inhalt der Datei vermutlich in ein binäres Property gespeichert.
Normalerweise nimmt man eine nt:resource um Dateien abzulegen. Wenn du eine solche verwendet hast gibt es ein binäres Property jcr:data. Du lässt dir dieses Property geben und liest anschließend den InputStream aus.
Einfacher hättest du es allerdings wenn du einen DataStorage in deinem Repository konfigurierst, dann landet die Datei nämlich nicht als BLOB in der DB, sondern wird als echte Datei (mit dem Hashwert als Name) ins Dateisystem geschrieben.
 

Michimitsu

Bekanntes Mitglied
Java:
Session session = createJackrabbitSession();

		String mimeType = new MimetypesFileTypeMap().getContentType(file);
		if (mimeType == null)
			mimeType = "application/octet-stream";

		Node fileNode = session.getRootNode().getNode(nodeName).addNode(fileName, "nt:file");


		Node resNode = fileNode.addNode("jcr:content", "nt:resource");
		resNode.addMixin("mix:versionable"); //set node mixin type  
		//resNode.setProperty("jcr:versionLabels", file.getName());
		resNode.setProperty("jcr:mimeType", mimeType);
		resNode.setProperty("jcr:encoding", "");
		resNode.setProperty("jcr:data", new FileInputStream(file));
		Calendar lastModified = Calendar.getInstance();
		//        lastModified.setTimeInMillis(file.lastModified());
		resNode.setProperty("jcr:lastModified", lastModified);


		session.save();

Hier ist der QuellCode fürs Abspeichern vllt. entdeckt ihr da schon eine unkluge strategie ... ich bin offen für andere Methoden um die Daten hochzuladen.
 

Michimitsu

Bekanntes Mitglied
Ich verstehe nicht ganz was du meinst .. kannst du mir das vielleicht deuttlichr erklären.
Und meine Inforamtionen beziehe ich aus google.
 

Michimitsu

Bekanntes Mitglied
ja, meist kommt man über google auch auf solche seiten. Ich meine es funktioniert ja auch mein Problem ist ich möchte nochmal sehen das es funktioniert, quasi eine datei rausholen und die woandes hinspeichern.
 

Wildcard

Top Contributor
Ich verstehe wirklich nicht was daran so unverständlich sein soll. Es funktioniert genau so wie das Schreiben
Java:
Property binaryProperty = resNode.getProperty("jcr:data");
InputStream in = binaryProperty().getBinary().getStream();
 

Michimitsu

Bekanntes Mitglied
Java:
Property binaryProperty = resNode.getProperty("jcr:data");
		InputStream in = binaryProperty.getBinary().getStream();
		OutputStream out = new FileOutputStream("C:/Users/Admin/newNodeFile.txt");

		try {
			int sharedData = in.read(zwischenSpeicher);

			

			out.write(sharedData);

			return true;
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return false;

so gibt er mir irgendwie einen fehler aus, wobei es vorhin noch ansatzweise ging ... hatte aber immer nur den ersten buchstaben der textdatei wiederholt ins neue document gespeichert
 
G

Gelöschtes Mitglied 5909

Gast
da du nir einen in/char aus dem stream liest und wieder schreibst ist es klar dass er nur einen buchstaben schreibt.

Java:
private static void copy(InputStream in, OutputStream out) throws IOException {
 byte[] b = new byte[1024];
 int read;
 while ((read = in.read(b)) != -1) {
  out.write(b, 0, read);
 }
}

und welchen fehler? *aus der nase zieh*
 

Michimitsu

Bekanntes Mitglied
Java:
Exception occurred during event dispatching:
java.lang.NullPointerException
	at java.io.InputStream.read(InputStream.java:85)
	at de.docimport.jackrabbit.JackrabbitConnector.uploadFile(JackrabbitConnector.java:182)

und damit verweist er auf die zeile ...

Java:
int sharedData = in.read(zwischenSpeicher);
 

Michimitsu

Bekanntes Mitglied
Ich sag einfach mal ein dickes danke an rail ich hab deine methode verwendet und jetzt funktioniert das alles super ... jetzt bin ich mir auch sicher das die datein wirklich ins repository geladen werden :) Vielen Dank.
 
G

Gelöschtes Mitglied 5909

Gast
Auch wenn ich mich mit Jackrabbit nicht auskenne, würde ich sagen genauso wie dus bisher gemacht hast nur mit dem entsprechendem mimetype (z.B. image/jpeg).
 

Wildcard

Top Contributor
ich brauchte sogar nichtmal den mimetyp ändern, habs nur in eine bmp statt der txt gespeichert

Brauchst du nicht, solltest du aber, sonst weißt du später evtl. nicht mehr das es sich um ein Bild handelte. Ausserdem ist es für die Indexierung besser, da Jackrabbit sonst nicht den richtigen Text Extractor auf die Datei loslassen kann.
 

Michimitsu

Bekanntes Mitglied
Ich denke mal ich muss nicht dafür sorgen weil er sich den passneden mimetyp selber raussucht.

Java:
 String mimeType = new MimetypesFileTypeMap().getContentType(file);
        if (mimeType == null)
            mimeType = "application/octet-stream";
 

Michimitsu

Bekanntes Mitglied
Auf der ersten Seite beitrag 8 siehst du mein kompletten code dazu, wie bzw. wo könnt ich das denn da ändern ??

und noch eine frage zu dieser Zeile hier :

Java:
resNode.setProperty("jcr:data", new FileInputStream(file));
dort sagt er mir is depreacated, er sagt aber nicht wie das jetzt gemacht wird, weißt du ne lösung oder soll ich das deprecated einfach lassen
 
Zuletzt bearbeitet:

Michimitsu

Bekanntes Mitglied
Mir fällt grade auf der ich den Benutzter sowieso bei der Dateiauswahl eingeschränkt habe, er darf sich nämlich nur zwischen (txt,pdf,doc,Jpg,gif,tif,png und bmp) entscheiden darf... könnte es trotzdem zu problemen kommen ?
 

Wildcard

Top Contributor
dort sagt er mir is depreacated, er sagt aber nicht wie das jetzt gemacht wird, weißt du ne lösung oder soll ich das deprecated einfach lassen
Steht in der API Doc der Methode.
Mir fällt grade auf der ich den Benutzter sowieso bei der Dateiauswahl eingeschränkt habe, er darf sich nämlich nur zwischen (txt,pdf,doc,Jpg,gif,tif,png und bmp) entscheiden darf... könnte es trotzdem zu problemen kommen ?
Niemand hindert den Nutzer daran ein PDF *.doc oder *.foobar zu nennen. Musst du entscheiden ob das für dich ein Problem ist, oder nicht.
 

Michimitsu

Bekanntes Mitglied
nun ja wenn der Benutzter ein txt datei von anfang an als jpg angibt dann lädt er natürlich eine fehlerhafte datei hoch ... aber ich glaube das ist nicht so schlimm
 

Neue Themen


Oben