もう 1 つのオプションは、XAgent を使用することです。たとえば、beforeRenderResponse
イベントを次のように設定します。
var fileDb = sessionAsSigner.getDatabase((param.server || ""), param.path);
var fileDocument = fileDb.getDocumentByUNID(param.id);
var attachment = fileDocument.getAttachment(param.filename);
var inputStream = attachment.getInputStream();
var response = facesContext.getExternalContext().getResponse();
/* The following MIME type is generic, should work for all image types;
If you know what type the image will be, set a more specific MIME type */
response.setContentType("application/octet-stream");
var outputStream = response.getOutputStream();
com.acme.xsp.util.StreamUtil.copyStream(inputStream, outputStream);
inputStream.close();
outputStream.close();
attachment.recycle();
fileDocument.recycle();
facesContext.responseComplete();
com.acme.xsp.util.StreamUtil
あるストリームを別のストリームにパイプライン処理するための Java コンビニエンス クラスを参照します。
public class StreamUtil {
public static void copyStream(InputStream input, OutputStream output) throws IOException {
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = input.read(buffer)) != -1) {
output.write(buffer, 0, bytesRead);
}
}
}
したがって、画像タグを添付ファイルに直接リンクする代わりに、次のようになります。
<xp:image url="/download.xsp?server=ACME01&path=images.nsf&id=OU812&filename=photo.jpg" />
このアプローチでは、他のオプションも提供されます。特定のファイルがアクセスされた回数のログ記録、リファラー URL (Google で画像を検索するときに時々表示される「ホットリンクなし」の画像置換を実装する場合)、または実際に必要なもの.
具体的な例として、約 10 年前、ある同僚が、サイトのすべてのページの会社のロゴにこの手法を使用していたため、JavaScript をサポートしていないブラウザーでも機能する、Google アナリティクスに相当する基本的な社内ツールを実装しているのを見ました。ロゴ JPG に直接リンクする代わりに、彼は IP、リファラー、ユーザー エージェントなどを取得する PHP ファイルにリンクし、すべてのメタデータを MySQL データベースに書き出し、最後にロゴのバイトをブラウザーにストリーミングしました。これは明らかに、あなたが達成しようとしているように聞こえるものの範囲外ですが、XPages ではこのタイプのユースケースがかなり単純になっていることに興味を持っていただけるのではないかと思いました。