Autor Thema: xpage Bild von einem anderen Server holen  (Gelesen 3851 mal)

Offline HH

  • Senior Mitglied
  • ****
  • Beiträge: 339
  • Geschlecht: Männlich
xpage Bild von einem anderen Server holen
« am: 11.12.15 - 19:17:06 »
Hallo,

habe schon jede Menge gegoogled, aber keine Lösung zu meinem Problem gefunden:

Auf Server A (extern) befindet sich Datenbank A mit einer xpage, die Daten von Server B (intern) aus Datenbank B abruft. Das Ziel, das ich damit verfolge ist, keine Daten auf Server A zu halten. Zwischen den Servern ist lediglich Port 1352 offen.

Probleme bereiten mir dabei die Bilder in Datenbank B.

Wie kann man Bilder aus DB B in einer xpage auf Server A zur Anzeige bringen?

Gruß
Hubert


Offline pram

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.170
  • Geschlecht: Männlich
    • Foconis Object Framework
Re: xpage Bild von einem anderen Server holen
« Antwort #1 am: 12.12.15 - 00:43:58 »
Du musst die Bildresource von Server A auf Server B auslesen.

Damit Server A auf Server B zugreifen darf, muss Server A als vertrauenswürdiger Server ins Serverdokument B eingetragen

Optimal wäre hier ein Servlet, es sollte aber auch mit einer XPage ohne allzugroße Performanceeinbußen gehen.
Technisch liest du die Daten über "com.ibm.designer.domino.napi.design.FileAccess.readFileContent" ein und schickst sie zum Browser

Bei Sven Hasselbach hab ich da auf die Schnelle folgendes gefunden:

loadBinaryFile zum Auslesen der Datei:
=> https://github.com/hasselbach/domino-napi-utils/blob/master/src/ch/hasselba/napi/NAPIUtils.java
=> http://hasselba.ch/blog/?p=1763

Schreiben einer Bilddatei in den ServletOutputstream
=> http://hasselba.ch/blog/?p=871

Möglicherweise könnte untenstehendes Beispiel sogar schon funktionieren (habs nicht getestet)

Gruß
Roland
Code
<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core" rendered="true">

   <xp:this.afterRenderResponse>
      <![CDATA[#{javascript:
         importPackage( ch.hasselba.napi );
         var exCon = facesContext.getExternalContext();
         var response = exCon.getResponse().getDelegate();
         var imageStream = NAPIUtils.loadBinaryFile("server","db.nsf","image.jpg")
         response.setContentType("image/jpg");
         var out= response.getOutputStream();

         var buffer = new byte[32 * 1024];
         while (true) {
           var r = imageStream.read(buffer);
           if (r == -1) {
             break;
           }
           out.write(buffer, 0, r);
         }
         imageStream.close();
      }]]>
   </xp:this.afterRenderResponse>
</xp:view>
Roland Praml

IBM Certified Application Developer - Lotus Notes and Domino 8
Ich verwende das Foconis Object Framework

Offline HH

  • Senior Mitglied
  • ****
  • Beiträge: 339
  • Geschlecht: Männlich
Re: xpage Bild von einem anderen Server holen
« Antwort #2 am: 12.12.15 - 19:20:59 »
Hallo Roland,

erst einmal herzlichen Dank für die Antwort. Leider habe ich in Sachen Java quasi Null Erfahrung. Den Quellcode in den Links verstehe ich zwar, es scheitert bei mir allerdings an der vermutlich simplen Umsetzung.

Wie bzw. wo muss ich die erforderlichen .jar Dateien importieren / einbinden?

Gruß
Hubert

Offline pram

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.170
  • Geschlecht: Männlich
    • Foconis Object Framework
Re: xpage Bild von einem anderen Server holen
« Antwort #3 am: 13.12.15 - 14:02:02 »
Hallo Hubert,

um Java wirst du hier vermutlich nicht herum kommen. Ein paar Fragen hätte ich noch im Vorfeld:
- Die Bilder liegen in der anderen DB als Bildresource und nicht als Anhang im Dokument, richtig?
- Wie ist denn deine Erfahrung bzgl. XPage + ServerSide-Javascript

Den Java-Code musst du unter Code/Java ablegen. Siehe hier Seite 90:
http://www.assono.de/blog/downloads/EC12-Java-Notes-Domino-XPages-PDF/$file/EC12-Java-Notes-Domino-XPages.pdf

