我有一个用户无法访问的数据库。 我仍然可以去数据库"阅读"例如
的文件 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();
答案 0 :(得分:1)
创建一个XAgent(= XPage而不渲染),它将datebase + documentid + filename作为URL参数,并将该文件作为响应OutputStream传递。
网址为
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-File写入OutputStream。
您可以将附件直接从文档流式传输到响应的OutputStream,而不是将附件文件提取到路径并从中读取它。这是一个XSnippet from Naveen Maurya作为一个很好的例子。
答案 1 :(得分:0)
如果您可以将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
一旦你拥有了它,你就可以遍历所有的embeddedObjects并获得pdf文件。在这一点上,我不知道你是否可以直接流式传输它,或者如果你必须将它分离,但假设你将其分离,你将使用这样的东西。
File file = new File("path to file");
FileInputStream fileIn = new FileInputStream(file);
不要忘记清理暂时分离的文件