1

在 IBM Domino Server(Win32 平台上的 8.5.3FP1 版本)上有两个 Web 代理,用于根据请求生成 PDF 和 RTF 文件。

每个代理在临时文件夹中生成 RTF 或 PDF 文件,然后打开OutputStream实例以将此文件写入客户端(浏览器,当保存文件对话框出现时)。

一切正常。文件生成并正确保存在临时文件夹中。但是将这些文件写入OutputStream让用户将其保存到本地磁盘,它不能正常工作。一些文件写入正常(小文件,~11Kb),但较大的文件,~34K 被部分保存(有时保存 276 字节,有时保存 4K 字节等)。

我在代理中得到 OutputStream,如下所示:

final OutputStream os = this.getAgentOutputStream();

生成并保存文件时,我使用:

final FileInputStream fis = new FileInputStream(pdfFilePath);
IOUtils.copy(fis, os); // it is from Apache Commons IOUtils
fis.close();

不工作。

然后我改用这种方式:

final byte[] resultArray = FileUtils.readFileToByteArray(new File(pdfFilePath)); // result array has correct length and correct contents
os.write(resultArray);
os.flush();
os.close();

不工作。

然后我改用这种方式(很棘手,但仅用于实验目的):

final byte[] resultArray = FileUtils.readFileToByteArray(new File(pdfFilePath)); // result array has correct length and correct contents
for (byte a:resultArray) {
    os.write(a);
}       

os.flush();
os.close();

做。不是。工作。

在将数据发送到输出流之前,我调用了:

java.io.PrintWriter pw = this.getAgentOutput();
pw.println("Content-type: application/pdf"); // also tried octet-stream, no effect
pw.println("Content-Disposition: attachment; filename=\"file.pdf\"");

伙计们,我的问题如下。我的方法有什么问题?我在这里做错了什么?文件已正确创建并保存在服务器上。输出流正确打开,文件正确读取。当我写入输出流时也不例外。输出流已正确刷新和关闭。

怎么了?我一整天都在尝试解决这个问题,但我没有找到任何线索。

有任何想法吗?

4

2 回答 2

1

似乎 Domino 的代理 OutputStream 存在错误。通过 via 获得的 StreamagentRef.getAgentOutputStream();无法正常工作并执行部分写入。

我决定不使用这种方式将文件附加到 NotesDocument 实例,将其保存并为用户提供此文档中附加文件的链接。

于 2012-12-24T06:51:06.220 回答
0

这也让我很沮丧,但幸运的是我能够找到另一种方法。

https://www.linkedin.com/pulse/writing-binary-data-from-notes-agent-arun-shankar

第 1 步:将字节数组转换为 JSON 数组字符串。

编写一个循环来创建一个带有字节数组的 JSON 数组字符串。

    byte[] pdfFile = pdf.getPDF();

ByteBuffer byteBuffer = ByteBuffer.wrap(pdfFile);

CharBuffer result =  Charset.forName("UTF-8").decode(byteBuffer);



PrintWriter agentPrintWriter = getAgentOutput();

agentPrintWriter.println("Content-type:application/pdf");

agentPrintWriter.println("Content-Disposition:attachment;filename=\"Report.pdf\"\n");



StringBuilder buffer = new StringBuilder();

buffer.append("[");

      for(int index=0;index<pdfFile.length;index++)

      {

            buffer.append(""+pdfFile[index]);

            if(index<pdfFile.length-1)

                  buffer.append(",");

      }

      buffer.append("]");



agentPrintWriter.println(buffer.toString());

上面应该生成一个表示 JSON 数组的字符串,如下所示。

“[37,80,68,70,45,49,46,52,10,49,32,48,32,111,98,106,10,60,60,….,10]”</p>

使用代理的 PrintWriter 实例写入此字符串。

第 2 步:使用接收到的数据创建一个 Blob 并打开它是附件

在客户端收到的数据将是一个 JSON 字符串。通过从中创建 Blob 对象,可以将其转换为字节数组并作为附件下载。

//Data Received from the AJAX Request

var byteArray = new Uint8Array(JSON.parse(data));

var blob = new Blob([byteArray], {type: "application/pdf"});

var blobUrl = URL.createObjectURL(blob);

window.open(blobUrl)

我仅在 Google Chrome 中测试了该解决方案,但我很确定它也适用于其他浏览器。

于 2016-08-19T13:32:08.540 回答