2016-06-23 14 views
1

Ich habe eine Datenbank, auf die der Benutzer keinen Zugriff hat. Noch kann ich in die Datenbank gehen und „lesen“ die Dokumente mit zum BeispielPDF-Datei mit sessionAsSigner öffnen

var db:NotesDatabase = sessionAsSigner.getDatabase("","somedir/some.nsf");

In dieser Datenbank eine PDF-Datei gibt es würde ich öffnen oder herunterladen möchten. Ich habe den Dateinamen und die Unid. Wenn der Benutzer Zugang zu der Datenbank hatte ich es tun konnte mit

http(s)://[yourserver]/[application.nsf] /xsp/.ibmmodres/domino/OpenAttachment/ [application.nsf]/[UNID|/$File/[AttachmentName]?Open 

Wie kann ich es tun mit sessionAsSigner ohne auf dem Formular ein $ Public = 1 Feld zu setzen?

edit: die pdf-Datei als Anlage in einem richtextfield

zweiten bearbeitet gespeichert

Ich versuche, die XSnippet von Naveen zu verwenden und machte einige Änderungen

Die Fehlermeldung, die ich bekomme ist: 'OutStream' nicht gefunden

Der Code habe ich versucht, ist:

response.reset(); 
response.setContentType("application/pdf"); 
response.setHeader("Content-Disposition", "inline; filename=" + zipFileName); 

var embeddedObj:NotesEmbeddedObject = null; 
var bufferInStream:java.io.BufferedInputStream = null; 
var outStream:java.io.OutputStream = response.getOutputStream(); 

embeddedObj = downloadDocument.getAttachment(fileName); 
    if (embeddedObj != null) { 
    bufferInStream = new  java.io.BufferedInputStream(embeddedObj.getInputStream()); 
    var bufferLength = bufferInStream.available(); 
    var data = new byte[bufferLength]; 
    bufferInStream.read(data, 0, bufferLength); // Read the attachment data 

auf der nächsten Zeile ist das Problem

OutStream.write(data); // Write attachment into pdf 

bufferInStream.close(); 
embeddedObj.recycle(); 
    } 


downloadDocument.recycle(); 

outStream.flush(); 
outStream.close(); 
facesContext.responseComplete(); 
+0

Ändern Sie Ihre Zeile in 'outStream.write (data); '- var outStream beginnt nicht mit einem Großbuchstaben. –

+0

Ja, dein Recht. Es funktioniert jetzt. Vielen Dank ! –

Antwort

1

eine XAgent erstellen, um aufzuräumen (= XPage ohne Rendering), die Datenbank + nimmt documentid + Dateinamen als URL-Parameter und liefert die Datei als Antwort Output.

würde die URL

http(s)://[yourserver]/download.nsf/download.xsp?db=[application.nsf]&unid=[UNID]&attname=[AttachmentName] 

für eine XAgent download.xsp in einer Datenbank download.nsf sein.

Der Code hinter dem XAgent wird als sessionAsSigner ausgeführt und kann die Datei lesen, selbst wenn der Benutzer selbst nicht berechtigt ist, auf die Dateidatenbank zuzugreifen.

Verwenden Sie Eric's blog (+ Java code) als Ausgangspunkt. Ersetzen Sie "application/json" durch "application/pdf" und streamen Sie die PDF-Datei anstelle von json-Daten.

Als Alternative können Sie diese anpassen. Verwenden Sie download() zusammen mit grabFile(), um Ihre PDF-Datei in OutputStream zu schreiben.

Anstatt die Anhangsdatei zum Pfad zu extrahieren und von dort zu lesen, können Sie den Anhang direkt aus dem Dokument in den OutputStream der Antwort streamen. Hier ist ein XSnippet from Naveen Maurya als ein gutes Beispiel.

+0

Ich sehe, wie ich Daten in JSON in diesem Blog konvertieren kann, aber ich verstehe nicht, wie Sie den Code ändern, um die PDF-Datei zu streamen und sie als sessionAsSigner auszuführen. Könntest du mir dabei helfen? –

+0

Ich habe einige Java-Code-Links zu meiner Antwort hinzugefügt. Ich hoffe es hilft. –

+0

funktioniert der Code von Naveen gut. Irgendeine Idee, wie man den Code ändert, um ihn in pdf statt in zip zu speichern? Ich muss diese Zeile in response.setContentType ("application/pdf") ändern; aber was muss ich im "lLoop durch alle anhänge" ändern, um die pdf statt einer zip-datei zu bekommen? –

0

Wenn Sie die PDF-Datei als Stream zu bekommen, sollten Sie in der Lage sein, den Output von verwenden die Antwort des externen Kontextes.

Stephan Wissel hat einen Blog-Eintrag über das Schreiben einer ODF-Datei, so dass Sie in der Lage sein sollten, als Ausgangspunkt zu schneiden.

http://www.wissel.net/blog/d6plinks/SHWL-8248MT

Sie bereits die DB so haben, werden Sie brauchen nur die UNID des Dokuments kennen.

Sobald Sie die itm haben, können Sie alle embeddedObjects durchlaufen und erhalten Sie die PDF-Datei. Zu diesem Zeitpunkt weiß ich nicht, ob Sie es direkt streamen können oder ob Sie es trennen müssen, aber wenn Sie es abtrennen, werden Sie dann etwas wie dieses verwenden.

File file = new File("path to file"); 
FileInputStream fileIn = new FileInputStream(file); 

Vergessen Sie nicht, die vorübergehend freistehende Datei

+0

Das Problem bleibt gleich, denke ich. In diesem Fall würde die Frage lauten: "Wie bekomme ich einen Griff zur PDF-Datei als Stream?" Ich denke, korrigiere mich, wenn ich falsch liege. In diesem Blog geht es mehr um das Rendern oder Speichern in einem anderen Format. Meine Frage ist mehr: Wie bekomme ich die PDF-Datei –

+0

EmbeddedObject hat eine Methode getAsStream(). Sie verwenden das, um den Eingangsstrom zu erhalten, und dann entweder Guava oder Apache commons, um das in die response.getOutputstream – stwissel

+0

zu kopieren Könnten Sie mir helfen, den Xsnippet zu ändern, um die pdf statt einer pdf in einer Zip-Datei zu erhalten? –