1

IBM Domino サーバー (Win32 プラットフォームのバージョン 8.5.3FP1) には、要求に応じて PDF ファイルと RTF ファイルを生成するための 2 つの Web エージェントがあります。

すべてのエージェントは 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 にバグがあるようです。経由で取得したストリームagentRef.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 に答える