使用 sessionAsSigner 打开 pdf 文件

open pdf file with sessionAsSigner

我有一个用户无权访问的数据库。 我仍然可以访问数据库和 "read" 文档,例如

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

在此数据库中有一个我想打开或下载的 pdf 文件。我有文件名和 unid 。如果用户有权访问数据库,我可以使用

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

如何在不在表单上放置 $PublicAccess=1 字段的情况下使用 sessionAsSigner 做到这一点?

编辑: pdf 文件作为 附件存储在 richtextfield

第二次编辑

我正在尝试使用 Naveen 的 XSnippet 并进行了一些更改

我收到的错误消息是:'OutStream' 未找到

我试过的代码是:

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

下一行是问题

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

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


downloadDocument.recycle();

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

如果您可以将 PDF 文件作为流获取,则应该可以使用外部上下文响应的 OutputStream。

Stephan Wissel 发表了一篇关于写出 ODF 文件的博文,因此您应该能够将其作为起点。

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

您已经有了数据库,所以您只需要知道文档的 UNID。

var doc = db.getDocumentByUNID(unid) 'unid is a supplied param
var itm:RichTextItem = doc.getFirstItem("Body") 'assuming file is in body field

获得 itm 后,您可以循环所有 embeddedObjects 并获取 pdf 文件。在这一点上,我不知道你是否可以直接流式传输它或者是否必须分离它,但假设你分离它,你将使用类似这样的东西。

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

不要忘记清理临时分离的文件

创建一个 XAgent(= 没有呈现的 XPage),它将 datebase + documentid + 文件名作为 URL 参数并将文件作为响应 OutputStream 传递。

URL 会是

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

对于数据库 download.nsf 中的 XAgent download.xsp。

XAgent 背后的代码作为 sessionAsSigner 运行并且能够读取文件,即使用户本身无权访问文件的数据库。

使用 Eric's blog (+ Java code) 作为起点。将 "application/json" 替换为 "application/pdf" 并流式传输 pdf 文件而不是 json 数据。

作为替代方案,您可以修改此 XSnippet code from Thomas Adrian。使用 download()grabFile() 将您的 pdf 文件写入 OutputStream。

您可以将附件直接从文档流式传输到响应的 OutputStream,而不是将附件文件提取到路径并从那里读取。这是一个很好的例子 XSnippet from Naveen Maurya