Noch eine Warnung: Ich habe in meinem Ursprungspost noch geschrieben "ohne allzugroße Performanceeinbußen":
Bei XPages ist es leider so, dass die Requests pro User nacheinander abgearbeitet werden. D.h. sind auf einer Seite 5 Bilder gleichzeitig, so werden diese nacheinander geladen. Je nach dem wie schnell/langsam deine Port1352 Verbindung ist, kann das doch beachtliche Auswirkungen haben.
=> Hier musst du dann wirklich ein Servlet schreiben, dies hat diese Begrenzung nicht.


Gruß
Roland
Roland Praml

IBM Certified Application Developer - Lotus Notes and Domino 8
Ich verwende das Foconis Object Framework

Offline HH

  • Senior Mitglied
  • ****
  • Beiträge: 339
  • Geschlecht: Männlich
Re: xpage Bild von einem anderen Server holen
« Antwort #4 am: 13.12.15 - 18:13:45 »
Hallo Roland,

hab's dank deiner Hinweise mit Bildresourcen hinbekommen.

Die Bilder liegen allerdings nicht als Bildresourcen vor, sondern als Anhänge. Hier wäre ich für einen Hinweis dankbar, wie ich an die herankomme.

Ursprünglich komme ich aus der nativen Notes-Entwicklung mit @functions und LotusScript (knapp 20 Jahre). Ich beschäftige mich ca. seit einem Jahr sporadisch mit xpages und damit auch mit SSJS. Leider bin ich hier als Domino-Entwickler Einzelkämpfer und stosse somit sehr schnell an meine Grenzen. Umso dankbarer bin ich für Deine Antworten.

Gruß
Hubert

Offline pram

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.170
  • Geschlecht: Männlich
    • Foconis Object Framework
Re: xpage Bild von einem anderen Server holen
« Antwort #5 am: 14.12.15 - 01:05:05 »
Gut, durch die LotusScript-Kenntnisse weißt du schon mal wie Notes "tickt".

Du kommst an die Attachments über "currentDocument.embeddedObjects"
Da die Bilder jetzt aber als Attachment vorliegen ist mir noch eingefallen, dass es bereits ein Servlet für Anhänge gibt, welches der CK-Editor verwendet.
Du musst halt die URL zu fuß berechnen(http://stackoverflow.com/questions/21750296/calculating-url-of-an-image-resource)

mit folgender URL "http://server_a.dnsdomain.de/datenbank_a.nsf/xsp/.ibmmodres/domino/OpenAttachment/server_b/NOTESDOMAIN!!datenbank_b.nsf/<32STELLIGE-DOC-UNID>/body/<name_bild.jpg>
" kannst du direkt auf das Attachment im "body" Feld zugreifen. (habe ich getestet)
Allerdings bin ich mir nicht sicher, ob der ContentType da stimmt, da beim Aufruf der URL mein Browser immer den Speichern-Dialog anzeigt.
Evtl. gibst auch mal ein Dokument mit einem XPage-Richtextfeld aus und schaust wie die URL da lautet

Gruß
Roland
Roland Praml

IBM Certified Application Developer - Lotus Notes and Domino 8
Ich verwende das Foconis Object Framework

Offline HH

  • Senior Mitglied
  • ****
  • Beiträge: 339
  • Geschlecht: Männlich
Re: xpage Bild von einem anderen Server holen
« Antwort #6 am: 14.12.15 - 11:50:56 »
Hallo Roland,

hab's nun mit deinem Hinweis auch mit attachments hinbekommen. Hier der Code in meinem berechneten Feld (innerhalb eines repeat controls):

Code
var doc:NotesDocument = document1.getDocument() ;
if( doc.hasItem("$File"))
{
	var uid:String = doc.getUniversalID() ;
	var protocol:String = context.getUrl().getScheme() ;
	var host:String = context.getUrl().getHost() ;
	var currentDb:String = database.getFilePath() ;
	
	var sourceDb:NotesDatabase = doc.getParentDatabase() ;
	var nn:NotesName = session.createName( sourceDb.getServer() ) ;
	var strSourceDb:String = nn.getCommon() + "!!" + sourceDb.getFilePath() ;
	
	var bildUrl:String = protocol + "://" + host + "/" + currentDb + "/xsp/.ibmmodres/domino/OpenAttachment/" + strSourceDb + "/" + uid + "/$file/ContactPhoto" ;
	return "<img src=\"" + bildUrl + "\" />" 
}
else
{
	return "" ;
}

Der Name der Bilddateien lautet für alle Dokumente "ContactPhoto".

Die Angabe der Notesdomain ist nicht erforderlich (obwohl unterschiedlich). Ich denke, dass sich lediglich die Server vertrauen müssen.

Nochmals herzlichen Dank für deine Bemühungen!

Gruß
Hubert

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz