使用 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。
我有一个用户无权访问的数据库。 我仍然可以访问数据库和 "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。