使用sessionAsSigner打开pdf文件

时间:2016-06-23 08:06:27

标签: java xpages xpages-ssjs

我有一个用户无法访问的数据库。 我仍然可以去数据库"阅读"例如

的文件

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();

2 个答案:

答案 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);

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